基于51单片机的小游戏设计.pdf

上传人:qwe****56 文档编号:70001224 上传时间:2023-01-14 格式:PDF 页数:24 大小:3.40MB
返回 下载 相关 举报
基于51单片机的小游戏设计.pdf_第1页
第1页 / 共24页
基于51单片机的小游戏设计.pdf_第2页
第2页 / 共24页
点击查看更多>>
资源描述

《基于51单片机的小游戏设计.pdf》由会员分享,可在线阅读,更多相关《基于51单片机的小游戏设计.pdf(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、重庆文理学院11 电子信息科学与技术第 1 页 共 24 页基于 51 单片机的小游戏专业:电子信息科学与技术专业:电子信息科学与技术小组成员:孙远(201108051014)小组成员:孙远(201108051014)刘林(201108051009)刘林(201108051009)王然(201108051004)王然(201108051004)黄漠啸(201108051038)黄漠啸(201108051038)第 2 页 共 24 页目录目录一、制作所需模块、材料。.3二、硬件连接电路.3三、软件程序.31、头文件、端口等定义。.32、12864.h(包含文件库).44、为伪随机数发生器播种:

2、.45、初始化 MPU:.56、画墙壁,初始化界面:.67、打印成绩:.78、打印速度级别:.79、游戏结束处理:.810、游戏的具体过程,也是贪吃蛇算法的关键部分:.811、LCD12864.12四、调试结果.231、开始画面:.232、游戏界面:.233、游戏结束画面:.24五、功能介绍.25六、参考。.25第 3 页 共 24 页一、制作所需模块、材料。一、制作所需模块、材料。1、单片机最小系统。2、万能板。3、12864 液晶显示屏。4、按键、绑线等。买到后依照电路原理图自己焊接即可。二、硬件连接电路二、硬件连接电路三、软件程序三、软件程序1、头文件、端口等定义。1、头文件、端口等定义

3、。第 4 页 共 24 页2、12864.h(包含文件库)2、12864.h(包含文件库)3、伪随机数发生器:、伪随机数发生器:4、为伪随机数发生器播种:4、为伪随机数发生器播种:第 5 页 共 24 页5、初始化 MPU:5、初始化 MPU:/*初始化 MPU*/void InitCpu(void)TMOD=0 x0;TH0=0;TL0=0;TR0=1;ET0=1;EA=1;#define N 20struct Foodunsigned char x;unsigned char y;unsigned char yes;food;/食物结构体struct Snakeunsigned char

4、xN;unsigned char yN;unsigned char node;unsigned char direction;unsigned char life;snake;/蛇结构体unsigned char Flag=0;第 6 页 共 24 页unsigned char Score=0;unsigned char Speed=1;unsigned char KeyBuffer=0;#define FUNC 1#define UP 2#define DOWN 3#define LEFT 4#define RIGHT 5#define PASSSCORE 20/预定义过关成绩void Ti

5、mer0Int(void)interrupt 1switch(OSReadKey()case 9:KeyBuffer=FUNC;/*if(+Speed=10)Speed=1;Flag|=11;/速度变化标志置 1*/break;case 13:KeyBuffer=DOWN;/*if(snake.direction!=2)snake.direction=1;*/break;case 17:KeyBuffer=UP;/*if(snake.direction!=1)snake.direction=2;*/break;case 21:KeyBuffer=RIGHT;/*if(snake.directi

6、on!=4)snake.direction=3;*/break;case 25:KeyBuffer=LEFT;/*if(snake.direction!=3)snake.direction=4;*/break;default:break;6、画墙壁,初始化界面:6、画墙壁,初始化界面:第 7 页 共 24 页7、打印成绩:7、打印成绩:8、打印速度级别:8、打印速度级别:第 8 页 共 24 页9、游戏结束处理:9、游戏结束处理:10、游戏的具体过程,也是贪吃蛇算法的关键部分:10、游戏的具体过程,也是贪吃蛇算法的关键部分:void GamePlay(void)unsigned char n;

7、InitRandom(TL0);food.yes=1;/1 表示需要出现新事物,0 表示已经存在食物尚未吃掉snake.life=0;/表示蛇还活着snake.direction=DOWN;snake.x0=6;snake.y0=6;snake.x1=3;snake.y1=6;snake.node=2;PrintScore();PrintSpeed();while(1)if(food.yes=1)while(1)food.x=Random()*85+3;food.y=Random()*55+3;/获得随机数while(food.x%3!=0)food.x+;while(food.y%3!=0)

8、第 9 页 共 24 页food.y+;for(n=0;n0;n-)snake.xn=snake.xn-1;snake.yn=snake.yn-1;switch(snake.direction)case DOWN:snake.x0+=3;break;case UP:snake.x0-=3;break;case RIGHT:snake.y0-=3;break;case LEFT:snake.y0+=3;break;default:break;for(n=3;nsnake.node;n+)/从第三节开始判断蛇头是否咬到自己if(snake.xn=snake.x0&snake.yn=snake.y0

9、)GameOver();snake.life=1;break;if(snake.x0=90|snake.y0=60)/判蛇头是否撞到墙壁GameOver();snake.life=1;第 10 页 共 24 页if(snake.life=1)break;/蛇死,则跳出 while(1)循环if(snake.x0=food.x&snake.y0=food.y)/判蛇是否吃到食物Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,0);/消隐食物snake.xsnake.node=200;snake.ysnake.node=200;/产生蛇新的节坐标先放在看

10、不见的位置snake.node+;/蛇节数加 1food.yes=1;/食物标志置 1if(+Score=PASSSCORE)PrintScore();GameOver();break;PrintScore();for(n=0;n=10)Speed=1;PrintSpeed();break;case DOWN:KeyBuffer=0;if(snake.direction!=UP)snake.direction=DOWN;break;case UP:KeyBuffer=0;if(snake.direction!=DOWN)snake.direction=UP;break;case RIGHT:第

11、 11 页 共 24 页KeyBuffer=0;if(snake.direction!=LEFT)snake.direction=RIGHT;break;case LEFT:KeyBuffer=0;if(snake.direction!=RIGHT)snake.direction=LEFT;break;default:break;/结束 while(1)void Main()InitCpu();/初始化 CPULcd_Reset();/初始化 LCD 屏Lcd_Clear(0);/清屏Lcd_WriteStr(0,0,制作者:王然、孙远、黄漠啸、刘林);delay(3000);InitCpu(

12、);Lcd_Reset();Lcd_Clear(0);DrawBoard();/画界面GamePlay();/玩游戏GameOver();/游戏结束while(1);11、LCD1286411、LCD12864#include Reg52.h#include intrins.h#include Lcd12864.h/*测试 LCD 是否处于忙状态如果忙则返回 0 x80,否则返回 0*/第 12 页 共 24 页unsigned char Lcd_CheckBusy(void)unsigned char Busy;LcdData=0 xff;RS=0;RW=1;E=1;_nop_();Busy

13、=LcdData&0 x80;E=0;return Busy;/*向 LCD 写入字节数据*/void Lcd_WriteData(unsigned char Data)while(Lcd_CheckBusy();RS=1;RW=0;E=0;_nop_();_nop_();LcdData=Data;E=1;_nop_();_nop_();E=0;/*从 LCD 中读出数据*/unsigned char Lcd_ReadData(void)unsigned char Temp;while(Lcd_CheckBusy();LcdData=0 xff;RS=1;RW=1;E=1;_nop_();Te

14、mp=LcdData;第 13 页 共 24 页E=0;return Temp;/*想 LCD 中写入指令代码*/void Lcd_WriteCmd(unsigned char CmdCode)while(Lcd_CheckBusy();RS=0;RW=0;E=0;_nop_();_nop_();LcdData=CmdCode;_nop_();_nop_();E=1;_nop_();_nop_();E=0;/*向 LCD 指定起始位置写入一个字符串*/void Lcd_WriteStr(unsigned char x,unsigned char y,unsigned char*Str)if(y

15、3)|(x7)return;/如果指定位置不在显示区域内,则不做任何写入直接返回EA=0;switch(y)case 0:Lcd_WriteCmd(0 x80+x);break;case 1:Lcd_WriteCmd(0 x90+x);break;case 2:Lcd_WriteCmd(0 x88+x);break;case 3:第 14 页 共 24 页Lcd_WriteCmd(0 x98+x);break;while(*Str0)Lcd_WriteData(*Str);Str+;EA=1;/*为加速逻辑运算而设置的掩码表,这是以牺牲空间而换取时间的办法*/code unsigned int

16、 MaskTab=0 x0001,0 x0002,0 x0004,0 x0008,0 x0010,0 x0020,0 x0040,0 x0080,0 x0100,0 x0200,0 x0400,0 x0800,0 x1000,0 x2000,0 x4000,0 x8000;/*向 LCD 指定坐标写入一个象素,象素颜色有两种,0 代表白(无显示),1 代表黑(有显示)*/void Lcd_PutPixel(unsigned char x,unsigned char y,unsigned char Color)unsigned char z,w;unsigned int Temp;if(x=12

17、8|y=64)return;Color=Color%2;w=15-x%16;/确定对这个字的第多少位进行操作x=x/16;/确定为一行上的第几字if(y32)/如果为上页z=0 x80;else/否则如果为下页z=0 x88;y=y%32;EA=0;Lcd_WriteCmd(0 x36);Lcd_WriteCmd(y+0 x80);/行地址Lcd_WriteCmd(x+z);/列地址Temp=Lcd_ReadData();/先空读一次Temp=(unsigned int)Lcd_ReadData()8);/先写入高 8 位,再写入低 8 位Lcd_WriteData(Temp&0 x00ff)

18、;Lcd_WriteCmd(0 x30);EA=1;/*从 LCD 指定坐标读取象素颜色值*/unsigned char Lcd_ReadPixel(unsigned char x,unsigned char y)unsigned char z,w;unsigned int Temp;x=x%128;y=y%64;w=15-x%16;/确定对这个字的第多少位进行操作x=x/16;/确定为一行上的第几字if(y32)/如果为上页z=0 x80;else/否则如果为下页z=0 x88;y=y%32;Lcd_WriteCmd(0 x36);Lcd_WriteCmd(y+0 x80);/行地址Lcd_

19、WriteCmd(x+z);/列地址Temp=Lcd_ReadData();/先空读一次Temp=(unsigned int)Lcd_ReadData()8;/再读出高 8 位Temp|=(unsigned int)Lcd_ReadData();/再读出低 8 位if(Temp&MaskTabw)=0)return 0;elsereturn 1;第 16 页 共 24 页/*向 LCD 指定位置画一条长度为 Length 的指定颜色的水平线*/void Lcd_HoriLine(unsigned char x,unsigned char y,unsigned char Length,unsig

20、ned char Color)unsigned char i;if(Length=0)return;for(i=0;iLength;i+)Lcd_PutPixel(x+i,y,Color);/*向 LCD 指定位置画一条长度为 Length 的指定颜色的垂直线*/void Lcd_VertLine(unsigned char x,unsigned char y,unsigned char Length,unsigned char Color)unsigned char i;if(Length=0)return;for(i=0;iLength;i+)Lcd_PutPixel(x,y+i,Colo

21、r);/*向 LCD 指定起始坐标和结束坐标之间画一条指定颜色的直线*/void Lcd_Line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsignedchar Color)unsigned int x,y;unsigned int d_x,d_y;/d_x=x2-x1;d_y=y2-y1;int err=0;unsigned char temp=0;if(y2x2)x=x1;x1=x2;x2=x;for(x=x1;x=x1)temp=1;d_x=x2-x1;elsed_x=x1-x2;x=x1

22、;y=y1;Lcd_PutPixel(x,y,1);if(temp&(d_y=d_x)while(x!=x2)if(errd_x)while(y!=y2)d_x=x2-x;d_y=y2-y;if(err0)x=x+1;y=y+1;err=err+d_y-d_x;elsey=y+1;err=err-d_x;Lcd_PutPixel(x,y,Color);else if(!temp&(d_y=d_x)while(x!=x2)d_x=x-x2;d_y=y2-y;if(errd_x)while(y!=y2)第 19 页 共 24 页d_x=x-x2;d_y=y2-y;if(errx1)Temp=x0;

23、x0=x1;x1=Temp;if(y0y1)Temp=y0;y0=y1;y1=Temp;Lcd_VertLine(x0,y0,y1-y0+1,Color);Lcd_VertLine(x1,y0,y1-y0+1,Color);Lcd_HoriLine(x0,y0,x1-x0+1,Color);Lcd_HoriLine(x0,y1,x1-x0+1,Color);/*第 20 页 共 24 页对称法画圆的 8 个镜像点*/void CircleDot(unsigned char x,unsigned char y,char xx,char yy,unsigned char Color)/内部函数,对

24、称法画圆的 8 个镜像点Lcd_PutPixel(x+yy),(y+xx),Color);/第 1 个 8 分圆Lcd_PutPixel(x+xx),(y+yy),Color);/第 2 个 8 分圆Lcd_PutPixel(x-xx),(y+yy),Color);/第 3 个 8 分圆Lcd_PutPixel(x-yy),(y+xx),Color);/第 4 个 8 分圆Lcd_PutPixel(x-yy),(y-xx),Color);/第 5 个 8 分圆Lcd_PutPixel(x-xx),(y-yy),Color);/第 6 个 8 分圆Lcd_PutPixel(x+xx),(y-yy

25、),Color);/第 7 个 8 分圆Lcd_PutPixel(x+yy),(y-xx),Color);/第 8 个 8 分圆/*向 LCD 指定圆心坐标画一个半径为 r 的指定颜色的圆*/void Lcd_Circle(unsigned char x,unsigned char y,unsigned char r,unsigned char Color)/中点法画圆/中点法画圆unsigned char xx,yy;char deltax,deltay,d;xx=0;yy=r;deltax=3;deltay=2-r-r;d=1-r;CircleDot(x,y,xx,yy,Color);/对

26、称法画圆的 8 个镜像点while(xxyy)if(d0)d+=deltax;deltax+=2;xx+;elsed+=deltax+deltay;deltax+=2;deltay+=2;xx+;yy-;第 21 页 共 24 页CircleDot(x,y,xx,yy,Color);/对称法画圆的 8 个镜像点/*清除 Lcd 全屏,如果清除模式 Mode 为 0,则为全屏清除为颜色 0(无任何显示)否则为全屏清除为颜色 1(全屏填充显示)*/void Lcd_Clear(unsigned char Mode)unsigned char x,y,ii;unsigned char Temp;if

27、(Mode%2=0)Temp=0 x00;elseTemp=0 xff;Lcd_WriteCmd(0 x36);/扩充指令 绘图显示for(ii=0;ii9;ii+=8)for(y=0;y0 x20;y+)for(x=0;x8;x+)EA=0;Lcd_WriteCmd(y+0 x80);/行地址Lcd_WriteCmd(x+0 x80+ii);/列地址Lcd_WriteData(Temp);/写数据 D15D8Lcd_WriteData(Temp);/写数据 D7D0EA=1;Lcd_WriteCmd(0 x30);/*LCD 初始化*/void Lcd_Reset()PSB=1;Lcd_Wr

28、iteCmd(0 x30);/选择基本指令集Lcd_WriteCmd(0 x0c);/开显示(无游标、不反白)Lcd_WriteCmd(0 x01);/清除显示,并且设定地址指针为 00HLcd_WriteCmd(0 x06);/指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位第 22 页 共 24 页12、主程序:、主程序:四、调试结果四、调试结果1、开始画面:1、开始画面:2、游戏界面:2、游戏界面:第 23 页 共 24 页3、游戏结束画面:3、游戏结束画面:第 24 页 共 24 页五、功能介绍五、功能介绍单片机最小系统从网上买到,然后根据店家所给的最小系统原理图焊接。游戏功能介绍:本游戏速度可根据蛇身的长度来自动改变,预设得分为单片机最小系统从网上买到,然后根据店家所给的最小系统原理图焊接。游戏功能介绍:本游戏速度可根据蛇身的长度来自动改变,预设得分为 20 分则游戏结束,提示“过关”,如果期间死了,则提示“分则游戏结束,提示“过关”,如果期间死了,则提示“you lostgame over”。此时按下开始键即可重新开始本游戏。”。此时按下开始键即可重新开始本游戏。六、参考。六、参考。SnakeGame

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 休闲娱乐

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁