只需用4个颜色通道表示对象
在游戏中,关卡数据以压缩格式存储,通常,每个对象用两个字节来描述位置和类型。
一个字节指定16x16网格中的xy坐标;第二个字节指定对象的类型。比如在第一关的场景中,仅用了12个字节来描述:
07 81 | 47 24 | 57 00 | 63 01 | 77 01 | C9 71
作者为了将关卡编码为16x16的图像,分别设置了4个独立颜色通道:
比如,第一关的截图,就可以表示成这样:
这样的编码方式,既能够涵盖足够多的对象,又不至于太过复杂。
并且,根据关卡中对象的排列方式进行分组,有利于模型进行学习并重现。比如,实心砖用于布置楼梯、砖块则通常水平放置。
此外,将所有对象组织成一个合理的方案,减少生成网络失误对输出结果的负面影响。
比如用硬币代替砖块,影响非常小;而如果用管道或库巴来代替,就会出现问题。
开发者还找出了游戏的一些特点:
管道可以连接地面或一排浮动块;
方块通常用来构建各种尺寸的楼梯;
砖块和问题块,大多排在第3位和第7位;
其他角色一般会分成两三组。
接下来,作者使用TensorFlow作为后端,利用Keras来构建模型,并进行训练。
生成器通过输入的一组特征向量,来生成新的样本图像;鉴别器则区分是训练集中的真实图像,还是生成器伪造的。
随着遍历训练集的次数增加,生成效果也逐渐改善:
最终输出的结果,是这样的: