61010221基于FPGA的偷地盘游戏

发布者:系统管理员发布时间:2013-10-10浏览次数:14

61010221
                黄尔平
1.     申请题目:偷地盘游戏
         命题描述:本游戏以点阵板和键盘,实验为主要硬件,游戏分为4个状态,分别为:游戏开始、选择难度、偷地盘与游戏结束四个状态,其中难度控制游戏中敌人移动的速度,共分2个难度等级。偷地盘状态中,地盘初始化为中间红色区域为敌人地盘,周边的空白区域为玩家区域,玩家和敌人都是绿色,通过键盘控制玩家移动,当玩家移动到敌人的红色区域时,得到该点的地盘,同时此点的红色消失,敌人朝着玩家移动,当敌人抓到玩家,或者时间结束,游戏停止,过程中,显示玩家的积分,玩家移动有绿色的路径,敌人移动时,无绿色的路径。并且玩家可以穿过边界,而敌人不可以。这样给游戏带来了跟多的策略性,游戏支持暂停等功能。
 
2.     课题背景
1.本游戏属于原创游戏,通过游戏中敏捷的操作,锻炼玩家的思维,通过各种策略在尽可能的多头敌人的地盘而不被发现。对于忙碌的学生来说,不得不说是种放松的好游戏。
2.游戏操作也不复杂,对新手来说易上手,打发时间必备。
 
3.     项目规划
3.1. 功能,指标,规模
3.1.1.      功能:
项目主要实现以下功能:
l        游戏启动,选择,结束时的界面显示(点阵板,双色)
l        游戏难度选择
l        暂停,继续
l        显示当前所处状态
l        倒计时
l        游戏积分
l        游戏核心玩法,策略设置
 
3.1.2.      指标:
l        启动等界面优美的显示
l        开始,暂停立刻响应
l        游戏中玩家偷地盘的积分
l        偷完地盘耗时,或者被抓时偷的地盘量
l        策略的使用
 
3.1.3.      规模:
采用点阵板,键盘,开关,LED灯显示,数码管,乒乓开关等提供硬件设施,充分利用了开发板,实现了游戏的大部分功能,规模比较大,效果比较好。
3.2. 面板(显示)、操作、规则
游戏启动界面,和选择难度界面分别是两个有红色和绿色所构成的图形,
游戏核心部分界面初始化如下:
l        左上角:敌人
l        右下角:玩家
l        不同的难度下,移动速度不同。
l        通过键盘上的1,4,6,9控制玩家的上左右下。
l        通过开关1复位
l        通过数码管3,4,1,2分别显示积分与倒计时。
l        玩家移动偷地盘,同时移动中留下轨迹。
l        敌人移动不留下轨迹,朝着玩家移动
l        敌人不可以穿越边界,而玩家可以,由于玩家移动性不如敌人,所以必须要采取策略以保证能够躲避敌人的追捕
l        以下是游戏中某一状态的图形
l        敌人移动后红色还在,而玩家移动后红色消失,同时显示路径。此时的积分为4(偷一个底盘加一分)
 
 
 
3.3. 输入、输出接口
 
l        游戏输入信号有2MHz系统时钟信号
l        输出信号有点阵板行扫描信号,点阵板红色选通信号,点阵版绿色选通信号,LED数码管输出信号
l        键盘的列扫描与行扫描信号
l         LED灯
l        乒乓开关
4.     实现方案
4.1. 核心问题
l        系统资源的合理把握
游戏中为了动态显示敌人的地盘区域,与玩家和敌人的位置,需要使用二维数组(敌人地盘区域要变,不用二维数组很难操作)
l        玩家移动后路径保持与敌人移动后路径消失
l        敌人追踪玩家
4.2. 解决方法
 
l         系统的逻辑单元资源消耗主要由于对二位数组的赋值引起的,由于敌人红色地盘区域是动态变化的!所以最好采用二维数组处理,方便操作,如果采用rom来做,那么要对每一个点的地址进行扫描译码,很麻烦。而用rom做敌人和玩家的动态显示就比较简单,因为只有两个点,只有对rom输入这两个点的行列地址即可。但是基于现实模块已经做好,因而改进了算法:
1.      本来是基于两个难度,通过case语句分别操作,这里改为了通过不同的diff产生不同的数值,对时钟信号进行分频,从而可以实现玩家和敌人移动的不同频率(不同难度实现)
2.      二维数组的赋值语句red[x][y]<=1,诸如此类的语句各部分都有,本来是在不同的case,if语句里进行分别操作,这样很耗资源,改进为不同的case,if语句中只操作坐标,在语句起始处统一显示。需要注意的是,这里red二维矩阵不能通过操作行坐标与列坐标,因为其实变化的区域而非点,故而采用统一赋值搞定之。
l         这里要系统的弄清楚阻塞赋值与非阻塞赋值的含义与用法:注意的是移动后路径消失需要令green[x][y+1]<=1’b1,而green[x][y]<=1’b0(假设向上移动),路径保持同理。
l        需要用if语句判断敌人坐标和玩家坐标的位置关系,产生赋值。最后判断敌人与玩家横纵坐标是否相等来判断是否进入游戏结束状态。这里也是要注意系统资源的调度的。
 
 
5.     系统结构
5.1. 系统框图
5.2. 模块功能描述
5.2.1.   startgame
实现游戏开始界面的显示为一个笑脸
5.2.2.   choose
实现难度选择界面的显示
实现选择难度的功能
5.2.3.   steal
核心模块
实现玩家移动偷地盘,并且保留其路径
实现敌人朝着玩家移动,不保留路径
实现倒计时功能,在敌人追到玩家,或者时间结束,则游戏结束
实现积分功能,偷地盘越多,积分越多
实现难度功能,不同难度速度不一样
其他具体细节性策略,比如玩家可以穿越地盘边界而敌人不可以等
5.2.4.   gameover
游戏结束界面的显示,为哭脸,同时显示积分和剩余时间
 
5.2.5.   show
通过状态机控制其显示不同状态下的游戏界面
5.2.6.   fenpin
分频器,由2 MHz分出所需要的频率
5.2.7.   Dtimer
倒计时模块,实现99秒倒计时
5.2.8.   Keboard
键盘输出
 
5.3.   模块接口标注(参数、协议)
输入输出名称
芯片引脚号
实验箱标注
钉子线连接
clk_2m
PIN_28
CLK
col[0]
PIN_158
P1
col[1]
PIN_159
P2
col[2]
PIN_160
P3
col[3]
PIN_161
P4
col[4]
PIN_162
P5
col[5]
PIN_163
P6
col[6]
PIN_164
P7
col[7]
PIN_165
P8
col[8]
PIN_166
P9
col[9]
PIN_167
P10
col[10]
PIN_168
P11
col[11]
PIN_169
P12
col[12]
PIN_170
P13
col[13]
PIN_173
P14
col[14]
PIN_174
P15
col[15]
PIN_175
P16
col_scan[0]
PIN_124
ROW1
col_scan[1]
PIN_125
ROW2
col_scan[2]
PIN_126
ROW3
col_scan[3]
PIN_131
ROW4
row_scan[0]
PIN_120
COL1
row_scan[1]
PIN_121
COL2
row_scan[2]
PIN_122
COL3
row_scan[3]
PIN_123
COL4
green[0]
PIN_176
P17
green[1]
PIN_177
P18
green[2]
PIN_178
P19
green[3]
PIN_179
P20
green[4]
PIN_180
P21
green[5]
PIN_181
P22
green[6]
PIN_182
P23
green[7]
PIN_54
EXP_30
green[8]
PIN_184
P24
green[9]
PIN_234
P49
green[10]
PIN_235
P50
green[11]
PIN_23
EXP_06
green[12]
PIN_21
EXP_07
green[13]
PIN_20
EXP_08
green[14]
PIN_19
EXP_09
green[15]
PIN_18
EXP_10
red[0]
PIN_17
EXP_11
red[1]
PIN_16
EXP_12
red[2]
PIN_15
EXP_13
red[3]
PIN_14
EXP_14
red[4]
PIN_13
EXP_15
red[5]
PIN_12
EXP_16
red[6]
PIN_11
EXP_17
red[7]
PIN_8
EXP_18
red[8]
PIN_7
EXP_19
red[9]
PIN_6
EXP_20
red[10]
PIN_5
EXP_21
red[11]
PIN_4
EXP_22
red[12]
PIN_45
EXP_23
red[13]
PIN_46
EXP_24
red[14]
PIN_47
EXP_25
red[15]
PIN_48
EXP_26
ring
PIN_233
L1
rst
PIN_139
K1
scoreh[0]
PIN_87
4A
scoreh[1]
PIN_86
4B
scoreh[2]
PIN_85
4C
scoreh[3]
PIN_84
4D
scoreh[4]
PIN_83
4E
scoreh[5]
PIN_82
4F
scoreh[6]
PIN_81
4G
scoreh[7]
PIN_80
4H
scorel[0]
PIN_99
3H
scorel[1]
PIN_98
3A
scorel[2]
PIN_97
3B
scorel[3]
PIN_96
3C
scorel[4]
PIN_95
3D
scorel[5]
PIN_94
3E
scorel[6]
PIN_93
3F
scorel[7]
PIN_88
3G
stater[0]
PIN_206
L16
stater[1]
PIN_204
L17
 
6.     状态流程图
7.     各主要模块仿真结果波形
1.game_start模块(对应某个count值,输出红绿矩阵的某一行)
2,choose模块
3,steal模块(不同方向keydown :0001,1001,0100,0110时,不同的红绿列值)
4,state模块,状态转换
5,show(显示模块由于输入引脚很多,无法仿真,但是实验结果完全正确)
8.     课程设计总结
8.1. 进一步发挥部分
l        可以设置多模式:玩家和电脑对弈,以及玩家1与玩家二的争抢地盘两种模式。
l        可以增加道具,控制玩家的移动速度(与难度有区别),控制玩家双倍积分,以及可以设置玩家命的条数,死亡后从起始点继续游戏。
8.2. 课程体会
由于经历过之前短学期的MFC程序设计,这对于这次的课题设计经有一定程度上的了解和帮助。但是,毕竟C++这种高级语言与verilog这种硬件语言是有所不同的,所以由于一开始还在用C++的思维去考虑问题,所以也在一定程度增加了遇到的麻烦。导致系统占用较多的资源。
 
通过这次课程设计,我对硬件设计语言verilog有好的掌握,同时对较复杂系统的设计有了更全面和系统的认识。回顾整个设计过程,我深刻体会到编程其实并不困难,真正难的是调试功能,就我本人的设计来说,整个程序从设计到编写,只花了不到两个星期的时间,而调试、修改程序却花了整整四个星期!虽然过程比较艰难,中间遇到了各种难题和错误,但很欣慰的是,所有这些障碍最终都一一被跨越,最后看着自己花了那么大力气做好的系统能够正常运行,真的感觉很开心。相信这次课程设计,会对我们的数字电路技术的学习和掌握大有裨益。
 
9.     参考文献
[1]黄正谨.计算机结构与逻辑设计[M].北京:高等教育出版社.2001.6