VGDL范例解读

Posted by Rasin on April 11, 2021

A Video Game Description Language for Model-based or Interactive Learning

Alians VGDL

VGDL论文

简介

pyVGDL 是一种视频游戏描述语言,以促进大型或多样化游戏组合的生成,这些游戏组合也可以用于评估具有通用性的体系结构和算法,例如强化学习和进化搜索。为了使这一目的更加可行,作者将游戏生成领域限制为2D街机风格游戏,其具有足够多样化的空间。

pyVGDL应该具有清晰易读明确的特性。其词汇应具有较高的表达力,比你更具有相当新颖的扩展性。其表示结构应该易于解析,可以自动生成游戏,默认设置和健全检查能够使大多数随机游戏描述真正可玩

pyVGDL 语言

基于Python语言和 pygame库开发。完整开源代码地址

整个游戏将限制在一个二维矩形空间内,所有游戏相关的对象都再此空间内。受全局或特定于对象的规则和玩家动作的影响,对象可以移动,与其他对象交互消失生成新对象

一个游戏分为两个部分:关卡描述描述了所有对象的位置和游戏2D布局; 游戏描述描述了游戏中所有动态和潜在的对象互动。

一个关卡描述的示例:具有固定的长,,用不同的符号代表不同的对象。例如:A代表在左上角生成的玩家,需要找到钥匙 +到目的地 G离开迷宫。通过避开或击杀怪物 1来完成关卡。其余的 w代表迷宫的墙体。

Figure 1

而游戏描述则由四大块指令组成。以下使塞尔达传说的一个示例:

Figure 2

  • LevelMapping 定义了如何将对应字符从关卡描述映射到对象。例如 1 可以映射到 monster 类。
  • SpriteSet 定义了对象类,都是由一个抽象类 VGDLSprite 派生出来的。对象类以树的形式 (使用缩进)来组织,子类将会继承其父类的属性。例如玩家的 avatar 类中就有两个子类,其中一个是得到钥匙的,另一个没有。所有的类都可以使用关键字参数,例如 keygoal 就是用了不同的 color参数,都具有相同的 Immovable 参数。
  • InteractionSet 定义了当两个对象碰撞时将会发生的潜在事件。这些互动由事件方法定义,也可以使用参数。例如,sword 可以击杀 monstermonster 可以击杀玩家,没有对象可以穿透 walls,当林克找到 key 对象时,avatar 类将会转换。
  • TerminationSet 定义了游戏结束的不同方法,每一行都是一个结束评判。例如,是否到达 goal

还有一些其他的设置例如:

  • 物理类型 :continuous, grid based, friction, gravity, …
  • 移动动态:straight, random motion, player-control, …
  • 互动作用:bouncing, destruction, spawning, transforming, …

特性

  • 生成,克隆和消除对象,从一种类型转换到另一种
  • 自走式对象运动,采取一致或随机的动作,或者不规律变化
  • 非确定性的追赶和逃避行为
  • 根据用户操作或碰撞效果触发的固定或随机时间表在任意对象位置生成的发射对象
  • 粘性,即一个物体拉动另一个物体
  • 其他对象或屏幕边缘的跳动和环绕行为
  • 将物体传送到固定或随机的终端位置
  • 连续的物理效应,例如惯性,摩擦和重力
  • 随机影响,例如沿当前方向滑动或阵风

语法

pyVGDL 是基于 Python语言本身。游戏描述必须严格保持一个树形结构,更类似于XML 样式。

Figure 4

整个解析器包含了游戏描述和关卡描述的解析。解析和初始化在一秒之内完成,基本可以使游戏马上可玩。

解释器和接口

  • 玩家类型:支持玩家直接用键盘参与,以及机器人调用接口。接口符合 PyBrain机器学习库的 Agent/Environement/Task模型,通过 getSensorsperformAction方法来进行互动。
  • 玩家数量:支持单人(目前已支持多人)
  • 视角:默认游戏以鸟瞰视角游玩,而且全地图可见。我们也提供了第一人称视角,这样游戏将只有部分可见。
  • 观察:它们可以以中等分辨率的图像或“干净”的形式在视觉上呈现,仅表示功能不同的组件。然而,强大的agent能够像人类一样识别视觉流。
  • 模型:我们提供了一种转换工具,可以将游戏动态转换为马尔可夫决策过程的完整转换矩阵 。这仅对状态组合不会爆炸增加的游戏是可行的。

VGDL 范例

Lunar Lander

Lunar Lander的游戏描述文件为:

BasicGame
    LevelMapping
        G > pad
    SpriteSet
        pad > Passive color=BLUE
        avatar > InertialAvatar physicstype=GravityPhysics
    InteractionSet
        avatar wall > killSprite
        avatar EOS > killSprite
        pad avatar > killIfSlow
    TerminationSet
        SpriteCounter stype=pad limit=4 win=True
        SpriteCounter stype=avatar win=False

其中之一的关卡描述文件为:

wwwwwwwwwwwwwwwwwwwwwwwwwwww
         w    w            w
     A    wwww              
                            
                            
                            
                      www   
                     wwww  w
        w        wwwwwwwwGGw
       wwwwwGGGwwwwwwwwwwwww
     wwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwww

从关卡描述中我们可以看出,A为玩家,G为降落地点,w 为墙体。

  • LevelMapping: G为降落地点
  • SpriteSet: pad 被设为蓝色,玩家avatar的物理类型是受到重力影响的。
  • InteractionSet:
    • avatar 碰到墙体即被摧毁
    • avatar 飞出游戏窗体外也被摧毁
    • avatar 碰到 pad 如果速度过快也被摧毁
  • TerminationSet: 由于总共落地点有五个,到达目的地会自动消除一个,因此剩下四格降落点时玩家胜利,否则失败。

Aliens

游戏描述文件为:

BasicGame square_size=32
    SpriteSet
        background > Immovable img=oryx/space1 hidden=True
        base    > Immovable    color=WHITE img=oryx/planet
        avatar  > FlakAvatar   stype=sam img=oryx/spaceship1
        missile > Missile
            sam  > orientation=UP    color=BLUE singleton=True img=oryx/bullet1
            bomb > orientation=DOWN  color=RED  speed=0.5 img=oryx/bullet2
        alien   > Bomber       stype=bomb   prob=0.01  cooldown=3 speed=0.8
            alienGreen > img=oryx/alien3
            alienBlue > img=oryx/alien1
        portal  > invisible=True hidden=True
        	portalSlow  > SpawnPoint   stype=alienBlue  cooldown=16   total=20 img=portal
        	portalFast  > SpawnPoint   stype=alienGreen  cooldown=12   total=20 img=portal

    LevelMapping
        . > background
        0 > background base
        1 > background portalSlow
        2 > background portalFast
        A > background avatar

    TerminationSet
        SpriteCounter      stype=avatar               limit=0 win=False
        MultiSpriteCounter stype1=portal stype2=alien limit=0 win=True

    InteractionSet
        avatar  EOS  > stepBack
        alien   EOS  > turnAround
        missile EOS  > killSprite

        base bomb > killBoth
        base sam > killBoth scoreChange=1

        base   alien > killSprite
        avatar alien > killSprite scoreChange=-1
        avatar bomb  > killSprite scoreChange=-1
        alien  sam   > killSprite scoreChange=2

其一关卡描述文件为:

1.............................
000...........................
000...........................
..............................
..............................
..............................
..............................
....000......000000.....000...
...00000....00000000...00000..
...0...0....00....00...00000..
................A.............

从描述文件我们可以看出:

  • LevelMapping:
    • . 为背景
    • 0为墙体(基地)
    • 1 为敌人产出生点
    • 2产生速度较快
    • A 为玩家
  • SpriteSet:
    • 背景不可移动,贴图位置为 oryx/space1,表现为隐藏不可互动
    • 基地不可以调动,颜色为白色,贴图位置 oryx/planet
    • 玩家属于 FlakAvatar类,子弹类型为 sam,贴图位置 oryx/spaceship1
    • 导弹属于 Missile 类,分为两种:
      • sam 是向上射击的,颜色为蓝色,全屏只能存在一个,贴图位置 oryx/bullet1
      • bomb 是向下掉落的,颜色为红色,速度限制为 0.5,贴图位置 oryx/bullet2
    • 敌人也有两种,属于Bomber类,子弹卫星为 bomb, 射击概率为 0.01,冷却时间为 3,速度为 0.8
      • 绿色敌人贴图 oryx/alien3
      • 蓝色敌人贴图 oryx/alien1
    • 传送点不可见,也不可互动
      • 慢速传送点产生蓝色敌人,冷却时间为 16,总计产生20个
      • 快速传送点产生绿色敌人,冷却时间为 12,总计产生20个
  • InteractionSet
    • 玩家飞出屏幕将会退格,即卡住不会前进
    • 机器人飞出屏幕则会反向继续前进
    • 子弹飞出屏幕则直接销毁
    • 如果基地碰到bomb则两个都被销毁
    • 如果基地碰到sam则两个都被销毁,加一分
    • 如果基地碰到敌人,基地被销毁
    • 如果玩家碰到敌人,玩家被摧毁,扣一分
    • 如果玩家碰到bomb,玩家被摧毁,扣一分
    • 如果敌人碰到sam,敌人被摧毁,得两分
  • TerminationSet
    • 如果玩家数量为0,即玩家被摧毁,游戏失败
    • 如果传送门和敌人的数量都为0,则游戏胜利