贪吃蛇c语言链表详解,编《贪吃蛇》最简单的算法,链表法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#include

#include

#include

#include

#include

#define ESC 0x011b

#define UP 0x4800

#define DOWN 0x5000

#define LEFT 0x4b00

#define RIGHT 0x4d00

struct rode

{int x;

int y;

struct rode *next;

};

struct rode *head,food;

void initgra()

{int dr=DETECT,mode=0;

registerbgidriver(EGAVGA_driver);

initgraph(&dr,&mode,"");

}

int message(char *s)

{ char c;

setfillstyle(1,4);

setcolor(1);

settextstyle(0,0,3);

bar(640/2-200,480/2-50,640/2+250,480/2+50);

outtextxy(640/2-200,480/2-20,s);

c=getch();

sleep(2);

if(c=='n'|| c=='N')return(0);else return(1);

}

initgame()

{

int i;

randomize();

cleardevice();

clear();

setbkcolor(15);

setcolor(4);

for(i=0;i<=640;i+=20) line(i,0,i,479);

for(i=0;i<=480;i+=20) line(0,i,639,i);

add(5,5);

add(5,6);

add(5,7);

rndfood();

getch();

}

add(int x,int y)

{

struct rode *newrode;

newrode=(struct rode*)malloc(sizeof(struct rode));

newrode->x=x;

newrode->y=y;

newrode->next=head;

head=newrode;

draw(x,y);

}

delete()

{struct rode *p1,*p2;

p1=p2=head;

while (p1->next !=NULL) {

p2=p1;

p1=p1->next;

}

redraw(p1->x,p1->y);

free(p1);

p2->next=NULL;

}

long getkey(long oldkey)

{long k;

if(bioskey(1)==0) return 0;

k=bioskey(0);

if(oldkey==UP && k==DOWN) return 0;

if(oldkey==DOWN &&k==UP) return 0;

if(oldkey==RIGHT&&k==LEFT) return 0;

if(oldkey==LEFT&&k==RIGHT) return 0;

return k;

}

clear()

{struct rode *p1,*p2;

p1=p2=head;

while(p1){

p2=p1->next;

free(p1);

p1=p2;

}

head=NULL;

}

draw(int x,int y)

{setcolor(1);

setfillstyle(1,1);

bar((x-1)*20+1,(y-1)*20+1,x*20-1,y*20-1);

}

redraw(int x,int y)

{int c;

c=getbkcolor();

setcolor©;

setfillstyle(1,c);

bar((x-1)*20+1,(y-1)*20+1,x*20-1,y*20-1);

}

rndfood()

{

food.x=random(31)+1;

food.y=random(23)+1;

draw(food.x,food.y);

}

gameover()

{clear();

closegraph();

exit(1);

}

main()

{struct time t;

int oldtime;

long key,oldkey;

int nx,ny,x,y;

long getkey(long oldtime);

initgra();

again:

initgame();

x=0;

y=1;

oldkey=DOWN;

key=DOWN;

gettime(&t);

oldtime=t.ti_hund;

while(key!=ESC)

{gettime(&t);

if((t.ti_hund+100-oldtime)%100<40)

{

if((key=getkey(oldkey))!=0)

{

switch(key)

{case UP:x=0;y=-1;break;

case DOWN:x=0;y=1;break;

case LEFT:x=-1;y=0;break;

case RIGHT:x=1;y=0;break;

default:continue;

}

oldkey=key;

}

}

else{

oldtime=t.ti_hund;

nx=head->x+x;

ny=head->y+y;

if(nx==food.x && ny==food.y)

{

add(food.x,food.y);

rndfood();

continue;

}

if(nx>32||nx <1 ||ny >24 ||ny<1)

if (message("Do you want play again?[Y/N]") ) goto again;

else

gameover();

delete();

add(nx,ny);

}

}

gameover();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值