[原创]贪吃蛇
/************************ 文本方式的贪吃蛇 ********************************/
/************************ tc2.0 运行成功 ********************************/
/************************ 作者:沉路 ********************************/
#include <stdio.h>
#include <stdlib.h>
#define X 21
#define Y 8
#define MID_SPEED 5 /* 中等速度 */
#define MAX_SPEED 60 /* 最大速度 */
/* 键盘码 */
#define LEFT 19200
#define RIGHT 19712
#define UP 18432
#define DOWN 20480
#define ESC 283
#define SPACE 14624
#define ENTER 7181
int a,b; /* 食物坐标 */
int x,y; /* 蛇头坐标 */
int num; /* 蛇长 */
int room1[100][2]; /* 保存蛇各结点坐标 */
int room2[100][2];
int aspect; /* 方向 */
int speed; /* 速度 */
void left();
void right();
void up();
void down();
void goleft();
void goright();
void goup();
void godown();
void produce();
void getxy();
void check();
void eat();
void cut();
void set();
void mydelay();
void draw();
void start();
void go();
main()
{
int i;
int key;
/* 初始化 */
clrscr();
start();
printf("***\b");
num=3;
speed=MID_SPEED; /* 设置初速度 */
aspect=RIGHT; /* 置初始方向状态为右 */
/* 设置初始结点坐标 */
room1[0][0]=4;
room1[0][1]=2;
room1[1][0]=3;
room1[1][1]=2;
room1[2][0]=2;
room1[2][1]=2;
produce(); /* 产生第一个食物 */
go(); /* 行动 */
while(1)
{
check(); /* 检查是否与自身相碰 */
if(speed>MID_SPEED) /* 模拟摩擦力,让速度趋于正常 */
{
speed--;
}
go(); /* 行动 */
/* 如果有按键,进行处理 */
if(kbhit())
{
key=bioskey(0); /* 接收按键 */
if(key==LEFT)
{
if(x>2)
{ /* 如果方向相反,减速 */
if(aspect==RIGHT) {
speed--;
}
else
{ /* 如果方向相同,加速*/
if((aspect==LEFT)&&(speed<MAX_SPEED)) { speed+=2;
}
else /* 改变方向,重置速度 */
{
aspect=LEFT;
speed=MID_SPEED;
}
}
}
}
if(key==RIGHT)
{
if(x<79)
{
if(aspect==LEFT)
{
speed--;
}
else
{
if((aspect==RIGHT)&&(speed<MAX_SPEED))
{
speed+=2;
}
else
{
aspect=RIGHT;
speed=MID_SPEED;
}
}
}
}
if(key==DOWN)
{
if(y<24)
{
if(aspect==UP)
{
speed--;
}
else
{
if((aspect==DOWN)&&(speed<MAX_SPEED))
{
speed+=2;
}
else
{
aspect=DOWN;
speed=MID_SPEED;
}
}
}
}
if(key==UP)
{
if(y>2)
{
if(aspect==DOWN)
{
speed--;
}
else
{
if((aspect==UP)&&(speed<MAX_SPEED))
{
speed+=2;
}
else
{
aspect=UP;
speed=MID_SPEED;
}
}
}
}
if(key==SPACE) /* 手动产生一个食物 */
{
produce();
}
if(key==ENTER) /* 暂停 */
{
getch();
}
if(key==ESC) /* 退出游戏 */
{
exit(0);
}
} /* end of if */
} /* end of while */
} /* end of main */
/***************************************************************/
void left()
{
int i;
getxy(); /* 取得当前坐标 */
if((x==a+1)&&(y==b)) /* 遇到零星 */
{
eat();
}
else
{
cut(); /* 砍掉尾巴 */
gotoxy(x-1,y); /* 前面加一个 */
printf("*\b");
set(); /* 重置结点坐标 */
}
}
/*********************************************/
void right()
{ int i;
getxy();
if(x==a-1 && y==b)
{
eat();
}
else
{
cut();
gotoxy(x+1,y);
printf("*\b");
set();
}
}
/*********************************************/
void down()
{
int i;
getxy();
if((x==a)&&(y==b-1))
{
eat();
}
else
{
cut();
gotoxy(x,y+1);
printf("*\b");
set();
}
}
/**********************************************/
void up()
{
int i;
getxy();
if((x==a)&&(y==b+1))
{
eat();
}
else
{
cut();
gotoxy(x,y-1);
printf("*\b");
set();
}
}
/***************** 产生一个食物函数********************************/
void produce()
{
int i;
getxy();
randomize();
a=random(78);
randomize();
b=random(23);
gotoxy(a,b);
printf("*");
gotoxy(x,y);
}
/************** 取得当前坐标函数 ********************/
void getxy()
{
x=wherex();
y=wherey();
}
/*************** 检查是否与自己相遇函数 ********************/
void check()
{
int i;
getxy();
for(i=1;i<num;i++)
{
if(x==room1[i][0] && y==room1[i][1])
{
exit(0);
}
}
}
/***************** 吃食物函数 ********************/
void eat()
{
int i;
gotoxy(a,b); /* 把光标移动到零星的位置 */
room2[0][0]=a; /* 把数组2的头座标定为零星的坐标 */
room2[0][1]=b;
for(i=0;i<num;i++) /* 把数组1接到数组2后面 */
{
room2[i+1][0]=room1[i][0];
room2[i+1][1]=room1[i][1];
}
num++; /* 星数改变 */
for(i=0;i<num;i++) /* 把数组2复制给数组1 */
{
room1[i][0]=room2[i][0];
room1[i][1]=room2[i][1];
}
produce(); /* 产生另一个星 */
}
/********************** 删除尾巴函数 ***************************/
void cut()
{
gotoxy(room1[num-1][0],room1[num-1][1]);
printf(" ");
gotoxy(room1[0][0],room1[0][1]);
}
/************************************************/
void set()
{
int i;
getxy(); /* 数组2获取头坐标 */
room2[0][0]=x;
room2[0][1]=y;
for(i=0;i<num-1;i++) /* 连接 */
{
room2[i+1][0]=room1[i][0];
room2[i+1][1]=room1[i][1];
}
for(i=0;i<num;i++) /* 复制 */
{
room1[i][0]=room2[i][0];
room1[i][1]=room2[i][1];
}
}
/***************** 向右运动函数 ******************************/
void goright()
{
while(!kbhit()&&(x<79))
{
right();
mydelay();
}
}
/****************** 向左运动函数 ******************************/
void goleft()
{
while(!kbhit()&&(x>2))
{
left();
mydelay();
}
}
/****************** 向上运动函数 *******************************/
void goup()
{
while(!kbhit()&&(y>2))
{
up();
mydelay();
}
}
/******************* 向下运动函数*********************************/
void godown()
{
while(!kbhit()&&(y<24))
{
down();
mydelay();
}
}
/******************* 自定义延时函数 ******************************/
void mydelay()
{
int i;
for(i=0;i<60-speed;i++)
{
delay(1000);
}
}
/************** 画边框函数 *********************** */
void draw()
{
int i;
gotoxy(1,1);
for(i=1;i<=25;i++)
{
printf("*\n");
}
gotoxy(2,1);
for(i=1;i<79;i++)
{
printf("*");
}
for(i=1;i<=25;i++)
{
printf("*");
gotoxy(80,i);
}
gotoxy(1,25);
for(i=1;i<=80;i++)
{
printf("*");
}
gotoxy(X+5,25);
printf(" Esc exit Enter pause ");
gotoxy(X+2,1);
printf(" If you have no food,press Space ");
gotoxy(2,2);
}
/****************** 运动函数 ****************************/
void go()
{
switch(aspect)
{
case LEFT: goleft();
break;
case RIGHT: goright();
break;
case DOWN: godown();
break;
case UP: goup();
break;
}
}
/********************* 初始化函数 *************************/
void start()
{
gotoxy(X,Y-3);
printf("Welcome to play the game tanchishe");
gotoxy(X+3,Y);
printf("%c left ",27);
printf("%c right ",26);
printf("%c up ",24);
printf("%c down",25);
gotoxy(X+7,Y+8);
printf("Press any key to start");
gotoxy(1,1);
draw();
printf("***\b");
getch();
clrscr();
draw();
}









