字符版贪吃蛇
2009-07-26 08:32
190 查看
Code:
/*TC下测试通过*/
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define S struct snakepart /* 蛇节结构体 */
#define LENGTH sizeof(S) /* 结构体长度 */
void creat(void);
void printscore(int n);
void gameover(void);
void game(void);
S
{
int x,y; /* 蛇节坐标 */
S *last; /* 上个蛇节地址 */
};
enum direction
{left,right,down,up};
main()
{
creat();
game();
sleep(1);
getch();
}
void creat(void)/* 建立围栏 */
{
int i,j;
gotoxy(2,2);
for(i=0;i<78;i++)
putchar('#');
gotoxy(2,24);
for(;i>0;i--)
putchar('#');
for(i=3;i<24;i++)
{
gotoxy(2,i);
putchar('#');
gotoxy(79,i);
putchar('#');
}
}
void game(void)
{
S *phead,*ptail,*p;/* 蛇头 蛇尾 检查蛇是否撞到自己 */
int foodx,foody;/* 食物坐标 */
int life=0,score=0;/* 蛇活着 分数为0 */
int food=0;/* 是否需要食物 */
int key;/* 接收按键 */
int n;
enum direction fx;
fx=left;/* 方向向左 */
printscore(score);
randomize();
foodx=3+random(76);
foody=3+random(21);
gotoxy(foodx,foody);
putchar('/17');/* 输出食物 */
phead=malloc(LENGTH);
phead->x=40;
phead->y=13;
phead->last=ptail=malloc(LENGTH);
ptail->x=41;
ptail->y=13;
ptail->last=phead;
gotoxy(phead->x,phead->y);
printf("/4/4/b/b"); /* 输出蛇 */
sleep(2);/* 暂停一下 */
while(1)
{
while(!kbhit())
{
while(food)/* 输出食物 */
{
foodx=3+random(76);
foody=3+random(21);
gotoxy(foodx,foody);
putchar('/17');
food=0;
for(p=ptail;p!=phead;p=p->last)
if(p->x==foodx&&p->y==foody)/* 检查食物是否出现在蛇身体里 */
{
food=1;
}
}
gotoxy(ptail->x,ptail->y);
putchar(' ');/* 把蛇尾擦掉 */
ptail->x=phead->x;
ptail->y=phead->y;
switch(fx)
{
case left :ptail->x=phead->x-1;break;
case right:ptail->x=phead->x+1;break;
case down :ptail->y=phead->y+1;break;
case up :ptail->y=phead->y-1;break;
}
phead=ptail;
ptail=ptail->last;
gotoxy(phead->x,phead->y);
printf("/4/b");
if(phead->x==2||phead->x==79||phead->y==2||phead->y==24)/* 是否撞到墙 */
{
life=1;
gameover();
}
for(p=ptail;p!=phead;p=p->last)
if(p->x==phead->x&&p->y==phead->y)
{
life=1;
gameover();
}
if(life) /* 如果蛇死 */
break; /* 跳出循环 */
if(phead->x==foodx&&phead->y==foody)
{
food=1;/* 需要食物 */
score+=10;
printscore(score);
phead->last=malloc(LENGTH);/* 新蛇尾 */
phead->last->last=ptail;
ptail=phead->last;
}
for(n=0;n<50;n++)
delay(2000-score);
}
if(life)
break;
if((key=bioskey(0))==ESC)
break;
switch(key)
{
case LEFT:if(fx!=right)fx=left;break;
case RIGHT:if(fx!=left)fx=right;break;
case DOWN:if(fx!=up)fx=down;break;
case UP:if(fx!=down)fx=up;break;
}
}
}
void printscore(int n)
{
gotoxy(1,1);
textcolor(2);
cprintf("score:%5d",n);
}
void gameover(void)
{
gotoxy(33,12);
printf("Game Over!");
}
/*TC下测试通过*/
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define S struct snakepart /* 蛇节结构体 */
#define LENGTH sizeof(S) /* 结构体长度 */
void creat(void);
void printscore(int n);
void gameover(void);
void game(void);
S
{
int x,y; /* 蛇节坐标 */
S *last; /* 上个蛇节地址 */
};
enum direction
{left,right,down,up};
main()
{
creat();
game();
sleep(1);
getch();
}
void creat(void)/* 建立围栏 */
{
int i,j;
gotoxy(2,2);
for(i=0;i<78;i++)
putchar('#');
gotoxy(2,24);
for(;i>0;i--)
putchar('#');
for(i=3;i<24;i++)
{
gotoxy(2,i);
putchar('#');
gotoxy(79,i);
putchar('#');
}
}
void game(void)
{
S *phead,*ptail,*p;/* 蛇头 蛇尾 检查蛇是否撞到自己 */
int foodx,foody;/* 食物坐标 */
int life=0,score=0;/* 蛇活着 分数为0 */
int food=0;/* 是否需要食物 */
int key;/* 接收按键 */
int n;
enum direction fx;
fx=left;/* 方向向左 */
printscore(score);
randomize();
foodx=3+random(76);
foody=3+random(21);
gotoxy(foodx,foody);
putchar('/17');/* 输出食物 */
phead=malloc(LENGTH);
phead->x=40;
phead->y=13;
phead->last=ptail=malloc(LENGTH);
ptail->x=41;
ptail->y=13;
ptail->last=phead;
gotoxy(phead->x,phead->y);
printf("/4/4/b/b"); /* 输出蛇 */
sleep(2);/* 暂停一下 */
while(1)
{
while(!kbhit())
{
while(food)/* 输出食物 */
{
foodx=3+random(76);
foody=3+random(21);
gotoxy(foodx,foody);
putchar('/17');
food=0;
for(p=ptail;p!=phead;p=p->last)
if(p->x==foodx&&p->y==foody)/* 检查食物是否出现在蛇身体里 */
{
food=1;
}
}
gotoxy(ptail->x,ptail->y);
putchar(' ');/* 把蛇尾擦掉 */
ptail->x=phead->x;
ptail->y=phead->y;
switch(fx)
{
case left :ptail->x=phead->x-1;break;
case right:ptail->x=phead->x+1;break;
case down :ptail->y=phead->y+1;break;
case up :ptail->y=phead->y-1;break;
}
phead=ptail;
ptail=ptail->last;
gotoxy(phead->x,phead->y);
printf("/4/b");
if(phead->x==2||phead->x==79||phead->y==2||phead->y==24)/* 是否撞到墙 */
{
life=1;
gameover();
}
for(p=ptail;p!=phead;p=p->last)
if(p->x==phead->x&&p->y==phead->y)
{
life=1;
gameover();
}
if(life) /* 如果蛇死 */
break; /* 跳出循环 */
if(phead->x==foodx&&phead->y==foody)
{
food=1;/* 需要食物 */
score+=10;
printscore(score);
phead->last=malloc(LENGTH);/* 新蛇尾 */
phead->last->last=ptail;
ptail=phead->last;
}
for(n=0;n<50;n++)
delay(2000-score);
}
if(life)
break;
if((key=bioskey(0))==ESC)
break;
switch(key)
{
case LEFT:if(fx!=right)fx=left;break;
case RIGHT:if(fx!=left)fx=right;break;
case DOWN:if(fx!=up)fx=down;break;
case UP:if(fx!=down)fx=up;break;
}
}
}
void printscore(int n)
{
gotoxy(1,1);
textcolor(2);
cprintf("score:%5d",n);
}
void gameover(void)
{
gotoxy(33,12);
printf("Game Over!");
}