打地鼠游戏设计毕业论文设计.docx
- 文档编号:7347802
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:43
- 大小:141.69KB
打地鼠游戏设计毕业论文设计.docx
《打地鼠游戏设计毕业论文设计.docx》由会员分享,可在线阅读,更多相关《打地鼠游戏设计毕业论文设计.docx(43页珍藏版)》请在冰豆网上搜索。
打地鼠游戏设计毕业论文设计
打地鼠游戏机
公布论文和全部源码,仅供学习
摘要:
本作品采用STC12C5A60S22单片机作为主控芯片,选取1602液晶作为显示屏,通过红外接收器用遥控控制游戏机的开机和关机。
游戏程序应用C语言编译,主要使用函数为随机函数和键盘扫描函数。
通过随机函数产生一个随机数,该随机数使显示屏对应位置出现“O”,同时对应的LED被点亮以代表地鼠的随机出现。
通过键盘扫描函数,使每个按键各对应一个LED灯,通过按下该键使相应LED灯熄灭。
本系统配有开场音乐和游戏音效。
关键词:
单片机、随机函数、键盘扫描函数、音乐
Abstract:
thisworkusingSTC12C5A60S2microcontrollerasthemaincontrolchipselectLCDasadisplay,1602,throughtheinfraredreceiverremotecontrolgamestartupandshutdown.ThisgameprogramusingClanguageediting,themainfunctionusedaretherandomfunctionandkeyboardscanfunction.Userandomfunctionstogeneratearandomnumber,atthesametimetherandomnumbertodisplaythecorrespondingposition"0"andthecorrespondingLEDisilluminatedtorepresenttherandomhamster.Throughthekeyboardscanfunction,makeeachkeycorrespondstoaLEDlamp,bypressingthiskeytothecorrespondingLEDlights.Thewholeprocesshasbackgroundmusicandgamesound.
Keywords:
SCM,randomfunction,keyboardscanfunction,music
游戏说明:
本游戏由8个LED灯分别代表8只地鼠,当地鼠跳出来时显示屏对应位置出现“O”,同时该地鼠对应的LED灯被点亮,在限定时间内按下相应按键后,对应LED灯熄灭,同时“O”闪烁一下,表示打中该地鼠。
游戏规则为,打中1~8号地鼠,每只得一分,在每局限定的时间30秒内得满当前关所需分即可进入一下关。
游戏分四关:
第一关,地鼠跳出时间长,得10分后,游戏进入第二关;第二关,地鼠跳出时间较短,得15分后,游戏进入第三关;第三关,地鼠跳出时间更快,得20分后,游戏进入第四关。
第四关,得25分可过,但超越人类反应极限,不作阐述。
方案比较、设计:
方案一:
用STC89C52作主控芯片,灯光表示地鼠,用红外遥控系统,用两层板完成整个电路。
方案二:
用STC12C5A60S2作主控芯片,用灯光和液晶“0”表示地鼠,加入音乐,用红外遥控系统,用一层板完成整个电路。
显然,方案二更加适合,因为方案二中采用的主控芯片运算的速度要比方案一所用芯片快得多(达8倍),ram足够,而且游戏系统使用了定时中断函数,用STC12C5A60S2芯片会得到更快的响应。
而且方案二加入了液晶显示和音乐,使游戏不那么单调,使玩家更好体现游戏的过程。
最后,用一层板可以减少很多飞线,而且布局美观。
电路原理:
本系统包含六个子电路模块,分别为单片机系统电路、流水灯电路、蜂鸣器电路、2*4矩阵键盘、遥控红外接收电路、1602LCD显示屏模块。
单片机系统电路
流水灯电路
蜂鸣器电路
2*4矩阵键盘
遥控红外接收电路
1602液晶显示模块电路
各模块整合并接上电源后,通过遥控打开游戏系统。
随后,单片机系统驱动游戏系统进入初始化模式,同时蜂鸣器系统被驱动开始播放背景音乐。
游戏开始后,背景音乐停止,单片机系统开始随机驱动8个LED灯点亮,同时液晶上对应位置出现O,蜂鸣器系统同时被驱动,发出“嘀”一声。
此过程中,系统不断计时,不断刷新分数。
游戏实现代码:
//begin_display//
#ifndefBeginDisplay_H
#defineBeginDisplay_H
//#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcden=P3^4;
sbitlcdrs=P3^5;
sbitdula=P2^6;
sbitwela=P2^7;
//sbitbemp=P2^3;
intrunlight[9]={0xff,0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
ucharrun_light_num,kkk;//流水灯亮到哪一盏,kkk为定时0计数
ucharbegin_flag,time_counter,mouse_hit;
voiddelay(uintz)//延时1ms
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddelayus(unsignedcharx)//最新12c5a延时1us
{
while(x--)
{
_nop_();
_nop_();
_nop_();
}
}
voiddelayms(unsignedcharx)//最新12c5a延时1毫秒
{
unsignedchari,j,k;
for(k=x;k>0;k--)
for(i=22;i>0;i--)
for(j=250;j>0;j--);
}
voidwrite_com(ucharcom)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);//显示模式设置
write_com(0x0f);//开显示、光标、闪烁
write_com(0x06);//读写一个后地址加一,不移屏
write_com(0x01);//清屏,显示清0,数据指针清0
write_com(0x80+0x01);//起始指针位置
}
voidbegin_display()
{
inti;
ucharcodetable[]="##WhackaMole##";
ucharcodetable1[]="ByCoolCat";
init();
write_com(0x80+0x10);
for(i=0;i<16;i++)//写入第一行字
{
write_data(table[i]);
delayms(5);
}
write_com(0x80+0x50);//坐标变至下一行
for(i=0;i<16;i++)
{
write_data(table1[i]);
delayms(5);
}
for(i=0;i<16;i++)
{
write_com(0x18);//整屏左移一位
delayms(100);
}
for(i=0;i<5;i++)//整屏闪烁
{
write_com(0x08);
delayms(50);
write_com(0x0f);
delayms(50);
}
while(begin_flag);
}
/*voidlight_run()
{
inti;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
EA=1;//开中断
ET0=1;
TR0=1;//开定时0
for(j=0;j<4;j++)
for(i=1;i<9;i++)
{
P0=runlight[i];
if(i==8)i==0;
}*/
voidready_go()
{
inti;
//bemp=1;//初始化不响
ucharcodetable3[]="Ready";
ucharcodetable4[]="Go";
ucharcodetable5[]="54321";
write_com(0x01);//清屏,显示清0,数据指针清0
write_com(0x80+0x01);
for(i=0;i<9;i++)//写入第一行字
{
write_data(table5[i]);
bemp=~bemp;
delayms(500);
}
bemp=1;
write_com(0x80+0x40);//坐标变至下一行
for(i=0;i<6;i++)//display"ready"再停顿一下
{
write_data(table3[i]);
delayms(50);
}
delayms(500);
for(i=0;i<2;i++)
{
write_data(table4[i]);
delayms(50);
}
write_data(0x7e);
delayms(50);
write_data(0x7e);//向右方向头
delayms(50);
/*for(i=0;i<16;i++)
{
write_com(0x18);//整屏左移一位
delay(300);
}*/
for(i=0;i<2;i++)//整屏闪烁
{
write_com(0x08);
delayms(50);
write_com(0x0f);
delayms(50);
}
}
/*voidTimer00()interrupt1//该中断为流水灯转
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
run_light_num++;
P0=runlight[run_light_num];//流水灯亮
if(run_light_num==8)run_light_num=1;
}*/
#endif
//GamingDisplay_h//
#ifndefGamingDisplay_h
#defineGamingDisplay_h//有静止的time_score(),动态的score_display(),
//定时器2
uchariii;//定时器2的i
ucharnumm_temp=0x82;
ucharhole[]={0x80,0x82,0x83,0x84,
0x85,0x86,0x87,
0x88,0x8b};//8b王牌鼠
voidfirst_line_mouse1602()
{
inti;
ucharcodetable8[]="#_______#^_^#";//8个地鼠8是王牌地鼠打中加2分
write_com(0x80);
for(i=0;i<16;i++)
{
write_data(table8[i]);
delay
(1);
}
}
voidtime_score()//显示时间和分数的单词静态加上显示地鼠
{//尼码还是得按5次才有显示
inti;//不要全部用i了
ucharcodetable6[]="Time";
ucharcodetable7[]="Score";
//dula=0;
//wela=0;
//lcden=0;
//write_com(0x38);//显示模式设置
write_com(0x0c);//不要光标,闪烁
//write_com(0x06);//读写一个后地址加一,不移屏
write_com(0x01);//清屏,显示清0,数据指针清0
write_com(0x80+0x01);//起始指针位置
//write_com(0x0c);
delay(5);
first_line_mouse1602();
delayms(5);
write_com(0x80+0x40);
for(i=0;i<5;i++)//第二行写时间这个不用动
{
write_data(table6[i]);
delayms(5);
}
write_com(0x80+0x48);//第二行后分数
for(i=0;i<6;i++)
{
write_data(table7[i]);
delayms(5);
}
}
voidlevel_1_display()
{
ucharcodetable8[]="####Level1####";
inti;
write_com(0x01);//清屏,显示清0,数据指针清0
write_com(0x80);//起始指针位置
for(i=0;i<16;i++)
{
write_data(table8[i]);
delayms(50);
}
delayms(500);
}
voidlevel_2_display()
{
ucharcodetable8[]="####Level2####";
inti;
write_com(0x01);//清屏,显示清0,数据指针清0
write_com(0x80);//起始指针位置
for(i=0;i<16;i++)
{
write_data(table8[i]);
delayms(50);
}
delayms(500);
}
voidlevel_3_display()
{
ucharcodetable8[]="####Level3####";
inti;
write_com(0x01);//清屏,显示清0,数据指针清0
write_com(0x80);//起始指针位置
for(i=0;i<16;i++)
{
write_data(table8[i]);
delayms(50);
}
delayms(500);
}
voidlevel_4_display()
{
ucharcodetable8[]="##BT##Level4##";
inti;
write_com(0x01);//清屏,显示清0,数据指针清0
write_com(0x80);//起始指针位置
for(i=0;i<16;i++)
{
write_data(table8[i]);
delayms(50);
}
delayms(500);
}
voidcongratulation()//过关后的庆贺
{
inti;
ucharcodetable9[]="congratulation!
!
";
ucharcodetable10[]="Yourscore";
write_com(0x01);//清屏,显示清0,数据指针清0
write_com(0x80);//起始指针位置
for(i=0;i<16;i++)
{
write_data(table9[i]);
delayms(50);
}
write_com(0x80+0x41);
for(i=0;i<10;i++)
{
write_data(table10[i]);
delayms(50);
}
write_com(0x80+0x4c);
write_data(mouse_hit/10+0x30);//显示分数十位
//delay(5);
write_data(mouse_hit%10+0x30);//显示分数个位
write_com(0x50);
}
voidgame_over()//失败
{
inti;
ucharcodetable9[]="GmaeOver";
ucharcodetable10[]="Yourscore";
write_com(0x01);//清屏,显示清0,数据指针清0
write_com(0x80);//起始指针位置
for(i=0;i<16;i++)
{
write_data(table9[i]);
delayms(50);
}
write_com(0x80+0x41);
for(i=0;i<10;i++)
{
write_data(table10[i]);
delayms(50);
}
write_com(0x80+0x4c);
write_data(mouse_hit/10+0x30);//显示分数十位
//delay(5);
write_data(mouse_hit%10+0x30);//显示分数个位
write_com(0x50);
}
voidmouse_1602display(ucharnumm)
{
//first_line_mouse1602();
write_com(hole[numm_temp]);
write_data(0x5f);//0x5f="_"
write_com(hole[numm]);
write_data(0x4f);//0x4f=大O
numm_temp=numm;
write_com(0x50);
}
voidinit_timer2()
{
RCAP2H=(65536-50000)/256;//重装载计数器赋初值
RCAP2L=(65536-50000)%256;
ET2=1;//开定时器2中断
EA=1;//开总中断
}
voidgaming_display()
{
init_timer2();
TR2=1;//开启定时器,并设置为自动重装载模式
}
/*voidtimer2()interrupt5//调用定时器2,自动重装载模式
{
TF2=0;//定时器2的中断标志要软件清0
iii++;//计数标志自加1
if(iii==8)
{
iii=0;//将静态变量清0
score_display();
}
}*/
#endif
//mouse_level//
#ifndefMouseLevel_H
#defineMouseLevel_H//有time_counter,mouse_hit,random,key_scan,
//mouse_out,两个定时中断0和1
#definelevel_150
#definelevel_270
#definelevel_380//不同等级对应不同的地鼠数
#definelevel_4100
ucharseed,keyscan_num,
temp_num,random_num;//声明时间种子,键盘数,临时数,计时数
//击中地鼠数
intiiii;
intdeng[9]={0xff,0xfe,0xfd,0xfb,0xf7,
0x7f,0xbf,0xdf,0xef};
intrandom()
{
ucharj,k;
srand(seed);
k=(rand()%8+1);
j=1+(int)(16.0*rand()/65535);//j和k是两种实现随机机算法,j算法优
return(k);
}
ucharkeyscan();
voidmouse_out(ucharmouse_num,ucharspeed)//第一个变量是老鼠数,第二个是速度
{
uchari,kk,random_temp,keyscan_temp;
keyscan_num=0;
random_num=1;
mouse_hit=0;
time_counter=30;//初始化时间和分数
TMOD=0X11;
TH0=(65536-61440)/256;//定时中断初始化开了2个中断
TL0=(65536-61440)%256;//0是给随机函数用的,1是进行定时扫描键盘的
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;//开中断
ET0=1;
TR0=1;//开定时0
ET1=1;
TR1=1;
for(kk=0;kk { random_temp=random();//防止使用过程中random()变化 if(random_num! =random_temp)//random_num不变要让keyscannum保持一段时间 //产生不重合的随机数 random_num=random_temp; elseif(random_temp>=7) random_num=random_temp-1; elserandom_num=random_temp+1; P1=deng[random_num]; bemp=0; delayms(50); bemp=1; //for(i=0;i<100;i++)delay(99); for(i=0;i { if(random_num==keyscan_num) { P1=0xff; //i++;//此处的加是击中后出鼠速度会加快 if(keyscan_num! =keyscan_temp)////要解决不断刷分的问题 { mouse_hit++; if(random_num==8)mouse_hit++;//神鼠加2分 first_line_mouse1602(); } //keyscan_num=9; keyscan_temp=keyscan_num; } delayms(1000);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 地鼠 游戏 设计 毕业论文