#include<stdlib.h> /*包含srand函数*/
#include<stdio.h> /*基本输入输出函数*/
#include<windows.h> /*windows画图等函数包含Srand函数*/
#include<conio.h> /*键盘按键函数*/
#include<time.h> /*产生时间随机函数*/
#define HEAD 300 /*头部赋初值*/
#define FOOD 400 /*食物赋初值*/
/*画图设置背景*/
void draw(int a,int x,int y)
{
if(x==0) printf("\t\t"); /*制表共16行*/
if(y==0) printf("\t\t"); /*制表共16列*/
if(x==16) printf("\n");
if(x>0&&x<16&&y>0&&y<16)
{
if(a!=0)
printf("█"); /*如果是蛇或者是食物则显示出来*/
else printf("□"); /*如果什么都不是则输出空白*/
}
}
void Draw(int (*sna)[17]) /*int (*sna)[17]数组指针,它只是一个指针,指向17个元素数组的地址*/
{
int i,j;
system("cls"); /*清屏*/
system("color A4"); /*设置背景为红色,底板为绿色*/
for(i=0;i<17;i++)
for(j=0;j<17;j++)
draw(sna[i][j],j,i); /*画出蛇的图像*/
}
/*画图设置背景*/
/*判断蛇是否死亡*/
int life(int (*sna)[17])
{
int x,y,a=0,max=0,sum=0;
/*判断头部是否在最外层的。*/
for(x=0,y=0;y<17;y++)
if(sna[x][y]==HEAD) //判断头部是否在最外层的。
return 0;
for(x=16,y=0;y<17;y++)
if(sna[x][y]==HEAD)
return 0;
for(y=0,x=0;x<17;x++)
if(sna[x][y]==HEAD)
return 0;
for(y=16,x=0;x<17;x++)
if(sna[x][y]==HEAD)
return 0;
/*判断头部是否在最外层的。*/
/*判断头部是否撞到自己*/
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(max<sna[x][y])
if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD)
max=sna[x][y];
}
} /*判断头部是否撞到自己*/
for(a=0;a<max;a++)
{
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(a+1==sna[x][y])
sum++;
}
}
}
if(sum!=max)
return 0;
/*判断头部是否撞到自己*/
return 1;
}
void gameover(int score)
{
system("cls"); /*清屏*/
system("color 2"); /*设置颜色为绿*/
printf("\n\n\n\n\n\n\n\n"); /*换行*/
printf("\t\t\t\t"); /*设置列数*/
printf("游戏结束\n");
printf("\n\n\n\n\n\n");
printf("\t\t\t\t");
printf("score=%d\n",score);
printf("\n\n\n\n\n\n\n\n");
printf("\t\t\t");
printf("按Esc键退出,按任意键重新开始。\n");
} /*游戏结束*/
/*产生随机数*/
int rando()
{
srand(time(NULL)); /*产生一个较大的随机数*/
return rand()%15+1; /*产生1,2,3,,,,16随机数*/
}
/*产生随机数*/
/*最主要的部分,,,主要用了123,,,HEAD,,,,,食物是FOOD来标记蛇的每一部分*/
void sign()
{ /*初始化及函数声明*/
void upmove(int (*sna)[17]);
void downmove(int (*sna)[17]);
void leftmove(int (*sna)[17]);
void rightmove(int (*sna)[17]);
int juge(int (*sna)[17],int key);
int i=5,j=7,score=0,snake[17][17]={0},key,key1=0;
snake[1][1]=1;
snake[1][2]=2;
snake[1][3]=3;
snake[2][3]=HEAD;
while(snake[i][j]!=0)
{
i=rando();
j=rando();
}
snake[i][j]=FOOD; /*随机产生一个食物*/
/*初始化及函数声明*/
Draw(snake); /*画出初始化的蛇及食物的图形*/
/*进入循环进行标记*/
while(life(snake)) /*在蛇活着的时候一直进入大循环*/
{
key=getch();
switch(key)
{
case 72:
while(!kbhit()&&life(snake)&&key1!=80) /*当!kbhit()表示键盘无输入及上一步与输入的这一步不是相反方向时且蛇是活着的*/
{
if(juge(snake,key))
{
score++; /*所吃的食物得分*/
Draw(snake); /*画出现在的蛇形*/
Sleep(100); /*延时*/
}
upmove(snake); /*调用向上移动函数*/
Draw(snake);
key1=key ; /*用来标记上一步*/
Sleep(100);
}
break;
case 80:
while(!kbhit()&&life(snake)&&key1!=72)
{
if(juge(snake,key))
{
score++; /*所吃的食物得分*/
Draw(snake); /*画出现在的蛇形*/
Sleep(100); /*延时*/
}
downmove(snake); /*调用向下移动函数*/
Draw(snake);
key1=key ; /*用来标记上一步*/
Sleep(100);
}
break;
case 75:
while(!kbhit()&&life(snake)&&key1!=77)
{
if(juge(snake,key))
{
score++; /*所吃的食物得分*/
Draw(snake); /*画出现在的蛇形*/
Sleep(100); /*延时*/
}
leftmove(snake); /*调用向左移动函数*/
Draw(snake);
key1=key ; /*用来标记上一步*/
Sleep(100);
}
break;
case 77:
while(!kbhit()&&life(snake)&&key1!=75)
{
if(juge(snake,key))
{
score++; /*所吃的食物得分*/
Draw(snake); /*画出现在的蛇形*/
Sleep(100); /*延时*/
}
rightmove(snake); /*调用向右移动函数*/
Draw(snake);
key1=key ; /*用来标记上一步*/
Sleep(100);
}
break;
case 27:
exit(0);
}
}
gameover(score);
Sleep(1000);
if(getch()==27) /*推出游戏*/
exit(0);
else
{
sign();
getch();
}
}
/*光标控制贪吃蛇移动*/
/*向上移动*/
int upmove(int (*sna)[17])
{
int i,j,max=0; /*max用来标记蛇*/
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]!=0&&sna[i][j]!=HEAD&&sna[i][j]!=FOOD) /*出去头部 1,2,3标记法蛇的身子进行移动*/
sna[i][j]=sna[i][j]-1;
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(max<sna[i][j])
if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
max=sna[i][j]; /*求出蛇头后的长度*/
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]==HEAD)
{
sna[i-1][j]=HEAD; /*蛇头移动*/
sna[i][j]=max+1;
return 1; /*蛇身移动*/
}
}
}
int downmove(int (*sna)[17])
{
int i,j,max=0;
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]!=0&&sna[i][j]!=HEAD&&sna[i][j]!=FOOD) /*出去头部 1,2,3标记法蛇的身子进行移动*/
sna[i][j]=sna[i][j]-1;
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(max<sna[i][j])
if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
max=sna[i][j]; /*求出蛇头后的长度*/
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]==HEAD)
{
sna[i+1][j]=HEAD; /*蛇头移动*/
sna[i][j]=max+1;
return 1; /*蛇神移动*/
}
}
}
int leftmove(int (*sna)[17])
{
int i,j,max=0;
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]!=0&&sna[i][j]!=HEAD&&sna[i][j]!=FOOD) /*出去头部 1,2,3标记法蛇的身子进行移动*/
sna[i][j]=sna[i][j]-1;
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(max<sna[i][j])
if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
max=sna[i][j]; /*求出蛇头后的长度*/
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]==HEAD)
{
sna[i][j-1]=HEAD; /*蛇头移动*/
sna[i][j]=max+1;
return 1; /*蛇神移动*/
}
}
}
int rightmove(int (*sna)[17])
{
int i,j,max=0;
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]!=0&&sna[i][j]!=HEAD&&sna[i][j]!=FOOD) /*出去头部 1,2,3标记法蛇的身子进行移动*/
sna[i][j]=sna[i][j]-1;
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(max<sna[i][j])
if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
max=sna[i][j]; /*求出蛇头后的长度*/
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]==HEAD)
{
sna[i][j+1]=HEAD; /*蛇头移动*/
sna[i][j]=max+1;
return 1; /*蛇神移动*/
}
}
}
/*光标控制贪吃蛇*/
/*判断在移动瞬间蛇能不能吃到食物*/
int juge(int (*sna)[17],int key)
{
int i,j,a=rando(),b=rando(),max; /*a,b是随机食物的坐标*/
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
if(max<sna[i][j])
max=sna[i][j]; /*求出蛇的头后的长度*/
}
}
#include<stdio.h> /*基本输入输出函数*/
#include<windows.h> /*windows画图等函数包含Srand函数*/
#include<conio.h> /*键盘按键函数*/
#include<time.h> /*产生时间随机函数*/
#define HEAD 300 /*头部赋初值*/
#define FOOD 400 /*食物赋初值*/
/*画图设置背景*/
void draw(int a,int x,int y)
{
if(x==0) printf("\t\t"); /*制表共16行*/
if(y==0) printf("\t\t"); /*制表共16列*/
if(x==16) printf("\n");
if(x>0&&x<16&&y>0&&y<16)
{
if(a!=0)
printf("█"); /*如果是蛇或者是食物则显示出来*/
else printf("□"); /*如果什么都不是则输出空白*/
}
}
void Draw(int (*sna)[17]) /*int (*sna)[17]数组指针,它只是一个指针,指向17个元素数组的地址*/
{
int i,j;
system("cls"); /*清屏*/
system("color A4"); /*设置背景为红色,底板为绿色*/
for(i=0;i<17;i++)
for(j=0;j<17;j++)
draw(sna[i][j],j,i); /*画出蛇的图像*/
}
/*画图设置背景*/
/*判断蛇是否死亡*/
int life(int (*sna)[17])
{
int x,y,a=0,max=0,sum=0;
/*判断头部是否在最外层的。*/
for(x=0,y=0;y<17;y++)
if(sna[x][y]==HEAD) //判断头部是否在最外层的。
return 0;
for(x=16,y=0;y<17;y++)
if(sna[x][y]==HEAD)
return 0;
for(y=0,x=0;x<17;x++)
if(sna[x][y]==HEAD)
return 0;
for(y=16,x=0;x<17;x++)
if(sna[x][y]==HEAD)
return 0;
/*判断头部是否在最外层的。*/
/*判断头部是否撞到自己*/
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(max<sna[x][y])
if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD)
max=sna[x][y];
}
} /*判断头部是否撞到自己*/
for(a=0;a<max;a++)
{
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(a+1==sna[x][y])
sum++;
}
}
}
if(sum!=max)
return 0;
/*判断头部是否撞到自己*/
return 1;
}
void gameover(int score)
{
system("cls"); /*清屏*/
system("color 2"); /*设置颜色为绿*/
printf("\n\n\n\n\n\n\n\n"); /*换行*/
printf("\t\t\t\t"); /*设置列数*/
printf("游戏结束\n");
printf("\n\n\n\n\n\n");
printf("\t\t\t\t");
printf("score=%d\n",score);
printf("\n\n\n\n\n\n\n\n");
printf("\t\t\t");
printf("按Esc键退出,按任意键重新开始。\n");
} /*游戏结束*/
/*产生随机数*/
int rando()
{
srand(time(NULL)); /*产生一个较大的随机数*/
return rand()%15+1; /*产生1,2,3,,,,16随机数*/
}
/*产生随机数*/
/*最主要的部分,,,主要用了123,,,HEAD,,,,,食物是FOOD来标记蛇的每一部分*/
void sign()
{ /*初始化及函数声明*/
void upmove(int (*sna)[17]);
void downmove(int (*sna)[17]);
void leftmove(int (*sna)[17]);
void rightmove(int (*sna)[17]);
int juge(int (*sna)[17],int key);
int i=5,j=7,score=0,snake[17][17]={0},key,key1=0;
snake[1][1]=1;
snake[1][2]=2;
snake[1][3]=3;
snake[2][3]=HEAD;
while(snake[i][j]!=0)
{
i=rando();
j=rando();
}
snake[i][j]=FOOD; /*随机产生一个食物*/
/*初始化及函数声明*/
Draw(snake); /*画出初始化的蛇及食物的图形*/
/*进入循环进行标记*/
while(life(snake)) /*在蛇活着的时候一直进入大循环*/
{
key=getch();
switch(key)
{
case 72:
while(!kbhit()&&life(snake)&&key1!=80) /*当!kbhit()表示键盘无输入及上一步与输入的这一步不是相反方向时且蛇是活着的*/
{
if(juge(snake,key))
{
score++; /*所吃的食物得分*/
Draw(snake); /*画出现在的蛇形*/
Sleep(100); /*延时*/
}
upmove(snake); /*调用向上移动函数*/
Draw(snake);
key1=key ; /*用来标记上一步*/
Sleep(100);
}
break;
case 80:
while(!kbhit()&&life(snake)&&key1!=72)
{
if(juge(snake,key))
{
score++; /*所吃的食物得分*/
Draw(snake); /*画出现在的蛇形*/
Sleep(100); /*延时*/
}
downmove(snake); /*调用向下移动函数*/
Draw(snake);
key1=key ; /*用来标记上一步*/
Sleep(100);
}
break;
case 75:
while(!kbhit()&&life(snake)&&key1!=77)
{
if(juge(snake,key))
{
score++; /*所吃的食物得分*/
Draw(snake); /*画出现在的蛇形*/
Sleep(100); /*延时*/
}
leftmove(snake); /*调用向左移动函数*/
Draw(snake);
key1=key ; /*用来标记上一步*/
Sleep(100);
}
break;
case 77:
while(!kbhit()&&life(snake)&&key1!=75)
{
if(juge(snake,key))
{
score++; /*所吃的食物得分*/
Draw(snake); /*画出现在的蛇形*/
Sleep(100); /*延时*/
}
rightmove(snake); /*调用向右移动函数*/
Draw(snake);
key1=key ; /*用来标记上一步*/
Sleep(100);
}
break;
case 27:
exit(0);
}
}
gameover(score);
Sleep(1000);
if(getch()==27) /*推出游戏*/
exit(0);
else
{
sign();
getch();
}
}
/*光标控制贪吃蛇移动*/
/*向上移动*/
int upmove(int (*sna)[17])
{
int i,j,max=0; /*max用来标记蛇*/
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]!=0&&sna[i][j]!=HEAD&&sna[i][j]!=FOOD) /*出去头部 1,2,3标记法蛇的身子进行移动*/
sna[i][j]=sna[i][j]-1;
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(max<sna[i][j])
if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
max=sna[i][j]; /*求出蛇头后的长度*/
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]==HEAD)
{
sna[i-1][j]=HEAD; /*蛇头移动*/
sna[i][j]=max+1;
return 1; /*蛇身移动*/
}
}
}
int downmove(int (*sna)[17])
{
int i,j,max=0;
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]!=0&&sna[i][j]!=HEAD&&sna[i][j]!=FOOD) /*出去头部 1,2,3标记法蛇的身子进行移动*/
sna[i][j]=sna[i][j]-1;
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(max<sna[i][j])
if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
max=sna[i][j]; /*求出蛇头后的长度*/
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]==HEAD)
{
sna[i+1][j]=HEAD; /*蛇头移动*/
sna[i][j]=max+1;
return 1; /*蛇神移动*/
}
}
}
int leftmove(int (*sna)[17])
{
int i,j,max=0;
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]!=0&&sna[i][j]!=HEAD&&sna[i][j]!=FOOD) /*出去头部 1,2,3标记法蛇的身子进行移动*/
sna[i][j]=sna[i][j]-1;
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(max<sna[i][j])
if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
max=sna[i][j]; /*求出蛇头后的长度*/
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]==HEAD)
{
sna[i][j-1]=HEAD; /*蛇头移动*/
sna[i][j]=max+1;
return 1; /*蛇神移动*/
}
}
}
int rightmove(int (*sna)[17])
{
int i,j,max=0;
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]!=0&&sna[i][j]!=HEAD&&sna[i][j]!=FOOD) /*出去头部 1,2,3标记法蛇的身子进行移动*/
sna[i][j]=sna[i][j]-1;
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(max<sna[i][j])
if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
max=sna[i][j]; /*求出蛇头后的长度*/
}
for(i=1;i<16;i++)
for(j=1;j<16;j++)
{
if(sna[i][j]==HEAD)
{
sna[i][j+1]=HEAD; /*蛇头移动*/
sna[i][j]=max+1;
return 1; /*蛇神移动*/
}
}
}
/*光标控制贪吃蛇*/
/*判断在移动瞬间蛇能不能吃到食物*/
int juge(int (*sna)[17],int key)
{
int i,j,a=rando(),b=rando(),max; /*a,b是随机食物的坐标*/
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
if(sna[i][j]!=HEAD&&sna[i][j]!=FOOD)
if(max<sna[i][j])
max=sna[i][j]; /*求出蛇的头后的长度*/
}
}
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
if(sna[i][j]==HEAD)
{
if(sna[i-1][j]==FOOD&&key==72)
{
sna[i-1][j]=HEAD; /*蛇头进入到食物的位置*/
sna[i][j]=max+1; /*蛇的长度加一*/
while(sna[a][b]!=0)
{
a=rando();
b=rando();
}
sna[a][b]=FOOD; /*随机产生新的食物*/
return 1;
}
if(sna[i+1][j]==FOOD&&key==80)
{
sna[i+1][j]=HEAD; /*蛇头进入到食物的位置*/
sna[i][j]=max+1; /*蛇的长度加一*/
while(sna[a][b]!=0)
{
a=rando();
b=rando();
}
sna[a][b]=FOOD; /*随机产生新的食物*/
return 1;
}
if(sna[i][j-1]==FOOD&&key==75)
{
sna[i][j-1]=HEAD; /*蛇头进入到食物的位置*/
sna[i][j]=max+1; /*蛇的长度加一*/
while(sna[a][b]!=0)
{
a=rando();
b=rando();
}
sna[a][b]=FOOD; /*随机产生新的食物*/
return 1;
}
if(sna[i][j+1]==FOOD&&key==77)
{
sna[i][j+1]=HEAD; /*蛇头进入到食物的位置*/
sna[i][j]=max+1; /*蛇的长度加一*/
while(sna[a][b]!=0)
{
a=rando();
b=rando();
}
sna[a][b]=FOOD; /*随机产生新的食物*/
return 1;
}
}
}
}
return 0;
}
/*主函数,,主要用于调用sign函数*/
int main()
{
sign();
}
{
for(j=0;j<16;j++)
{
if(sna[i][j]==HEAD)
{
if(sna[i-1][j]==FOOD&&key==72)
{
sna[i-1][j]=HEAD; /*蛇头进入到食物的位置*/
sna[i][j]=max+1; /*蛇的长度加一*/
while(sna[a][b]!=0)
{
a=rando();
b=rando();
}
sna[a][b]=FOOD; /*随机产生新的食物*/
return 1;
}
if(sna[i+1][j]==FOOD&&key==80)
{
sna[i+1][j]=HEAD; /*蛇头进入到食物的位置*/
sna[i][j]=max+1; /*蛇的长度加一*/
while(sna[a][b]!=0)
{
a=rando();
b=rando();
}
sna[a][b]=FOOD; /*随机产生新的食物*/
return 1;
}
if(sna[i][j-1]==FOOD&&key==75)
{
sna[i][j-1]=HEAD; /*蛇头进入到食物的位置*/
sna[i][j]=max+1; /*蛇的长度加一*/
while(sna[a][b]!=0)
{
a=rando();
b=rando();
}
sna[a][b]=FOOD; /*随机产生新的食物*/
return 1;
}
if(sna[i][j+1]==FOOD&&key==77)
{
sna[i][j+1]=HEAD; /*蛇头进入到食物的位置*/
sna[i][j]=max+1; /*蛇的长度加一*/
while(sna[a][b]!=0)
{
a=rando();
b=rando();
}
sna[a][b]=FOOD; /*随机产生新的食物*/
return 1;
}
}
}
}
return 0;
}
/*主函数,,主要用于调用sign函数*/
int main()
{
sign();
}