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
代表迷宫的墙体。
而游戏描述则由四大块指令组成。以下使塞尔达传说的一个示例:
LevelMapping
定义了如何将对应字符从关卡描述映射到对象。例如1
可以映射到monster
类。SpriteSet
定义了对象类,都是由一个抽象类VGDLSprite
派生出来的。对象类以树的形式 (使用缩进)来组织,子类将会继承其父类的属性。例如玩家的avatar
类中就有两个子类,其中一个是得到钥匙的,另一个没有。所有的类都可以使用关键字参数,例如key
和goal
就是用了不同的color
参数,都具有相同的Immovable
参数。InteractionSet
定义了当两个对象碰撞时将会发生的潜在事件。这些互动由事件方法定义,也可以使用参数。例如,sword
可以击杀monster
,monster
可以击杀玩家,没有对象可以穿透walls
,当林克找到key
对象时,avatar
类将会转换。TerminationSet
定义了游戏结束的不同方法,每一行都是一个结束评判。例如,是否到达goal
。
还有一些其他的设置例如:
- 物理类型 :continuous, grid based, friction, gravity, …
- 移动动态:straight, random motion, player-control, …
- 互动作用:bouncing, destruction, spawning, transforming, …
特性
- 生成,克隆和消除对象,从一种类型转换到另一种
- 自走式对象运动,采取一致或随机的动作,或者不规律变化
- 非确定性的追赶和逃避行为
- 根据用户操作或碰撞效果触发的固定或随机时间表在任意对象位置生成的发射对象
- 粘性,即一个物体拉动另一个物体
- 其他对象或屏幕边缘的跳动和环绕行为
- 将物体传送到固定或随机的终端位置
- 连续的物理效应,例如惯性,摩擦和重力
- 随机影响,例如沿当前方向滑动或阵风
语法
pyVGDL
是基于 Python语言本身。游戏描述必须严格保持一个树形结构,更类似于XML 样式。
整个解析器包含了游戏描述和关卡描述的解析。解析和初始化在一秒之内完成,基本可以使游戏马上可玩。
解释器和接口
- 玩家类型:支持玩家直接用键盘参与,以及机器人调用接口。接口符合
PyBrain
机器学习库的Agent/Environement/Task
模型,通过getSensors
和performAction
方法来进行互动。 - 玩家数量:支持单人(目前已支持多人)
- 视角:默认游戏以鸟瞰视角游玩,而且全地图可见。我们也提供了第一人称视角,这样游戏将只有部分可见。
- 观察:它们可以以中等分辨率的图像或“干净”的形式在视觉上呈现,仅表示功能不同的组件。然而,强大的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,则游戏胜利