VHDL贪吃蛇游戏实验报告.doc
文本预览下载声明
贪吃蛇游戏
摘要:
本实验以设计贪吃蛇游戏为课题。最终结果是以8*8点阵作为本游戏的显示界面,通过按键BTN1,BTN2,BTN3,BTN4分别控制蛇的运动方向,分别为“上下左右”。蛇的长度为六个点阵,另外以一点表示老鼠,当蛇头吃到老鼠时,老鼠则在点阵上改变位置,也就是说通过一个伪随机函数在点阵上产生老鼠的位置,每当蛇头吃到老鼠时,就自动加一分,并在数码管显示。每隔五分钟,在蛇没有吃到老鼠的前提下,老鼠就自动在点阵上改变位置,这样就增加了游戏的趣味性和难度性。
关键字:
8*8点阵,贪吃蛇,数码管,EPM7128SLC8—15数电实验开发板
课题设计任务及要求:
简要说明:用一个8×8 点阵作为基本显示屏,六个连续移动的的发光点表示一条蛇,用任意出现的一个亮点表示老鼠,用4 个排成一条线的发光点表示“墙”,用四个按键控制蛇的运动方向,完成贪食蛇游戏,蛇撞“墙”、边或者游戏时间到,则游戏结束。
1. 老鼠出现的地方是随机的,在某个地点出现的时间是5 秒钟,如 果5 秒钟之内没有被吃掉,它就会在其它地方出现;
2. 用数码管显示得分情况和游戏的剩余时间,每吃掉一只老鼠就加一分;
3. 游戏时间和速度可以手动设置。
4. 选做:增加游戏难度或自拟其它功能。
设计思路:
当开启电源时,初始化EPM7128SLC8—15数电实验开发板。8*8点阵也初始化,每来一个时钟脉冲就对8*8点阵进行一次扫描,并依次点亮六个蛇身和一个老鼠所对应的点,由于扫描频率是1MHz(远远超出人眼所能分辨的范围),故人眼看来蛇身是连续的。用BTN1,BTN2,BTN3,BTN4键分别控制蛇的运动方向“上下左右”,每次按键时通过和蛇原来的运动方向进行比较来控制蛇接下来的运动方向。在七段数码管上显示得分情况,每当蛇吃到一个老鼠时则自动加一分,并在数码管上显示出当前得分。设置一个控件SW1来对得分进行复位,即每当SW1有效时,则得分清零。
总体框架图:
控制器部分的状态转移图(MDS图):
蛇的运动方向snake_m设置为两位二进制的变量:假设“00”表示“上”,“01”表示“下”,“10”表示“左”,“11”表示“右”;
控制方向dir也设置为两位二进制变量:假设“00”表示“上”,“01”表示“下”,“10”表示“左”,“11”表示“右”。
则蛇运动方向的状态转移图如下:
流程图:
按照系统的设计思路其流程图如下:
分块电路和总体电路的设计:
总体电路的设计:
在本课题中最主要的是如何让蛇在8*8点阵上显示并且让蛇身在点阵上移动。为此我设置snake_x和snake_y这两个变量,这两个变量定义为word型,word数据类型是我自己定义的(type word is array (1 to 7)of std_logic_vector(2 downto 0))。意思是说,snake_x和snake_y是一个数组(从1到7),其值是3位的二进制变量(从“000”到“111”),分别为点阵的横坐标和纵坐标。这样当蛇移动时只要把前一个点的值赋给后一个点的值,对于第一个点则需判断其当前方向来决定其下一步的移动方向,例如:当蛇的移动方向为上,即snake_m=“00”,则当控制方向为左,即dir=“10”,则代码如下:
if (snake_m=00) then
if (dir=10) then
snake_m=10;
if (snake_m=10)and(snake_x(1)=000) then --左,
snake_x(6)=snake_x(5);
snake_x(5)=snake_x(4);
snake_x(4)=snake_x(3);
snake_x(3)=snake_x(2);
snake_x(2)=snake_x(1);
snake_y(6)=snake_y(5);
snake_y(5)=snake_y(4);
snake_y(4)=snake_y(3);
snake_y(3)=snake_y(2);
snake_y(2)=snake_y(1
显示全部