殴打小蜜蜂的游戏机.docx
- 文档编号:7833720
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:54
- 大小:892.25KB
殴打小蜜蜂的游戏机.docx
《殴打小蜜蜂的游戏机.docx》由会员分享,可在线阅读,更多相关《殴打小蜜蜂的游戏机.docx(54页珍藏版)》请在冰豆网上搜索。
殴打小蜜蜂的游戏机
华南理工大学第八届智能控制设计大赛
初级组“殴打小蜜蜂”设计报告
自动化科学与工程学院
队长:
区晨希(11级4班)
组员:
林培淳(11级2班)
陈丹菊(11级2班)
目录
设计任务2
设计要求2
方案比较3
设计与论证6
理论分析与计算12
电路图及有关设计文件14
测试方法与仪器63
测试数据及测试结果分析64
设计任务
设计一个殴打小蜜蜂的游戏机。
设计要求
a)基本要求:
i.用LED等模拟或液晶显示屏(如12864)结合按键进行游戏设计。
其中,界面下方有一架小飞机(可以左右移动),界面上方有一堆固定位置的小蜜蜂,小飞机可以发射子弹打击小蜜蜂,每当子弹打到小蜜蜂,对应的蜜蜂就会消失死亡同时子弹随之消失,消灭所有的蜜蜂(数量适当)便可以通关。
ii.通关过后难度等级提升,难度提升一:
小蜜蜂可以发射子弹,蜜蜂子弹触碰到飞机游戏便结束。
难度提升二:
计时模式,设定通关时间,超过该时间游戏结束。
iii.可以进行双人游戏,由两个人各自控制一架小飞机进行游戏。
iv.可进行战绩统计,结束后可输入简单的字母,用于记录选手名称,掉电数据不消失,战绩可以调出查看。
b)扩展功能:
i.效果更佳的游戏界面(如使用tft液晶屏,设计更炫的显示效果)。
ii.通关后特定的几只小蜜蜂能够飞动(飞行数量及方式自定),蜜蜂撞击到飞机游戏结束。
iii.添加背景音乐,子弹打击音效以及其他相应语音提示。
iv.其他拓展功能。
方案比较
c)芯片选择:
i.传统的51单片机STC89C52
1.优点:
算术运算功能强,软件编程灵活,可用软件编程实现各种算法和逻辑控制。
其功耗低、体积小、技术成熟和成本低廉。
2.缺点:
运算速度比较低,较难实现对TFT模块的实时控制,内部rom和ram较小,程序较大就加载不进去,而且容易产生RAM告急,限制了编程的自由。
ii.增强型1T51单片机STC12C5A60S2
1.优点:
其运算速度是传统单片机的8~12倍,具有64Kflash,1K内部扩展RAM。
2.缺点:
内部EEPROM只有1K,两个扇区,可储存的,掉电不丢失数据。
iii.增强型STM32F103
1.优点:
ARMCortex-M3内核,128kBFlash,20KBRAM,最高工作时钟72MHz,64脚
2.缺点:
价格较贵,但是性能均优于以上两种。
d)显示屏选择:
i.LED点阵:
1.优点:
对主控芯片要求不强,功耗低,操作简单,可显示不同色彩。
2.缺点:
硬件比较冗余,界面单调,无法显示更多的内容和绘制更为复杂的游戏界面;
ii.FYD12864:
1.优点:
功耗低、内置汉字字库、无须片选信号、串口与并口可选、简化软件设计、普通51芯片可以驱动。
2.缺点:
显示像素低,颗粒感强、时序图复杂。
iii.320*2402.4寸TFT彩屏模块:
1.优点:
像素高,显示清晰,色彩鲜艳,画面细腻,可用ILI9320驱动的GUI函数直接操作,实现画点、画圆、画线、矩形、正方形、填充、中英文、图标显示,帮助用户方便地创建图形界面。
而且TFT液晶屏自带5V转3.3V模块,可直接与单片机连接。
TFT软件开发的3层结构如下图所示:
2.缺点:
能耗高、需要更高级的芯片驱动。
e)电源选择:
i.5V干电池直流电源:
1.优点:
使用方便,容易获取,低成本。
2.缺点:
供电电压不稳定,电流小。
ii.直流稳压电源:
1.优点:
稳压供电,可避免液晶屏的闪烁、可以进行电压1.25到12V调节、具有过流保护功能。
2.缺点:
制作困难,成本高,LM317发热比较厉害(可用散热片散热)。
f)按键选择:
i.一般按键
1.优点:
成本低,操作方便,灵敏度较好。
2.缺点:
操作效果不好,会影响游戏质量。
ii.红外遥控按键
1.优点:
操作简单,按键舒服。
2.受限于红外接收,灵敏度不太好。
iii.触屏虚拟按键
1.优点:
使用方便,按键舒服。
2.缺点:
精确度不好,一般进行这类游戏过程不宜使用,但是菜单可以考虑使用。
g)音效选择:
i.蜂鸣器
1.优点:
成本低,使用方便,可以调音阶。
2.缺点:
声音刺耳,不适宜做音乐播放。
ii.KD9300音乐芯片
1.优点:
成本低,可以播放整首音乐。
2.缺点:
音乐单一,而且不能改变。
h)最终选用方案:
经过团队慎重思考,综合各方面因素,作出以下决定。
主控芯片选用STM32F103RBT6;显示器使用2.4寸DST2001PHTFTLCD来实现显示,其控制器为ILI9320;使用直流稳压电源3.3V工作电压和TFT完全匹配;为了简单,player1采用普通按键来控制,player2采用红外遥控按键来控制;子弹打击音用蜂鸣器来实现,背景音乐用KD9300来实现。
大部分功能均集成在STM32开发板上,其余外设均焊在另一块板上。
设计与论证
i)主函数
j)第一关
k)第二关
l)第三关
m)第四关
n)第五关
理论分析与计算
o)整体框架的理论分析
i.主函数由初始化函数和死循环构成。
通过外部的触发使标志位改变,进入响应的子菜单中。
ii.各子函数只要涉及循环的都会有各自的标志位,一旦某些条件达到了,就能退出,不会出现无限嵌套退不出的情况。
iii.游戏结束后,通过return语句退出回到主函数。
p)中断分配理论分析
i.将菜单界面的星号移动及确定;游戏界面的飞机移动及飞机发子弹;输入选手信息的选框移动及确定;查看得分情况界面的退出均使用外部中断;而蜜蜂发弹、游戏定时则使用定时器中断。
ii.星号的确定;输入选手信息的选框的确定;查看得分情况界面的退出的中断服务函数中均采用改变标志位的形式,使正在运行的循环得以退出;而星号的移动;游戏界面的飞机移动及飞机发子弹;输入选手信息的选框的移动则是采用直接在中断服务函数里面操作的形式,让触发信号来的时候,直接执行,不存在退出循环的操作。
这样能很好地避免中断嵌套以致中断退不出来。
q)菜单选择及切换模型实现的理论分析
i.选框或星号的移动通过外部中断实现。
ii.确定或退出操作通过检查选框或星号的x、y坐标(标志位)进行操作实现的。
r)子弹碰蜜蜂两者消失的实现逻辑分析
i.当子弹没碰到蜜蜂(颜色为蓝色的点)而且没到最顶时,继续前进。
ii.当子弹遇到蜜蜂时,该子弹消失,蜜蜂消失,得分加100。
iii.当子弹没遇到蜜蜂但到最顶时,子弹消失。
s)子弹碰飞机两者消失并游戏结束的实现逻辑分析
i.当蜜蜂没消失(还没变成背景色)时,生成子弹。
1.当子弹没碰到飞机(颜色为红色的点)而且没到最底时,继续前进。
2.当子弹遇到飞机时,游戏结束。
3.当子弹没碰到飞机但到底的时候,子弹消失。
ii.当蜜蜂消失时,不生成子弹,扫描另外一只蜜蜂。
t)蜜蜂移动并实现跟踪的逻辑分析
i.当蜜蜂没消失(还没变成背景色)并且还没到底时,蜜蜂移动。
(跟踪利用x、y方向速度合成的方法实现)
1.当飞机位于蜜蜂左下时,蜜蜂往左下移动。
2.当飞机位于蜜蜂右下时,蜜蜂往右下移动。
3.当飞机位于蜜蜂正下时,蜜蜂往正下移动。
ii.当蜜蜂碰到飞机时,游戏结束。
iii.当蜜蜂半路被消灭时,坐标回归初始位置,并且清除颜色。
iv.当蜜蜂到底还没消失,坐标回归初始位置并显示。
v.当蜜蜂一开始就消失时,不执行操作,扫描下一只小蜜蜂。
电路图及有关设计文件
u)电路图
i.MCU模块
ii.键盘模块
iii.液晶显示屏模块
iv.断电数据保存模块
v.红外模块
v)有关设计文件(详细请参见源程序)
i.游戏部分
#include
#include"sys.h"
#include"usart.h"
#include"delay.h"
#include"led.h"
#include"key.h"
#include"exti.h"
#include"wdg.h"
#include"timer.h"
#include"lcd.h"
#include"USER.h"
#include"remote.h"
//声明逻辑
#defineA(i)((pBee+i)->y+6>=265)
#defineB(i)(LCD_ReadPoint((pBee+i)->x+4,(pBee+i)->y+7)==WHITE&&LCD_ReadPoint((pBee+i)->x-4,(pBee+i)->y+7)==WHITE&&LCD_ReadPoint((pBee+i)->x+7,(pBee+i)->y+4)==WHITE&&LCD_ReadPoint((pBee+i)->x-7,(pBee+i)->y+4)==WHITE)
#defineC(i)(LCD_ReadPoint((pBee+i)->x,(pBee+i)->y)==WHITE)
voidPlaneInit(IMG*pPlane1);
voidDrawplane(IMG*pPlane1,u16color);
voidBee_Init(IMG*pBee);
voidDraw_Bee(IMG*pBee,u16color);
voidBee_Shoot(IMG*pBee,IMG*pPlane1,IMG*pBee_Bullet);
voidDisplay_Bullet1(IMG*pBullet,u16color);
voidDirection(void);
voidDraw_Bullet(void);
voidScores(void);
u8getlen(void);
voidGameOver(void);
voidChoose_Init(void);
voidDisplay_Score(void);
voidShowmenu(void);
voidShowpoint(void);
voidSingle(void);
voidBeeAttack(IMG*pBee,IMG*pPlane1);
voidBeeAttackAndShoot(IMG*pBee,IMG*pPlane1,IMG*pBee_Bullet);
voidDouble(void);
voidDraw_Bullet2(void);
voidBeeAttack2(IMG*pBee,IMG*pPlane1,IMG*pPlane2);
externu8i;//输入姓名号码声明
IMGPlane1,Bee[Num],Bullet,Bee_Bullet,Plane2,Bullet2;
PLAYERplayers[7];
u16tempY=LINE1;//星号的位置(y值)的定义及初始化
u16ChooseX=0;//输入姓名时候选择框的位置
u16ChooseY=0;
//u8playername[15]={'N','a','m','e',':
'};//选手的名字
u8bee_number=0;//蜜蜂消失的只数,Num=7是上限
u8bNum=0;//实现蜜蜂循环发弹的编号位
u16gTime=0;//游戏时间
//u16Game_Score=0;//游戏得分
u8Flagkey=0;//键盘标志位,区别菜单键盘(0)、游戏中断键盘
(1)、输入姓名界面键盘
(2)、查看分数界面键盘(3)
u8planedir=0;//飞机方向标志位,区别向左
(2)、向右
(1)
u8Flag_Quit=1;//通过外部中断控制退出菜单进入游戏标志位,菜单
(1)、游戏
(2)
u8Flag_Game=1;//游戏或一轮结束标志位,正在进行
(1)、结束(0)(退出蜜蜂发弹循环或蜜蜂移动循环)
u8Flag_Beeshoot;//蜜蜂发弹的标志位,定时器控制发弹,发弹
(1)
u8NameNum=0;//
u8scoremenu=1;//在查看分数界面中持续显示选手信息及分数标志位,通过外部中断控制,持续显示
(1),退出
(2)
u8FlagMove=0;//蜜蜂移动标志位,移动
(1),结束(0)
u8GameTime=0;//定义游戏的局数
/////////////////////主函数////////////////////////
intmain(void)
{
/////////////////////初始化////////////////////////
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72);//延时初始化
uart_init(72,9600);//串口1初始化
LED_Init();//背光初始化
LCD_Init();//TFT初始化
EXTIX_Init();//外部中断初始化
Timerx_Init(20000,7199);//通用定时器初始化
Remote_Init();//红外初始化
////////////////////大循环//////////////////////////
while
(1)
{
Flag_Quit=1;//菜单显示复位
Flagkey=0;//菜单控制键复位
POINT_COLOR=BLACK;
while(Flag_Quit)//如果通过外部中断使其置零,则退出菜单模式,进入游戏模式或查看分数模式
{
Showmenu();
Showpoint();
}
switch(tempY)//以星号的位置(y坐标)为标志位,确定进入哪个游戏模式
{
caseLINE1:
Single();
break;
caseLINE2:
Double();break;
caseLINE3:
Display_Score();
break;
}
}
}
//////////////////////菜单显示模块//////////////////////////
voidShowmenu(void)//显示三个模式
{
LCD_ShowString(72,LINE1,"Single");
LCD_ShowString(72,LINE2,"Double");
LCD_ShowString(72,LINE3,"Score");
}
voidShowpoint(void)//显示星号
{
LCD_ShowChar(56,tempY-16,'',16,0);
LCD_ShowChar(56,tempY+16,'',16,0);
LCD_ShowChar(56,tempY,'*',16,0);
}
/////////////////////////分数查看模块///////////////////////////
voidDisplay_Score(void)//显示选手信息及分数的函数
{
u8i;
Flagkey=3;//将键盘中断模式置为3,在查看分数界面进行操作
scoremenu=1;//持续显示选手信息及分数标志位的复位
LCD_Clear(WHITE);//进入清屏
POINT_COLOR=BLACK;
LCD_ShowString(30,120,"Name:
");//显示姓名
for(i=0;i { LCD_ShowChar(30+50+i*8,120,players[GameTime].name[i],16,0); } LCD_ShowString(30,136,"Score: ");//显示分数 LCD_ShowNum(80,136,players[GameTime].score,getlen(),16); while(scoremenu);//持续显示选手信息,直至外部中断使其置零,让其退出 LCD_Clear(WHITE);//退出清屏 return;//退出函数,return到break处,重新进入主函数的大循环 } ///////////////////双人游戏模块//////////////////////// voidDouble(void)//双人模式 { ///////////////////变量定义////////////////////// IMG*pPlane1,*pBee,*pBee_Bullet,*pPlane2;//定义结构体指针,方便参数传递 Flagkey=1;//确定键盘中断为游戏模式 i=0;//输入姓名光标复位 pPlane1=&Plane1;//飞机1指针指向飞机1结构体 pBee=Bee; pPlane2=&Plane2; pBee_Bullet=&Bee_Bullet; LCD_Clear(WHITE);//进入清屏 GameTime++;//每进入一次游戏,游戏局数加一 players[GameTime].score=0;//游戏分数复位 /////////第一关——小蜜蜂不动,飞机可以发弹////////// POINT_COLOR=BLACK; LCD_ShowString(50,150,"TheFirstRound"); delay_ms(3000); LCD_Clear(WHITE); bee_number=0;//蜜蜂的消失数复位 Flag_Game=1;//游戏持续复位 PlaneInit(pPlane1); PlaneInit(pPlane2); Bee_Init(pBee); Scores();//显示得分 while(Flag_Game)//通过判断消失蜜蜂个数是否达到蜜蜂总数控制标志位,使其置0,使其可以退出第一关进入第二关 { if(bee_number==Num)Flag_Game=0; } LCD_Clear(WHITE);//退出清屏 ////////////////////////第二关——小蜜蜂可以发弹,飞机可以发弹,飞机碰到子弹就GameOver///////////////////////// LCD_Clear(WHITE);//进入清屏 POINT_COLOR=BLACK; LCD_ShowString(50,150,"TheSecondRound"); delay_ms(3000); LCD_Clear(WHITE); Scores();//显示得分 bee_number=0;//蜜蜂的消失数复位 Flag_Game=1;//游戏持续复位 PlaneInit(pPlane1);//飞机初始化 PlaneInit(pPlane2); Bee_Init(pBee);//蜜蜂初始化 while(Flag_Game) { if(Flag_Beeshoot)//如果定时器定的时间到了,标志位会置1,可以进入里面的蜜蜂发弹函数 { Bee_Shoot(pBee,pPlane1,pBee_Bullet); } if(Flag_Beeshoot==0)//如果由于飞机被打中而使标志位置0,则GameOver,进入输入选手信息界面 { GameOver(); LCD_Clear(WHITE);//退出清屏 return;//退出游戏,回到主界面 } if(bee_number==Num)Flag_Game=0;//通过判断消失蜜蜂数是否等于蜜蜂总数而决定是否退出循环进入下一关 } LCD_Clear(WHITE);//退出清屏 /////////第三关——计时模式,小蜜蜂可以发弹,飞机可以发弹,飞机碰到子弹或者时间到就GameOver///////// LCD_Clear(WHITE);//进入清屏 POINT_COLOR=BLACK; LCD_ShowString(50,150,"TheThirdRound"); delay_ms(3000); LCD_Clear(WHITE); Scores();//显示分数 bee_number=0;//蜜蜂的消失数复位 Flag_Game=1;//游戏持续复位 gTime=0;//游戏时间复位 PlaneInit(pPlane1); PlaneInit(pPlane2); Bee_Init(pBee); while(Flag_Game) { if(Flag_Beeshoot)//如果定时器定的时间到了,标志位会置1,可以进入里面的蜜蜂发弹函数 { Bee_Shoot(pBee,pPlane1,pBee_Bullet); } if(Flag_Beeshoot==0)//如果由于飞机被打中而使标志位置0,则GameOver,进入输入选手信息界面 { GameOver(); LCD_Clear(WHITE); return; } if(gTime==Game_Sec/2)//如果游戏时间到了还没打完蜜蜂退出循环,则GameOver,进入输入选手信息界面 { GameOver(); LCD_Clear(WHITE); return; } if(bee_number==Num)Flag_Game=0;//第四关时用 } ////////////////////////第四关——计时模式,蜜蜂可移动,飞机触碰到就GameOver///////////////// LCD_Clear(WHITE);//进入清屏 POINT_COLOR=BLACK; LCD_ShowString(50,150,"TheForthRound"); delay_ms(3000); LCD_Clear(WHITE); Scores();//显示分数 bee_number=0;//蜜蜂的消失数复位 Flag_Game=1;//游戏持续复位 gTime=0;//游戏时间复位 FlagMove=1;//蜜蜂移动复位 PlaneInit(pPlane1); PlaneInit(pPlane2); Bee_Init(pBee); while(Flag_Game) { if(FlagMove) { BeeAttack2(pBee,pPlane1,pPlane2); } if(FlagMove==0) { GameOver(); LCD_Clear(WHIT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 殴打 小蜜蜂 游戏机