贪吃蛇
来源:互联网 发布:java 集成开发环境 编辑:程序博客网 时间:2024/04/18 08:24
#include<stdio.h>
#include<time.h>
#include<conio.h>
#include<stdlib.h>
#define MAX_X 20
#define MAX_Y 20
#define NULL 0
struct snake
{
int x;//蛇体坐标
int y;
}snake[(MAX_X-2)*(MAX_Y-2)]={0,0};
void main()
{
FILE *fp;
int s[MAX_X][MAX_Y]={0};
int length;//蛇体长度
int i,j,m=0;//计数器
int Fx,Fy;//食物坐标
int stop=0;//结束标识符
int lr=1,up=0,right=1;//控制方向
int grade;//游戏得分
int Time;
printf("/n/n/n/n/n/n/n/n/n/t/t/t贪吃蛇游戏/n");
printf("/n/t/t/t难度");
printf("/n/t/t/t1.容易★");
printf("/n/t/t/t2.中级★★");
printf("/n/t/t/t3.困难★★★");
printf("/n/t/t/t退出游戏 请按q/n/t/t/t");
switch(getch())//选择速度的快慢
{
case '1':
Time=200;
break;
case '2':
Time=100;
break;
case '3':
Time=50;
break;
case 'q':
exit(0);
default :
Time=200;
break;
}
system("cls");
for(i=0;i<MAX_X;i++)//给边界赋值
{
for(j=0;j<MAX_Y;j++)
{
if(i==0||j==0||i==MAX_X-1||j==MAX_Y-1)
s[i][j]=1;
}
}
srand((unsigned int)(time(NULL)));
length=1;
snake[0].x=9; //初始蛇头坐标
snake[0].y=9;
while(1)//产生食物随机坐标
{
Fx=1+rand()%(MAX_X-2);
Fy=1+rand()%(MAX_Y-2);
if(Fx!=snake[0].x&&Fy!=snake[0].y )
{
s[Fx][Fy]=3;//食物的位置记为3
break;
}
else
continue;
}
while(1)
{
for(i=0;i<MAX_X;i++)
{
for(j=0,m=0;j<MAX_Y;m++,j++)
{
for(m=1;m<length;m++)//将蛇身位置的值记为1
{
if(i==snake[m].x&&j==snake[m].y)
s[i][j]=2;
}
if(i==snake[0].x&&j==snake[0].y)
printf("●");
else if(s[i][j]==1)
printf("■");
else if(s[i][j]==3)
printf("◎");
else if(s[i][j]==2)
{
printf("○");
s[i][j]=0;
}
else
printf(" ");
if((j+1)%20==0)//换行判断
printf("/n");
}
}
if(Fx==snake[0].x&&Fy==snake[0].y)
{
s[Fx][Fy]=0;
length++;//吃到的食物个数
snake[length].x=Fx;//记录蛇身坐标
snake[length].y=Fy;
Fx=1+rand()%(MAX_X-2);
Fy=1+rand()%(MAX_Y-2);
for(m=0;m<length;m++)//食物坐标不能与蛇身冲突
{
if(Fx==snake[m].x&&Fy==snake[m].y)
continue;
}
}
s[Fx][Fy]=3;
for(m=length-1,i=length;m>=0;i--,m--)//存储蛇头的上一个位置坐标
{
snake[i].x=snake[m].x;
snake[i].y=snake[m].y;
if(lr)//控制循环移动
{
if(right)//右移动
{
if(snake[m].y<(MAX_Y-2))
snake[m].y++;
else
snake[m].y=1;
}
else//左移动
{
if(snake[m].y>1)
snake[m].y--;
else
snake[m].y=18;
}
}
else
{
if(up)//上移动
{
if(snake[m].x>1)
snake[m].x--;
else
snake[m].x=18;
}
else//下移动
{
if(snake[m].x<(MAX_X-2))
snake[m].x++;
else
snake[m].x=1;
}
}
}
for(m=1;m<length;m++)
{
if(snake[m].x==snake[0].x&&snake[m].y==snake[0].y)
stop=1;
}
if(stop)//蛇咬到自己游戏结束
{
_sleep(200);
system("cls");
printf("/n/n/n/n/n/n/n/n/n/t/t/tGAME OVER!!!");
printf("/n/t/t/t级别:");
switch(Time)
{
case 200:
printf("容易★");
break;
case 100:
printf("中级★★");
break;
case 50:
printf("困难★★★");
break;
default:
break;
}
printf("/n/t/t/t你的得分%d/n",10*(length-1));
printf("/n/t/t/t( ^_^ )不错嘛/n/t/t/t");
break;
}
if(kbhit())//控制方向
{
switch(getch())
{
case 'w'://向上
if(lr)
{
lr=0;
up=1;
}
break;
case 's'://向下
if(lr)
{
lr=0;
up=0;
}
break;
case 'a'://向左
if(!lr)
{
lr=1;
right=0;
}
break;
case 'd'://向右
if(!lr)
{
lr=1;
right=1;
}
break;
case 'q':
exit(0);
}
}
printf("/n/t/t/t 得分%d/n",10*(length-1));
_sleep(Time);
system("cls");
}
}