下台阶小游戏
学号:61010112
姓名:郭爱文
1、申请题目:挑战类游戏—你能下几层?
n 题目,命题描述(5号宋体)
这是一个基于FPGA,通过点阵板显示的趣味游戏,pc上已经有了相关的游戏产品,现在在点阵板上将其复原出来。
顾名思义,游戏是玩家控制自己的角色不断下台阶,下到一定层数后游戏胜利,触发一定条件则游戏失败。游戏中玩家通过键盘左右键控制控制角色的左右移动(这里用EF两个键代替)。从点阵板的下方不断地出现随机产生的一个个离散的台阶并随时间逐渐上移(台阶分为绿色点组成的普通台阶和红色点组成的带刺台阶),角色通过左右移动来不断地从上一层台阶掉落到下面的台阶上以避免碰到点阵板上沿。同时注意不能踩空,否则游戏失败。
另有3个数码管显示角色当前层数和生命值的状态,随着操作运行不断反馈,作出相应变化。
以上是最终实现的结果,初期设想还包括添加当前层数反馈控制游戏运行频率;添加双人游戏模式等等,受时间和技术条件显示未能实现。但游戏的基本功能以及趣味性都体现了出来,基本达到了预期的效果。
2、课题背景:
n 存在问题、应用背景
下台阶小游戏作为一款较为经典的益智类趣味游戏,可以段炼玩家的反应力和判断力,并能在不断挑战自我的过程中充分体现游戏的乐趣,耐玩性较强。
本设计存在的问题主要体现在实现平台的局限性,LED点阵板只适合在实验室操作,不具有商业化的价值。可以将类似的思想通过软件语言编写成电脑软件,在电脑上运行,画面、操作等效果和趣味性会大大提高,也具有普及和商业价值。
3、项目规划:
n 功能、指标、规模
功能:
游戏的大概实现方式见第一部分命题描述,具体操作功能与状态的变化如下
当出现以下情况时产生角色状态的反馈:
1.角色碰到点阵板的上沿或者到达下沿时未踩在台阶上(即踩空,角色掉落深渊),判定角色死亡,游戏失败,点阵板显示GAME OVER;
2.角色踩到红色的带刺台阶上时,随着时间的推移,角色生命值逐渐减少(血量减少的频率与台阶上升频率相同),初始生命值为3点,生命值减少到0时游戏结束(失败);
3.当角色下降到100层时(具体层数可调),提示游戏胜利,出现笑脸图案。
同时,运用3个数码管显示游戏即时状态参数(1个为角色当前血量,其余2个为当前下落的层数),血量初始值可预设,下落层数到预设值时自动停止,游戏结束(胜利);角色死亡时下落层数也停止,游戏结束(失败)。
角色的左右移动通过键盘控制,键盘起到改变左右移动信号的状态的功能,即只需按下一次键(左或右),人物将不停地朝该方向移动,直到下一个状态来临使之改变。
游戏除了左右控制按键之外,外加了开始与暂停状态,通过拨动开关控制。开始状态为0时,游戏回归初始状态,点阵板无显示;开始状态拨为1时,游戏开始,计时(计层数)同时开始。游戏过程中拨下暂停开关(值为1),游戏暂停,保持现在状态;拨回暂停开关时(值为0),游戏继续开始。
游戏的运行频率(即台阶上升与人的左右移动速度)可以通过程序内部参数设置不同值来改变。
指标:
游戏中采用16X16点阵板显示游戏界面;
台阶用绿色和红色表示,人物用黄色的点表示;
3个数码管分别显示一位数的生命值和两位数的当前层数,生命值预设3点,目标层数设为100层,游戏速度经过调试取值适中,较为合理。
规模:
本项目主要涉及到点阵板的动态扫面显示与反馈,还包括数据结构在硬件语言中的实现与优化,调试工作量较大,只实现基本功能的话难度为适中,预想的提高部分规模难度较大,未能实现。
硬件语言通过矩阵实现点阵板上各点的使能控制,数据较多,最终程序编译结果显示占用的逻辑单元的总数超过4000个,运算量较大。
n 面板(显示)、操作、规则
显示面板:
点阵板:游戏界面通过点阵板显示,直观、简洁。
数码管:第一位表示角色当前生命值,后两位表示角色当前所处的层数。
操作:
拨动开始开关运行游戏,拨回则关闭点阵板显示,处在待机状态;
游戏过程中只需通过键盘上的E(左)、F(右)键控制角色的左右移动;
需要暂停时拨动暂停开关即可,拨回则游戏继续。
游戏规则:
游戏规则很容易理解。玩家通过键盘控制角色左右移动,角色随台阶上升,需要不断改变角色方向使之落到下面的台阶上,碰到界面顶部或者踩空(未能站在台阶上)判定游戏失败;坚持一定时间下落达到一定层数判定游戏成功。尽量避免落到带刺的台阶上(红色的),否则生命值减少,减少到0时游戏失败。
n 输入、输出接口
输入输出接口包括键盘的输入输出接口(row[4..0]; col[4..0])以及点阵板的扫描、显示接口(col_scan[16..0]; green[16..0]; red[16..0])。
4、实现方案:
n 核心问题
1. LED点阵板对图像的扫描显示;
2. 程序中点阵矩阵对相关图像的产生(随机产生台阶)、反馈控制(人落到台阶上不再下落,落到带刺的台阶上给出血量减少的反馈信号)、图像移动(人物和台阶)等方面的实现。
n 解决方案
1. 点阵板的扫描显示:
点阵板的行采用扫描信号的形式扫描,16位行输出信号依次为:
”1111111111111110”,”1111111111111101”,”1111111111111011,"1111111111110111","1111111111101111","1111111111011111","1111111110111111","1111111101111111","111111011111111","111110111111111","111110111111111","1111011111111111","1110111111111111","1101111111111111","1011111111111111","0111111111111111";当相应的行选中时,输入相应的红灯和绿灯各自16位列信号。
2.台阶矩阵的构造:
由于需要产生随机的台阶,暂时无法做到完全随机,就使用了预置30行数据并依次调用的方法做到“伪随机”。这里分别用两个16X30的矩阵存储红色台阶和绿色台阶的信号,随着游戏时间脉冲的到来依次在底部产生相应行数的红绿行信号。
3. 人物和台阶的移动与反馈:
这就较为简单了,只要每来一次时间脉冲扫描下一行红绿灯信号即可。为了简化程序,将人物下落的速度与台阶上升的速度用同一个时钟控制,这样上下自动移动扫描时只要注意人物是否遇到台阶这一个特殊反馈情况即可(遇到台阶人物随台阶上升,不遇到台阶人物随时钟下移)。
同时,任务的左右移动用一小段程序单独控制,相关代码程序中有说明,这里不做一一赘述。
5、系统结构:
n 系统框图
n 模块功能描述
分频器模块:
对输入的2MHz信号进行不同的分频,分别产生1KHz、5Hz、2Hz、1Hz等等各种时钟信号。
键盘模块:
外接键盘,当键盘按下键时,将输入的键值和按键脉冲送给后续模块处理。这里只用到EF两个键控制左右移动,功能较为简单。键盘模块后面紧接着一个简易状态机,存贮按下的左或右状态,使角色不用一直按键而可以持续移动。
游戏状态选择模块:
最终的游戏实现较为简单,没用用到更多的游戏模式选择。整体的状态控制只是通过拨动开关控制游戏的开始结束与暂停。
角色移动控制模块:
角色分为左移右移,掉落以及随台阶上升等移动状态。都是通过主程序中的相关子程序段控制。需要判断角色当前位置并实时反馈(这里时刻包含角色状态监测这一功能)。
点阵扫描显示模块(台阶上升、游戏胜负界面等):
把输入的相应红色和绿色矩阵值与点阵扫描信号关联,产生16位红色输出信号和生16位绿色输出信号,连接至点阵板。通过相应程序段控制点阵板应该显示的内容。
n 模块接口标注(参数、协议)
键盘行列输入输出信号:
数码管显示(含角色生命值以及当前层数):
点阵板行扫描以及红绿灯:
其他独自管脚:
6、状态流程图:
n 系统工作状态流程
这是设计方案里的流程图,有的部分为实现,预想和实际结果是有些差距的。
7、各主要模块仿真结果波形
n 各模块的仿真波形,详细注释输入输出功能端口
本系统无法整体仿真,只能分模块实现(用到点阵板时pin脚超过上限),故采用了分模块直接验证的方法,各主要部分仿真图如下:
点阵板的扫描信号仿真。
红线左边为初始状态,右边为开始键按下后的情况。(预置的台阶矩阵这时开始发生,移位)。
任务向左移动的仿真(右移与之类似)。
游戏当前参数(人物生命值,当前层数等)的仿真。
暂停状态,游戏相关参数不变,取消暂停状态游戏继续。
停止状态,游戏个参数返回初始值。
8、课程设计总结
n 预期的目标与当前实现功能的差异详细注释
从设计结果可以看出,与预期的设想相比,实现了单人模式下的基本功能,所需要注意的相关元素均已加入(不同的台阶、生命值、各状态反馈等)。但有的部分无法实现。这里有个人能力的原因(单人挑战模式中随层数增加游戏速度变快这一功能尝试过,但实际会产生诸多游戏时钟方面的问题,考虑再三还是决定将其舍弃);也有软件硬件的局限性原因(quatus只有一共约6000个门,再添加双人模式的话超出上限,无法编译实现)。最终结果已经可以较为完美的运行了,也未失去太多该游戏的趣味性,对实验结果基本满意。
n 可以进一步发挥提高的部分
从设计方案可以看出,进一步发挥提高的空间还是比较大的。具体如下:
1. 可以增加单人挑战模式(游戏时钟可自动变化)和双人模式(引入竞争机制,抢台阶站位)等,进一步增加游戏的趣味性和多元性。
2. 从硬件条件考虑,可以增加更多的外设,比如视觉特效、声音特效、奖励机制等等,使之更加符合游戏玩家的要求。
n 课程设计体会
这次的课程设计较上学期的有了很大的提升,不仅是相关知识应用方面的提升(从图形设计到语言设计),也是个人创造力的体现(自拟课题、自主创新)。这对刚接触VHDL语言的我来说是一个挑战,也是一个很好地锻炼机会。
VHDL语言其实较之其他的软件语言还是比较易于理解的,只是在语言编排的规范上要十分小心注意。由于VHDL语言的逻辑性相当重要,对语法的编译能否成功尚在其次,更重要的是烧入FPGA后的功能实现,很容易出现编译仿真大体正确却无法实现的问题。
我选择的是小游戏的设计,关键点在于点阵板的应用。方案设计时我认为点阵板多看看就能很好理解,只需注意小游戏内部逻辑关联即可。但实际上花费时间更多,纠结更久的是在点阵板的显示上。基本接线的注意点,扫面信号的合理选择,矩阵的运用等等都是需要好好研究的方面。只有充分的理解点阵板的工作机制,才能灵活的运用好它的显示功能达到相关的实验效果。
这一次的实验,对我数字系统硬件设计能力有着很明显的帮助。我也明白了只有多实践,多参与大型系统的设计才能刚好的了解到自己的不足以及更快更有效地提高自己的相关能力。在做系统设计时,也需要本着对自己负责任的态度,踏踏实实,一步一步的搭建程序系统结构,才能最终实现预期目标。
9、参考文献
VHDL语言的众多相关书籍资料(这里便不一一列举了);