8乘8点阵贪吃蛇源代码.docx
- 文档编号:1661065
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:15
- 大小:2.03MB
8乘8点阵贪吃蛇源代码.docx
《8乘8点阵贪吃蛇源代码.docx》由会员分享,可在线阅读,更多相关《8乘8点阵贪吃蛇源代码.docx(15页珍藏版)》请在冰点文库上搜索。
8乘8点阵贪吃蛇源代码
//writer:
neolone
//bug:
当蛇身全部在第二列上时,第四列会同时显示
//问题1:
蛇的最大长度是33,因为51存储空间不足了,其实可以用一位uchar存储两个数,用它//的十位个位就行
//问题2:
随着蛇的增长速度会减慢,因为每显示一节就会delay
(2),这样就会增加时间,可以把151行的延时做成随length增加减少的量
//我懒得改了,如果你改好的话希望发一份到我邮箱lllllbbbbbsz@,在此先谢过了~
#include
#include
#defineucharunsignedchar
#defineTRUE1
#defineFALSE0
#defineMAX_LENGTH33/*maxlengthofsnakenodess*/
#defineGAME_SPEED100/*gamespeed*/
#defineUP1
#defineDOWN2
#defineLEFT3
#defineRIGHT4
sbitKEY_UP=P2^3;/*定义按键*/
sbitKEY_DOWN=P2^1;
sbitKEY_LEFT=P2^6;
sbitKEY_RIGHT=P2^2;
sbitSTART=P2^7;
unsignedcharzong[8]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};//点阵P0=zong[k]就能让k位为高
unsignedchargreen[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsignedcharred[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
/*datastructure*/
structPoint{
ucharx,y;
};
structSnake{
structPointnodes[MAX_LENGTH];
ucharlength;
uchardirection;
ucharlive;
}snake;
structFood{
structPointposition;
ucharexist;
}food;
int/*score=0,*/lastx,lasty,keyCode,keyCode2,sp=10,l;
ucharleft=0,top=0,right=7,bottom=7;
/*functionsdeclaration*/
voidinit(void);
voidgamePlay(void);
//voidclose(void);
voiddrawWall(void);
voidcreateFood(void);
voiddrawFood(void);
voiddrawSnake(void);
//voiddrawScore(void);
uchartouchWall(void);
uchartouchSelf(void);
voidgameOver(void);
voidmoveSnake(void);
intoppositeDirection(intkeyCode);
intfoodEat(void);
voidexpandSnake(void);
voidselect(void);
uchargetKey(void);
/*------------------------*/
voidmain(){
init();
l=1;
while(l)
{
gamePlay();
}
//close();
gameOver();
}
voiddelay(ucharz)
{
ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
;
}
voiddelay_50us(unsignedchart)
{
unsignedcharj;
for(;t>0;t--)
for(j=19;j>0;j--);
}
voidinit(){
snake.nodes[0].x=3;
snake.nodes[0].y=3;
snake.nodes[1].x=4;
snake.nodes[1].y=3;
snake.length=2;
snake.live=1;
snake.direction=UP;
//score=0;
food.exist=0;
srand(5);/*suijishufashengqi*/
}
/*voidclose(){
while
(1)
{
P0=0xff;
P1=0x0;
}
}*/
voidgamePlay(){
intd;
ucharkeyCode;
while(START);//等待按开始键
while(TRUE){
//drawScore();
if(touchWall()||touchSelf()){
gameOver();
return;
}
if(!
food.exist)createFood();
food.exist=1;
for(d=0;d<(sp*36);d++)
{
drawFood();
drawSnake();
}
keyCode=getKey();
lastx=snake.nodes[snake.length-1].x;
lasty=snake.nodes[snake.length-1].y;
if(!
oppositeDirection(keyCode))
{
snake.direction=keyCode;
}
moveSnake();
if(foodEat()){
food.exist=FALSE;
//score+=10;
expandSnake();
}
}
}
uchargetKey()
{
if(!
KEY_UP)
{
delay_50us
(2);
if(!
KEY_UP)
{
returnUP;
}
}
if(!
KEY_DOWN)
{
delay_50us
(2);
if(!
KEY_DOWN)
{
returnDOWN;
}
}
if(!
KEY_LEFT)
{
delay_50us
(2);
if(!
KEY_LEFT)
{
returnLEFT;
}
}
if(!
KEY_RIGHT)
{
delay_50us
(2);
if(!
KEY_RIGHT)
{
returnRIGHT;
}
}
returnsnake.direction;//什么都没按
}
voidcreateFood(){
inti;
label:
food.position.x=((int)rand()%8);
food.position.y=((int)rand()%8);
for(i=0;i<=snake.length-1;i++){
if(snake.nodes[i].x==food.position.x&&snake.nodes[i].y==food.position.y)
gotolabel;
}
//food.position.x=1;
//food.position.y=1;
}
voiddrawFood(){
P0=zong[food.position.x];
P1=green[food.position.y];
delay
(2);
P0=0;
P1=0xff;
}
voiddrawSnake(){
intj;
for(j=0;j<=snake.length-1;j++)
{
P0=zong[snake.nodes[j].x];
P3=red[snake.nodes[j].y];
delay
(2);
P3=0xff;
P0=0;
}
}
uchartouchWall(){
ucharx1=snake.nodes[0].x;
uchary1=snake.nodes[0].y;
if(x1
returnTRUE;
else
returnFALSE;
}
uchartouchSelf(){
uchari;
for(i=3;i { if(snake.nodes[0].x==snake.nodes[i].x&&snake.nodes[0].y==snake.nodes[i].y) returnTRUE; } returnFALSE; } voidgameOver(){ while (1) { P3=0xff; P0=0xff; P1=0x0; } } voidmoveSnake(){ intk; lastx=snake.nodes[snake.length-1].x; lasty=snake.nodes[snake.length-1].y; //用 //bar(snake.nodes[snake.length-1].x,snake.nodes[snake.length-1].y,snake.nodes[snake.length-1].x+10,snake.nodes[snake.length-1].y+10); //P0=zong[snake.nodes[snake.length-1].x]; //P3=red[snake.nodes[snake.length-1].y]; //P0=0; //P3=0xff; for(k=snake.length-2;k>=0;k--) { snake.nodes[k+1].x=snake.nodes[k].x; snake.nodes[k+1].y=snake.nodes[k].y; } if(snake.direction==UP) snake.nodes[0].y-=1; elseif(snake.direction==DOWN) snake.nodes[0].y+=1; elseif(snake.direction==LEFT) snake.nodes[0].x-=1; elseif(snake.direction==RIGHT) snake.nodes[0].x+=1; else ; } intoppositeDirection(intkeyCode){ if(keyCode==UP&&snake.direction==DOWN){ return1; } elseif(keyCode==DOWN&&snake.direction==UP){ return1; } elseif(keyCode==LEFT&&snake.direction==RIGHT){ return1; } elseif(keyCode==RIGHT&&snake.direction==LEFT){ return1; } else return0; } intfoodEat(){ if(snake.nodes[0].x==food.position.x&&snake.nodes[0].y==food.position.y) return1; else return0; } voidexpandSnake(){ if(keyCode==UP){ lastx-=1; } elseif(keyCode==DOWN){ lastx+=1; } elseif(keyCode==LEFT){ lasty-=1; } elseif(keyCode==RIGHT){ lasty+=1; } else ; snake.nodes[snake.length].x=lastx; snake.nodes[snake.length].y=lasty; snake.length++; } 以下是测试效果图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 点阵 贪吃 源代码