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(x1right||y1bottom)
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++;
}
以下是测试效果图