发个字符界面的贪食蛇。
/*-----snake.c-----*/#include <stdio.h>
#include <conio.h>
#include <bios.h>
#include <stdlib.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
/*-----函数定义-----*/
void Print_welcome(void); /* 欢迎信息 */
void Print_moze(); /* 画出地图 */
void Get_key(); /* 接收按键 */
void Game(); /* 游戏过程 */
void Print_food(); /* 输出食物 */
void wall_pass(); /* 是否撞墙 */
void hit_own(); /* 撞到自己 */
void eat_food(); /* 吃到食物 */
void Game_over(); /* 游戏结束 */
/*-----数据结构定义-----*/
struct node /*蛇身节点的x,y坐标,和蛇的生命。*/
{
int x,y;
};
struct food /*食物的x,y坐标,和食物状态,life为1时食物有,life为0时需要出现食物*/
{
int x,y;
int life;
}food;
struct node snakexy[300]; /*存储蛇身坐标*/
int turnx[40],turny[40],turn_count,length; /*蛇身转角坐标和蛇的转角数和蛇身长度*/
int life; /*当life为0时蛇死,为1时蛇活着。*/
enum fangxiang{null,up,down,left,right} way; /*蛇的方向*/
int key,key_pre,score; /*按键和分数*/
int i;
/*-----主函数-----*/
int main(void)
{
Print_welcome();
getch();
clrscr();
Print_moze();
Game();
getch();
return 0;
}
/*-----输出欢迎信息-----*/
void Print_welcome(void)
{
window(0,0,80,25);
textbackground(WHITE);
textcolor(YELLOW);
clrscr();
gotoxy(25,11);
cprintf("Welcome to snake game!\n");
gotoxy(32,12);
cprintf(" have fun!");
gotoxy(25,13);
cprintf("Press any key to start!");
}
/*-----画出地图-----*/
void Print_moze(void)
{
int i;
gotoxy(36,1);
printf("score:%d",score);
printf("");
gotoxy(1,2);
for(i=0;i<80;i++)
putchar('-');
}
/*-----游戏过程----*/
void Game(void)
{
randomize(); /*随机数生成*/
life=1; /*生命为活*/
food.life=1; /*需要出现食物*/
score=0; /*分数为0*/
length=3; /*蛇身初始长度为1*/
/* way=null; */ /*没有方向*/
turn_count=0; /*拐角数为0*/
snakexy[0].x=1; /*蛇的第一个节点坐标 */
snakexy[0].y=3;
snakexy[1].x=2;
snakexy[1].y=3;
snakexy[2].x=3;
snakexy[2].y=3;
food.x=13;
food.y=19;
/*---初始化变量完毕---*/
for(i=0;i<length;i++)
{
gotoxy(snakexy[i].x,snakexy[i].y);
putchar(4);
}
while(1)
{
while(!kbhit())
{
switch(key)
{
case UP:
if(length!=1)
for(i=0;i<length-1;i++)
{
snakexy[i].x=snakexy[i+1].x;
snakexy[i].y=snakexy[i+1].y;
}
snakexy[length-1].y--;
break;
case DOWN:
if(length!=1)
for(i=0;i<length-1;i++)
{
snakexy[i].x=snakexy[i+1].x;
snakexy[i].y=snakexy[i+1].y;
}
snakexy[length-1].y++;
break;
case LEFT:
if(length!=1)
for(i=0;i<length-1;i++)
{
snakexy[i].x=snakexy[i+1].x;
snakexy[i].y=snakexy[i+1].y;
}
snakexy[length-1].x--;
break;
case RIGHT:
if(length!=1)
for(i=0;i<length-1;i++)
{
snakexy[i].x=snakexy[i+1].x;
snakexy[i].y=snakexy[i+1].y;
}
snakexy[length-1].x++;
break;
case ESC:
Game_over();
}/*switch(key)_end*/
wall_pass();
hit_own();
eat_food();
for(i=0;i<length;i++)
{
Print_moze();
if(food.life==1)
{
gotoxy(food.x,food.y);
putchar(3);
}
gotoxy(snakexy[i].x,snakexy[i].y);
putchar(4);
}
delay(60000);
clrscr();
if(food.life==0)
Print_food();
}/*while(!kbhit())_end*/
Get_key();
if(food.life==0)
Print_food();
}/*end_while(1)*/
}
/*-----接收按键-----*/
void Get_key(void)
{
key=bioskey(0);
}
/*-----游戏结束-----*/
void Game_over()
{
printf("\a");
clrscr();
gotoxy(35,13);
printf("score:%d",score);
getch();
exit(0);
}
/*-----输出食物-----*/
void Print_food()
{
food.x=(rand()%83)+2;
food.y=(rand()%22)+3;
gotoxy(food.x,food.y);
putchar(3);
food.life=1;
}
/*-----是否撞墙-----*/
void wall_pass()
{
if((snakexy[length-1].x==85)||(snakexy[length-1].x==0)||(snakexy[length-1].y==2)||(snakexy[length-1].y==25))
Game_over();
}
/*-----吃到食物-----*/
void eat_food()
{
if((snakexy[length-1].x==food.x)&&(snakexy[length-1].y==food.y))
{
score=score+5;
food.life=0;
snakexy[length].x=food.x;
snakexy[length].y=food.y;
length++;
}
}
/*-----撞到自己-----*/
void hit_own(void)
{
for(i=0;i<length-2;i++)
if((snakexy[length-1].x==snakexy[i].x)&&(snakexy[length-1].y==snakexy[i].y))
Game_over();
}
写的很烂,只是不停的刷新屏幕,所以有时会闪。懒得改了。