69,369
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
#define HEAD 300
#define FOOD 400
/*-------------欢迎词神马的-------------------*/
void welc()
{
printf("\n\n\n\n\n\n\t\t\t欢迎来到xiao_D贪吃蛇\n\n");
printf("\t\t此游戏用键盘的方向键控制即可。若想退出请按Esc建。\n");
printf("\n\t\t\t相反的方向的话是暂停。\n");
printf("\n\t\t\t请按任意键进入游戏。");
getch();
}
/*--------------------------------------------*/
/*------------人工画图程序--------------------*/
void drawpt(int a,int x,int y)
{
if(x==0)
{
printf("\t\t");
return ;
}
if(y==0)
{ printf("\t\t\t");
return ;
}
if(x==16)
{
printf("\n");
return ;
}
if(y==16)
{
printf("\t\t");
}
if(x>0&&x<16&&y>0&&y<16)
{
if(a==0)
printf("█");
else printf("□");
return ;
}
}
void draw(int (*sna)[17])
{
int i,j;
system("cls");
for(i=0;i<17;i++)
{
for(j=0;j<17;j++)
{
drawpt(sna[i][j],j,i);
}
}
}
/*-----------------------------------------------*/
/*---------------取随机数,出现食物用------------*/
int randno()
{
srand(time(NULL));
return rand()%15+1;
}
/*-----------------------------------------------*/
/*----------判断游戏是否结束---------------------*/
bool judgeGO(int (*sna)[17])
{
int x,y,i=0,max=0,count=0;
for(x=0,y=0;y<17;y++)
if(sna[x][y]==HEAD)//判断头部是否在最外层的。
return false;
for(x=16,y=0;y<17;y++)
if(sna[x][y]==HEAD)
return false;
for(y=0,x=0;x<17;x++)
if(sna[x][y]==HEAD)
return false;
for(y=16,x=0;x<17;x++)
if(sna[x][y]==HEAD)
return false;
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(i=0;i<max;i++)
{
for(x=1;x<16;x++)
{
for(y=1;y<16;y++)
{
if(sna[x][y]==i+1)
count++;//这个判断想了好久的,,,
}
}
}
if(count!=max)//判断身体部分是否连续。
return false;
return true;
}
/*--------------------------------------------------*/
/*-------------游戏结束显示-------------------------*/
void gameover()
{
system("cls");
printf("\n\n\n\n\n\n\n\n");
printf("\t\t\t\t");
printf("游戏结束\n");
printf("\t\t\t");
printf("按Esc键退出,按任意键重新开始。\n");
}
/*-------------------------------------------------*/
/*全程标记法,从尾巴开始123456....HEAD,食物是FOOD。*/
void marksn()
{
void downmove(int (*sna)[17]);
void upmove(int (*sna)[17]);
void leftmove(int (*sna)[17]);
void rightmove(int (*sna)[17]);
int judgeF(int (*sna)[17],int keym);
int snake[17][17]={0};
/*------各种东西初始化-------------------*/
int x=1,y=7,key,key1;
snake[1][1]=1;
snake[1][2]=2;
snake[1][3]=3;
snake[2][3]=HEAD;
while(snake[x][y]!=0)
{
x=randno();
y=randno();
}
snake[x][y]=FOOD;
draw(snake);
/*---------------------------------------*/
/*--------控制的部分---------------------*/
while(judgeGO(snake))
{
key=getch();
switch(key){
case 72:
while(!kbhit()&&key1!=80&&judgeGO(snake))//这个函数kbhit()自己查一下吧~控制输入很好
{
if(judgeF(snake,key))
{
draw(snake);
Sleep(100);
continue;
}
upmove(snake);
draw(snake);
key1=key;//这里的key1是就来标记上一步的方向,这样相反的方向就暂停了。
Sleep(100);
}
break;
case 80:
while(!kbhit()&&key1!=72&&judgeGO(snake))
{
if(judgeF(snake,key))
{
draw(snake);
Sleep(100);
continue;
}
downmove(snake);
draw(snake);
key1=key;
Sleep(100);
}
break;
case 75:
while(!kbhit()&&key1!=77&&judgeGO(snake))
{
if(judgeF(snake,key))
{
draw(snake);
Sleep(100);
continue;
}
leftmove(snake);
draw(snake);
key1=key;
Sleep(100);
}
break;
case 77:
while(!kbhit()&&key1!=75&&judgeGO(snake))
{
if(judgeF(snake,key))
{
draw(snake);
Sleep(100);
continue;
}
rightmove(snake);
draw(snake);
key1=key;
Sleep(100);
}
break;
case 27:
exit(0);
default:
switch(key1){
case 72:
while(!kbhit()&&judgeGO(snake))
{
upmove(snake);
draw(snake);
}
break;
case 80:
while(!kbhit()&&judgeGO(snake))
{
downmove(snake);
draw(snake);
}
break;
case 75:
while(!kbhit()&&judgeGO(snake))
{
leftmove(snake);
draw(snake);
}
break;
case 77:
while(!kbhit()&&judgeGO(snake) )
{
rightmove(snake);
draw(snake);
}
break;
}
}
}
/*---------------------------------------------------*/
/*------------是否继续游戏---------------------------*/
gameover();
if(getch()==27)
exit(0);
else
{
marksn();
getch();
}
/*---------------------------------------------------*/
}
/*-------------------------------------------------*/
/*-----------上下左右移动神马的--------------------*/
void downmove(int (*sna)[17])
{
int x=0,y=0,mark=0;
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(sna[x][y]!=0&&sna[x][y]!=HEAD&&sna[x][y]!=FOOD)
{
sna[x][y]=sna[x][y]-1;//前面已经说了,12345....标记法,减去1的话,除了头部以外其他的就移动了。
}
}
}
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(mark<sna[x][y])
if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD)
mark=sna[x][y];//这个是求头部之后的值。
}
}
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(sna[x][y]==HEAD)
{
sna[x+1][y]=HEAD;//头部的移动,
sna[x][y]=mark+1;//头部的赋值。
return;
}
}
}
}
void upmove(int (*sna)[17])
{
int x=0,y=0,mark=0;
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(sna[x][y]!=0&&sna[x][y]!=HEAD&&sna[x][y]!=FOOD)
{
sna[x][y]=sna[x][y]-1;
}
}
}
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(mark<sna[x][y])
if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD)
mark=sna[x][y];
}
}
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(sna[x][y]==HEAD)
{
sna[x-1][y]=HEAD;
sna[x][y]=mark+1;
return;
}
}
}
}
void leftmove(int (*sna)[17])
{
int x=0,y=0,mark=0;
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(sna[x][y]!=0&&sna[x][y]!=HEAD&&sna[x][y]!=FOOD)
{
sna[x][y]=sna[x][y]-1;
}
}
}
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(mark<sna[x][y])
if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD)
mark=sna[x][y];
}
}
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(sna[x][y]==HEAD)
{
sna[x][y-1]=HEAD;
sna[x][y]=mark+1;
return;
}
}
}
}
void rightmove(int (*sna)[17])
{
int x=0,y=0,mark=0;
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(sna[x][y]!=0&&sna[x][y]!=HEAD&&sna[x][y]!=FOOD)
{
sna[x][y]=sna[x][y]-1;
}
}
}
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(mark<sna[x][y])
if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD)
mark=sna[x][y];
}
}
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(sna[x][y]==HEAD)
{
sna[x][y+1]=HEAD;
sna[x][y]=mark+1;
return;
}
}
}
}
int judgeF(int (*sna)[17],int keym)
{
int randno();
int x,y,mark=0,i=randno(),j=randno();
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(mark<sna[x][y])
if(sna[x][y]!=HEAD&&sna[x][y]!=FOOD)
mark=sna[x][y];
}
}
for(x=0;x<16;x++)
{
for(y=0;y<16;y++)
{
if(sna[x][y]==HEAD)
{
if(sna[x-1][y]==FOOD&&keym==72)
{
sna[x-1][y]=HEAD;
sna[x][y]=mark+1;
while(sna[i][j]!=0)
{
i=randno();
j=randno();
}
sna[i][j]=FOOD;
return 1;
}
if(sna[x+1][y]==FOOD&&keym==80)
{
sna[x+1][y]=HEAD;
sna[x][y]=mark+1;
while(sna[i][j]!=0)
{
i=randno();
j=randno();
}
sna[i][j]=FOOD;
return 1;
}
if(sna[x][y+1]==FOOD&&keym==77)
{
sna[x][y+1]=HEAD;
sna[x][y]=mark+1;
while(sna[i][j]!=0)
{
i=randno();
j=randno();
}
sna[i][j]=FOOD;
return 1;
}
if(sna[x][y-1]==FOOD&&keym==75)
{
sna[x][y-1]=HEAD;
sna[x][y]=mark+1;
while(sna[i][j]!=0)
{
i=randno();
j=randno();
}
sna[i][j]=FOOD;
return 1;
}
}
}
}
return 0;
}
/*------------------------------------------------------*/
/*----------主函数没什么内容----------------------------*/
int main(void)
{
welc();
marksn();
return 0;
}
int gotoxy(int x,int y) /*将光标定位到 (x,y)*/
{
COORD c;
c.X=x-1;
c.Y=y-1;
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE),c);
return 0;
}