[原创]贪吃蛇
/************************ 文本方式的贪吃蛇 ********************************/ /************************ 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(); }