贪吃蛇总结范文.doc_第1页
贪吃蛇总结范文.doc_第2页
贪吃蛇总结范文.doc_第3页
贪吃蛇总结范文.doc_第4页
贪吃蛇总结范文.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

贪吃蛇总结范文 8.15周一上网搜集点阵贪吃蛇的参考资料并分析参考资料分析贪吃蛇游戏的要点 (1)蛇身信息(用何种方式储存每个蛇身点的坐标,蛇身的移动及方向) (2)食物的产生及位置 (3)食物与蛇身的显示 (4)接触检测(与自身是否碰撞,与墙是否碰撞,是否接触到食物等) (5)蛇体增长8.16周二解决要点 (1)(蛇身点部分及移动部分,方向部分后来周四时改进解决)及 (3)的蛇身部分 (1)蛇身信息定义一个结构体数组,用来储存蛇身坐标。 代码蛇体移动(此处应用队列数据结构的思想,附图为百度资料)另声明一个char head;一个char tail;,则该数组snakehead则代表蛇头,snaketail代表蛇尾,蛇体的移动方式是点亮下一个点,并使其成为新的蛇头(head+),然后熄灭蛇尾,且使现时最后的点成为新的蛇尾(tail+)。 (当head或tail超过数组元素最大值时,其值清0,以此构成队列数据结构。 )百度资料:代码(其中value_snake(tail,8,8)会熄灭尾灯,稍后会提及。 )此处的蛇头移动方向无法被定时移动部分使用。 (后来在周四解决掉了) (3)蛇身的显示这里采取逐点显示的方式来显示蛇身每点。 首先,据点阵工作原理,先将蛇身某点的坐标转换成字节的形式(如x=0为00000001,y=0为11111111),然后再赋给对应IO口(此处设置为P1与P2),短暂延时后再显示下一个点。 具体代码如下总效果如图(仍未实现定向移动与食物产生)8.17周三解决要点 (2):此处使用rand()函数作为食物坐标的种子,经过与蛇身各点的对比,排除掉与蛇身重叠的点后,产生食物的坐标,并用一个结构体来保存。 代码效果8.18周四解决蛇头移动方向和定向移动问题蛇头移动方向一开始我采取的方案是直接在按键检测函数中使旧蛇头的x,y坐标加减一个数然后赋给新蛇头以完成向一个方向的移动,但这样的话,定向移动的时候没办法找到方向。 所以我定义了全局变量char dx,dy;作为移动方向。 例如,当dx=1时,snakehead.x+dx即为向右移动。 这样以来,在定时中断也可以引用dx,dy作为方向了。 代码蛇头移动定时移动8.19周五解决了接触检测(食物检测部分)和蛇体增长的问题如何检测是否吃到食物:这里我采取了蛇头与食物坐标对比的方法,若x,y坐标完全相同,则证明蛇吃到了食物,则增长蛇体。 蛇体增长如果吃到了食物,则在这一次检测中不熄灭尾灯,而蛇头依旧变化,蛇的长度就增加1了。 代码效果直至周日,这个贪吃蛇的小游戏已经算是实现了基本的功能,但仍有比较多的bug (1)食物有时出现在蛇身里 (2)无法检测是否撞墙 (3)开始时还没移动的时候按键会导致游戏直接结束这两天我在调试程序,打算把这些bug清除后补充另外一些功能 (1)计分,并用LCD显示 (2)在达到一定程度后加速 (3)游戏结束后用LCD显示总分目前总程序代码如下#include#include#define max20sbit t=P37;/测试行sbit up=P30;sbit down=P31;sbit left=P32;sbit right=P33;char head,tail;char dx=1,dy=0;bit key_flag=0;bit food_flag=1;bit over=0;/char a=0;/*定时器初始化函数*/void TimerInit(void)/50毫秒12.000MHzEA=1;ET0=1;TMOD&=0xF0;/设置定时器模式TMOD|=0x01;/设置定时器模式TL0=0xB0;/设置定时初值TH0=0x3C;/设置定时初值TF0=0;/清除TF0标志TR0=1;/定时器0开始计时/*定义蛇身结构体*/typedef structchar x;char y;snakebody;snakebody snakemax;/*定义食物结构体*/typedef structchar x;char y;snakefood;snakefood food;/*延时函数*/void delay(char MS)char us,usn;while(MS!=0)usn=0;while(usn!=0)us=0xff;while(us!=0)us-;usn-;MS-;/*坐标转化成字节,以便显示*/unsigned charmux(unsigned chartemp)if(temp=8)return0;else if(temp=7)return128;else if(temp=6)return64;else if(temp=5)return32;else if(temp=4)return16;else if(temp=3)return8;else if(temp=2)return4;else if(temp=1)return2;else if(temp=0)return1;/*点阵显示*/void display()char i;if(over)P2=255;P1=0;elseif(headtail)for(i=0;i=(head-tail);i+)P2=mux(snaketail+i.x);P1=255-mux(snaketail+i.y);delay (100);P1=0xff;elsefor(i=0;itail)for(i=tail;i=max-1)value_snake(0,snakehead.x+dx,snakehead.y+dy);head=0;elsehead+;value_snake(head,snakehead-1.x+dx,snakehead-1.y+dy);/此处碰墙可当作游戏结束(后期再补充)/value_snake(tail,8,8);/if(snakehead.x=8)snakehead.x=0;/if(snakehead.y=8)snakehead.y=0;/if(snakehead.x0)snakehead.x=7;/if(snakehead.y=max)tail=0;/*食物产生函数*/void rand_food()bit flag1;char x,y;char i;flag1=0;if(food_flag)food_flag=0;while(!flag1)/一直循环直到找到合要求的坐标while(!(x=(char)(rand()%10)8)&(y=(char)(rand()%10)tail)for(i=0;i=(head-tail);i+)if(snakei.x=x)&(snakei.y=y)flag1=0;else flag1=1;elsefor(i=0;i=20)/定向移动t=0;if(head=max-1)value_snake(0,snakehead.x+dx,snakehead.y+dy);head=0;elsehead+;value_snake(head,snakehead-1.x+dx,snakehead-1.y+dy);/此处碰墙可当作

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论