**
编写贪吃蛇游戏
**(设计分值:15-20分)
贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。
下面就先说说游戏的规则:
开始:按左键开始游戏,按按钮或菜单重新开始。
下键:按下时,是蛇向下行, 当碰到墙壁时,游戏结束。
左键:按左时,是蛇向左行, 当碰到墙壁时,游戏结束。
右键:按右时,是蛇向右行, 当碰到墙壁时,游戏结束。
上键:按上时,是蛇向上行, 当碰到墙壁时,游戏结束。
当碰到目标时 计分器 加10分
**
算法设计
**
程序分析(C语言)
#include<stdio.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
#define framex 5
#define framey 5
#define wide 20
#define high 20
struct Snake
{
int x[20];
int y[20];//蛇位置
int speed;//移动速度
int length;//蛇身
int count;//记分
};//蛇
struct Food
{
int x;
int y;
};//食物坐标;
//将光标移动到指定位置
void gotoxy(HANDLE hout,int x,int y)
{
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(hout,pos);
}//将光标位置移动至x,y
//游戏封面
void cover(HANDLE hout)
{
gotoxy(hout,framex+wide,framey);//在边框外5个单位
printf("欢迎来到贪吃蛇游戏>o<");
gotoxy(hout,framex+wide,framey*2);
printf("为了您的游戏体验,请使用英文输入法O^O");
getchar();
system("cls");//清屏指令
}
//制作框架
void frame()
{
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
gotoxy(hout,framex+wide*2+5,framey);
printf("贪吃蛇游戏");
gotoxy(hout,framex+wide*2+5,framey+3);
printf("使用方向键移动");
gotoxy(hout,framex+wide*2+5,framey+7);
printf("@代表食物");
int i;
for (i=0;i<wide*2+1;i++)
{
gotoxy(hout,framex+i,framey-1);
printf("_");
gotoxy(hout,framex+i,framey+high+1);
printf("_");
}//上下边框
for (i=0;i<=high+1;i++)
{
gotoxy(hout,framex,framey+i);
printf("|");
gotoxy(hout,framex+wide*2+1,framey+i);
printf("|");
}//左右边框
}
//显示信息
void information(HANDLE hout,struct Snake snake)
{
gotoxy(hout,framex+wide*2+5,framey+15);
printf("当前速度:%d",snake.speed+500);
gotoxy(hout,framex+wide*2+5,framey+17);
printf("当前积分:%d",snake.count);
gotoxy(hout,framex+wide*2+5,framey+19);
printf("当前长度:%d",snake.length);
}
//初始化蛇
void zerosnake(struct Snake *snake)
{
int i;
snake->x[0]=framex+2;
snake->y[0]=framey+high/2;
snake->count=0;
snake->length=3;
snake->speed=400;
for (i=1;i<snake->length;i++)
{
snake->x[i]=snake->x[i-1]+1;
snake->y[i]=snake->y[i-1];
}
}
//输出蛇
void snakeout(HANDLE hout, struct Snake snake)
{
int i;
for (i=0;i<snake.length;i++)
{
gotoxy(hout,snake.x[i],snake.y[i]);
if (i==0) printf("#");
else if (i==snake.length-1) printf("*");
else printf("+");
}
}
//移动蛇
void snakemove(HANDLE hout,struct Snake *snake)
{
int i;
for (i=1;i<snake->length;i++)
{
snake->x[i-1]=snake->x[i];
snake->y[i-1]=snake->y[i];
}
}
//移动后蛇尾以及蛇身的坐标,蛇头另给
//打印出食物位置
void foodout(HANDLE hout,struct Snake snake,struct Food *food)
{
int i;
srand((unsigned)time(NULL));
while(1)
{
food->x=rand()%(wide-2)+1;
food->y=rand()%(high-2)+1;
if (food->x==0||food->y==0) continue;
food->x=food->x*2+framex;
food->y+=framey;
gotoxy(hout,food->x,food->y);
for (i=0;i<snake.length;i++)
if (snake.x[i]==food->x&&snake.y[i]==food->y) break;
if (i==snake.length) {printf("@");break;}
}
}
//吃食物
int foodeat(HANDLE hout,struct Snake snake,struct Food food)
{
if ((snake.x[snake.length-1]==food.x)&&(snake.y[snake.length-1]==food.y))
{
snake.count+=10;
return 1;
}
return 0;
}
//死亡判定
int death(struct Snake snake)
{
int i;
if ((snake.x[snake.length-1]<=framex)||(snake.x[snake.length-1]>=wide*2+framex+1)||(snake.y[snake.length-1]<=framey)||(snake.y[snake.length-1]>=framey+high+1))
{
return 1;
}//撞墙
for (i=0;i<snake.length-2;i++)
{
if ((snake.x[snake.length-1]==snake.x[i])&&(snake.y[snake.length-1]==snake.y[i]))
return 1;
}//撞自己
return 0;
}
void gameover(HANDLE hout)
{
gotoxy(hout,framex+4,framey+4);
printf("********* *********");
gotoxy(hout,framex+4,framey+5);
printf("********* *********");
gotoxy(hout,framex+4,framey+6);
printf("** ** ");
gotoxy(hout,framex+4,framey+7);
printf("** ** ");
gotoxy(hout,framex+4,framey+8);
printf("** ***** ** *****");
gotoxy(hout,framex+4,framey+9);
printf("** ***** ** *****");
gotoxy(hout,framex+4,framey+10);
printf("** ** ** **");
gotoxy(hout,framex+4,framey+11);
printf("********* *********");
gotoxy(hout,framex+4,framey+12);
printf("********* *********");
gotoxy(hout,framex+4,framey+13);
printf(" ** **");
}
int main()
{
unsigned char ch=77;
int a[2],def,i;
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
cover(hout);
frame();
struct Snake snake;
struct Food food;
zerosnake(&snake);
snakeout(hout,snake);
foodout(hout,snake,&food);
Sleep(500);
while (1)
{
information(hout,snake);
a[0]=snake.x[0];
a[1]=snake.y[0];
if (kbhit())
{
ch=getch();//getch() 接受任意键的输入,不用按回车就返回,返回值是输入值的ascll码
if (kbhit())
{
Sleep(20);
}
}
snakemove(hout,&snake);
snakeout(hout,snake);
switch(ch)
{
case 72: snake.y[snake.length-1]-=1; break;//上
case 80: snake.y[snake.length-1]+=1; break;//下
case 75: snake.x[snake.length-1]-=1; break;//左
case 77: snake.x[snake.length-1]+=1; break;//右
}
snakeout(hout,snake);
gotoxy(hout,a[0],a[1]);
printf(" ");
snakeout(hout,snake);
if (foodeat(hout,snake,food))
{
snake.length+=1;
for (i=snake.length-1;i>0;i--)
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
snake.x[0]=a[0];
snake.y[0]=a[1];
snake.count+=10;
snake.speed-=20;
information(hout,snake);
foodout(hout,snake,&food);
snakeout(hout,snake);
}
if (death(snake))
{
gameover(hout);
Sleep(1500);
break;
}
if (snake.speed<=50)
{
gotoxy(hout,framex+wide-3,framey+high/2+1);
printf("YOU WIN");
Sleep(1000);
break;
}
Sleep(snake.speed+200);
// system("pause");
}
return 0;
}
**
实验数据以及效果截屏
**
1.封面
2.游戏开始
3.吃果实后
4.触边结束