北邮打地鼠的游戏设计与实现.docx
- 文档编号:11684971
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:22
- 大小:445.09KB
北邮打地鼠的游戏设计与实现.docx
《北邮打地鼠的游戏设计与实现.docx》由会员分享,可在线阅读,更多相关《北邮打地鼠的游戏设计与实现.docx(22页珍藏版)》请在冰点文库上搜索。
北邮打地鼠的游戏设计与实现
数电实验报告
题目:
打地鼠的游戏设计与实现
姓名:
学号:
班级:
学院:
电子工程学院
2015年11月8日
一、任务要求
基本要求
1、设计一个挑战反应速度的“打地鼠”游戏,采用用8×8双色点阵显示游戏界面,其中游戏边界采用绿色LED显示,随机出现的地鼠采用红色LED显示,游戏有16个洞穴,如图1所示。
图1打地鼠游戏示意图
2、游戏洞穴每次随机出现一个地鼠,每个地鼠的最长保持时间为2秒,2秒后随机出现下一个地鼠。
以4×4键盘的按键代表锤子,16个洞穴与16个按键一一对应,一旦锤子在2秒内击中地鼠,地鼠消失,数码管计分器分数加1分;若锤子一直没有击中地鼠,2秒后该地鼠消失。
用两个数码管显示游戏成绩,当游戏成绩达到10分时游戏结束,点阵显示字符“V”。
3、用两个数码管对整个游戏进行倒计时,当游戏时间超过59秒而成绩未达到10分时,游戏失败,点阵显示字符“X”。
4、按复位键重新开始游戏,并开始倒计时。
提高要求:
1、增加游戏难关,在边界内每次随机出现两个地鼠,两个地鼠的最长保持时间均为2秒,2秒后随机出现下两个地鼠,锤子击中一个地鼠加1分,当游戏成绩达到20分而且游戏时间未超过59秒时,游戏结束,显示字符“V”,否则显示字符“X”。
2、自拟其他功能。
二、系统设计
设计思路:
1、将该程序进行分模块设计。
可以将程序分为:
分频模块、随机数产生模块、比较模块、键盘电路、显示模块、计时模块、游戏结束模块。
2、分模块进行相应模块的编写。
3、对编好的模块进行测试。
4、编写主程序并进行调试。
总体框图:
分块设计:
1、分频模块
将50MHz的信号源分别分频为各难度所需频率的时钟信号。
2、随机数产生模块
本实验采用伪随机数产生方法,即在ROM中存入随机表中的数据,游戏开始后采用一个计数器不断从其中读取数据。
3、比较模块
判断选手得分或失分主要是由一个比较器完成的,将系统传给LED灯的信号与选手输入的信号作比较,相同则加分,否则扣分,这两个信号分别传给计分模块,从而完成系统判定得分的工作。
4、键盘电路
主要通过产生行扫描,来识别用户的按键,电路中已经对按键进行了消抖。
其提供给控制器按键的编码。
5、显示模块
显示模块分为两部分,一为60s的倒计时,另一个为从0到10的记分模块,游戏开始时计时模块和比较模块分别将信号传递给显示模块,用来将BCD码转化为可以在七段数码管中显示的。
6、计时模块
在此模块中集合开始键,复位键。
当复位键等于0,开始键等于1时,游戏开始。
倒计时模块预置值为60,开始信号给出后,开始60s倒计时。
7、记分模块
计分模块接受来自比较模块的信号控制分数的加减,同时将当前的分数BCD码以电信号传递给显示模块显示分数,每一次加分时,判断当前分数是否超过10分,同时当前时间是否小于0。
8、游戏结束模块
接收来自计分模块的信号,判断是否结束,保存当前分数,时间通过显示模块显示。
三、仿真波形及波形分析:
一、随机数仿真波形
在等级为1的情况下产生0---16随机数,产生时间不定,根据当前数字,对应与点阵中的16个LED灯,同时点亮该点。
二、键盘输入(“锤子”仿真波形)
通过消抖,提高了键盘反应,当点阵数列和键盘相同时,判断为1,表示为加分信号
三、计时器
出始时刻设为60S,通过频率为1Hz的时钟,每一次在时钟上升沿到来时,时间减一。
四、最高分保存模块
最高分保存模块和计分模块倒计时模块相连,当倒计时显示为0,分数小于10时保存,或者当分数等于10,倒计时小于60保存,其余情况下均输出0,该模块不工作。
五、比较计分模块波形
当计分信号显示为1时,分数u1加一,时钟频率为0.5Hz,在每一个时钟周期内为1,加一否则保持不变。
六、等级判断模块
四、源程序:
一、分频器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfenpinqiIS
PORT(clk_f,clear_f:
INSTD_LOGIC;
clk_f_out10k,clk_f_out100,clk_f_out1,clk_f_out1d2:
OUTSTD_LOGIC);
ENDfenpinqi;
ARCHITECTUREaOFfenpinqiIS
SIGNALtmp1:
INTEGERRANGE0TO24999;--50000分频
SIGNALtmp2:
INTEGERRANGE0TO4;
SIGNALtmp3:
INTEGERRANGE0TO49;--100分频
SIGNALtmp4:
INTEGERRANGE0TO99;--200分频
SIGNALclktmp1:
STD_LOGIC;
SIGNALclktmp2:
STD_LOGIC;
SIGNALclktmp3:
STD_LOGIC;
SIGNALclktmp4:
STD_LOGIC;
BEGIN
P1:
PROCESS(clear_f,clk_f)
BEGIN
IFclear_f='1'THEN
tmp1<=0;
ELSIFclk_f'eventANDclk_f='1'THEN
IFtmp1=24999THEN
tmp1<=0;
clktmp1<=notclktmp1;--50000fenpin
ELSE
tmp1<=tmp1+1;
ENDIF;
ENDIF;
ENDPROCESSP1;
P2:
PROCESS(clear_f,clktmp1)
BEGIN
IFclear_f='1'THEN
tmp2<=0;
ELSIFclktmp1'eventANDclktmp1='1'THEN
IFtmp2=4THEN
tmp2<=0;
clktmp2<=notclktmp2;--10fenpin
ELSE
tmp2<=tmp2+1;
ENDIF;
ENDIF;
ENDPROCESSP2;
P3:
PROCESS(clear_f,clktmp2)
BEGIN
IFclear_f='1'THEN
tmp3<=0;
ELSIFclktmp2'eventANDclktmp2='1'THEN
IFtmp3=49THEN
tmp3<=0;
clktmp3<=notclktmp3;--100fenpin
ELSE
tmp3<=tmp3+1;
ENDIF;
ENDIF;
ENDPROCESSP3;
P4:
PROCESS(clear_f,clktmp2)
BEGIN
IFclear_f='1'THEN
tmp4<=0;
ELSIFclktmp2'eventANDclktmp2='1'THEN
IFtmp4=99THEN
tmp4<=0;
clktmp4<=notclktmp4;--200fenpin
ELSE
tmp4<=tmp4+1;
ENDIF;
ENDIF;
ENDPROCESSP4;
clk_f_out10k<=clktmp1;
clk_f_out100<=clktmp2;
clk_f_out1<=clktmp3;
clk_f_out1d2<=clktmp4;
ENDa;
二、译码器
libraryieee;
useieee.std_logic_1164.all;
entityyimaqiis
port(
clk_y,clear_y:
instd_logic;
time1,time2,score1,score2:
INstd_logic_vector(3downto0);
yimaqi_out:
outstd_logic_vector(6downto0);
cat:
outstd_logic_vector(5downto0)
);
endyimaqi;
architectureyimaqi_1ofyimaqiis
signaltime1_tmp,time2_tmp,score1_tmp,score2_tmp:
std_logic_vector(6downto0);
signalcat_tmp:
std_logic_vector(5downto0);
functionconvert(input:
std_logic_vector)returnstd_logic_vectoris
begin
caseinputIS
when"0000"=>return"1111110";--根据BCD码,生成不同的显
when"0001"=>return"0110000";序列,点亮不同位置,显示
when"0010"=>return"1101101";数字1--10
when"0011"=>return"1111001";
when"0100"=>return"0110011";
when"0101"=>return"1011011";
when"0110"=>return"1011111";
when"0111"=>return"1110000";
when"1000"=>return"1111111";
when"1001"=>return"1111011";
whenothers=>return"0000000";
endcase;
endconvert;
begin
p1:
process(clk_y,clear_y)
begin
ifclear_y='1'thencat_tmp<="111111";
elsifclk_y'eventandclk_y='1'then
casecat_tmpis
when"111110"=>cat_tmp<="011111";yimaqi_out<=time2_tmp;
when"011111"=>cat_tmp<="101111";yimaqi_out<=time1_tmp;
when"101111"=>cat_tmp<="111101";yimaqi_out<=score2_tmp;
when"111101"=>cat_tmp<="111110";yimaqi_out<=score1_tmp;
whenothers=>cat_tmp<="111110";
endcase;
endif;
endprocessp1;
p2:
process(time1,time2,score1,score2,time1_tmp,time2_tmp,score1_tmp,score2_tmp)
begin
time1_tmp<=convert(time1);
time2_tmp<=convert(time2);
score1_tmp<=convert(score1);
score2_tmp<=convert(score2);
endprocessp2;
cat<=cat_tmp;
endyimaqi_1;
三、计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entityjishuqiis
PORT(add,clk_j60,clear_j:
INSTD_LOGIC;
q1_j60,q2_j60,q1_j10,q2_j10:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
time_up,reach10:
OUTSTD_LOGIC
);
endjishuqi;
architectureaofjishuqiis
signalq1_j60tmp,q2_j60tmp,q1_j10tmp,
q2_j10tmp:
std_logic_vector(3DOWNTO0);
signalendsignal:
std_logic_vector(1downto0);
begin
p1:
process(clk_j60,clear_j)
begin--倒计时部分,预置为60,根据时钟信号每一秒减一
ifclear_j='1'then
q1_j60tmp<="0000";q2_j60tmp<="0000";time_up<='0';endsignal
(1)<='0';
elsifendsignal(0)='0'then
ifclk_j60'eventandclk_j60='1'then
ifq1_j60tmp="1001"then
ifq2_j60tmp="0101"thentime_up<='1';endsignal
(1)<='1';
elseq1_j60tmp<="0000";
q2_j60tmp<=q2_j60tmp+1;time_up<='0';endsignal
(1)<='0';
endif;
elseq1_j60tmp<=q1_j60tmp+1;time_up<='0';endsignal
(1)<='0';
endif;
endif;
endif;
endprocessp1;
q1_j60<=q1_j60tmp;
q2_j60<=q2_j60tmp;
p2:
process(add)
begin--分数表示部分,接收加分信号,并输出给判断模块
ifclear_j='1'then
q1_j10tmp<="0000";q2_j10tmp<="0000";reach10<='0';endsignal(0)<='0';
elsifendsignal
(1)='0'then
ifadd'eventandadd='1'then
ifq1_j10tmp="1001"then
ifq2_j10tmp="0000"thenq1_j10tmp<="0000";
q2_j10tmp<=q2_j10tmp+1;reach10<='1';endsignal(0)<='1';
elseq1_j10tmp<="0000";q2_j10tmp<=q2_j10tmp+1;reach10<='0';
endsignal(0)<='0';
endif;
elseq1_j10tmp<=q1_j10tmp+1;reach10<='0';endsignal(0)<='0';
endif;
endif;
endif;
endprocessp2;
q1_j10<=q1_j10tmp;
q2_j10<=q2_j10tmp;
enda;
四、点阵模块
libraryieee;
useieee.std_logic_1164.all;
entitydianzhenis
port(
x,y:
instd_logic_vector(1downto0);--根据产生的伪随机数,确定行
clear_d,clk_d,hit,win,lose:
instd_logic;列坐标,点亮相应点阵序列
cat1_out,cat2_out,cat3_out:
outstd_logic_vector(5downto0)
);
enddianzhen;
architectureaofdianzhenis
signalcat1,cat2,cat3,x_tmp:
std_logic_vector(5downto0);
begin
p1:
process(y,clear_d,clk_d,hit)
begin
ifclear_d='1'thencat3<="111111";
elsifclk_d'eventandclk_d='1'then
ifwin='1'then--当获胜信号为1时,控制点阵显示V
casecat3is
when"011111"=>cat3<="101111";cat1<="100001";cat2<="010010";
when"101111"=>cat3<="110111";cat1<="100001";cat2<="010010";
when"110111"=>cat3<="111011";cat1<="100001";cat2<="001100";
when"111011"=>cat3<="111101";cat1<="100001";cat2<="001100";
when"111101"=>cat3<="111110";cat1<="111111";cat2<="000000";
when"111110"=>cat3<="011111";cat1<="111111";cat2<="000000";
whenothers=>cat3<="011111";
endcase;--失败信号为1时,显示X
elsiflose='1'then
casecat3is
when"011111"=>cat3<="101111";cat1<="100001";cat2<="010010";
when"101111"=>cat3<="110111";cat1<="100001";cat2<="001100";
when"110111"=>cat3<="111011";cat1<="100001";cat2<="001100";
when"111011"=>cat3<="111101";cat1<="100001";cat2<="010010";
when"111101"=>cat3<="111110";cat1<="111111";cat2<="000000";
when"111110"=>cat3<="011111";cat1<="111111";cat2<="000000";
whenothers=>cat3<="011111";
endcase;
else--游戏进行中win、lose均不为1,游戏继续
casecat3is
when"011111"=>cat3<="101111";cat1<="100001";
ify="00"thencat2<=x_tmp;
elsecat2<="000000";endif;
when"101111"=>cat3<="110111";cat1<="100001";
ify="01"thencat2<=x_tmp;
elsecat2<="000000";endif;
when"110111"=>cat3<="111011";cat1<="100001";
ify="10"thencat2<=x_tmp;
elsecat2<="000000";endif;
when"111011"=>cat3<="111101";cat1<="100001";
ify="11"thencat2<=x_tmp;
elsecat2<="000000";endif;
when"111101"=>cat3<="111110";cat1<="111111";cat2<="000000";
when"111110"=>cat3<="011111";cat1<="111111";cat2<="000000";
whenothers=>cat3<="011111";
endcase;
endif;
endif;
endprocessp1;
p2:
process(x,x_tmp,hit)
begin
ifhit='1'thenx_tmp<="000000";
elsifhit='0'then
casexis
when"00"=>x_tmp<="000010";
when"1"=>x_tmp<="000100";
when"10"=>x_tmp<="001000";
when"11"=>x_tmp<="010000";
whenothers=>x_tmp<="000000";
endcase;
endif;
endprocessp2;
cat1_out<=cat1;
cat2_out<=cat2;
cat3_out<=cat3;
enda;
五、控制器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitykongzhiqiis
port(
x_in,y_in:
instd_logic_vector(1downto0);--键盘输入
xkey_out:
outstd_logic_vector(3downto0);--列项
ykey_in:
instd_logic_vector(3downto0);--行项
reach10_in,time_up_in:
instd_logic;--分数时间信号
clk_k,clk_k2,clear_k:
instd_logic;
add_out,win_out,lose_out,disappear_out:
outstd_logic
);
endkongzhiqi;
architectureaofko
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮打 地鼠 游戏 设计 实现