关于贪吃蛇小游戏的一些疑问???
发布网友
发布时间:2022-04-24 02:15
我来回答
共2个回答
热心网友
时间:2023-10-21 10:19
这是我找别人的
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define food 7
#define head 5
#define body 6
#define wall 1
#define road 0
#define up 1
#define down 2
#define left 3
#define right 4
#define kuan 25
#define chang 30
#define num 20
int map[kuan][chang],hi,bj,fi,fj,t;//全局变量 地图数组 头部坐标,食物坐标,速度控制参数
void gotoxy(int x,int y) //移动坐标
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
void hidden()//隐藏光标
{
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
cci.bVisible=0;//赋1为显示,赋0为隐藏
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
}
void paint(int xx,int yy)
{
gotoxy(2*yy,xx);
switch(map[xx][yy])
{
case 0:printf(" ");break;
case 1:printf("□");break;
case 5:printf("◎");break;
case 6:printf("△");break;
case 7:printf("●");break;
}
}
void start()//初始化地图数组信息,随机蛇头位置,第一个食物位置
{
int i,j;
for(i=0;i<=kuan-1;i++)
{
map[i][0]=wall;
map[i][chang-1]=wall;
}
for(j=0;j<=chang-1;j++)
{
map[0][j]=wall;
map[kuan-1][j]=wall;
}
for (i=0;i<=kuan-1;i++)
for (j=0;j<=chang-1;j++)
paint(i,j);
gotoxy(64,2);printf("1.a减速//d加速");
gotoxy(64,4);printf("2. esc暂停");gotoxy(65,5);printf(" 任意键继续");
}
int getkey(int ddd)//接收按键根据当前方向按动任意键暂停不响应与运动方向相反的按键
{
char c;
while(c=getch())
{
switch(c)
{
case 72://1
{
if(ddd==2)
return down;
else
return up;
}
case 80://2
{
if(ddd==1)
return up;
else
return down;
}
case 75://3
{
if(ddd==4)
return right;
else
return left;
}
case 77://4
{
if(ddd==3)
return left;
else
return right;
}
case 27:continue;//esc暂停,a减速,d加速
case 97:{t+=10;return ddd;}
case 100:{t-=10;return ddd;}
default:{
return ddd;
}
}
return 0;
}
}
void game()
{
int fd=0,len=1,direction=4,a[100000],b[100000],k,m,kk=0,aa=0,bb=0,i,iii=0;
int sj=0;//sj用来记录吃到的果实的存放其坐标的数组的角标
int zz=0,mm=0,fa[num+2],fb[num+2];
t=250;//全局变量在这里赋值
hi=rand()%(kuan-7)+6;bj=rand()%(chang-8)+5;map[hi][bj]=head;paint(hi,bj);//在一定范围随机蛇头初始位置,身子为左侧3个格子(可以拓展写入game里面)
a[3]=hi;b[3]=bj;//头部位置存放到 a b数组中第四项中
for (i=0;i<3;i++)
{map[hi][bj-1-i]=body;paint(hi,bj-i-1);a[2-i]=hi;b[2-i]=(bj-i-1);}
//身子位置按照尾巴至颈部存放到 0 1 2 项中
k=4;m=4;//数组之后从第四位开始存放蛇头坐标
while(1)
{
while(!kbhit()&&len!=0)//当没有按键输入并且没有撞到墙使得len=0时候进入循环(防止撞到墙后没有按键输入仍终止不了)
{
while (fd<=num)//如果fd<=num 则进入循环随机刷新一个新果实
{
do
{fi=rand()%(kuan-3)+1;fj=rand()%(chang-3)+1;}
while(map[fi][fj]>0);//不在墙或者蛇的身体内
if(fd<20)
{map[fi][fj]=food;paint(fi,fj);fa[zz++]=fi;fb[mm++]=fj;fd++;}
else
{map[fi][fj]=food;paint(fi,fj);fa[sj]=fi;fb[sj]=fj;fd++;}//如果fd=20进来循环,就会把新生成的果实的坐标赋给被上次被吃的数组,便于之后的循环检测
}
switch(direction)
{
case 1: {map[hi][bj]=body;paint(hi,bj);hi--;break;}
case 2: {map[hi][bj]=body;paint(hi,bj);hi++;break;}
case 3: {map[hi][bj]=body;paint(hi,bj);bj--;break;}
case 4: {map[hi][bj]=body;paint(hi,bj);bj++;break;}
}
if ((map[hi][bj]==body)||(map[hi][bj]==wall))//在画出新的头部时刻先判断即将画出的位置是不是map上坐标为身子的位置。是则失败
{gotoxy(30,12);printf("失败了!");len=0;break;}
map[hi][bj]=head;paint(hi,bj);//接上,不是则执行这一步画出头部
a[k++]=hi;b[m++]=bj;kk++;//另设置两个数组记录头部经过的坐标,kk代表头部运行的次数
for(i=0;i<=num;i++)
{
if (hi==fa[i]&&bj==fb[i])//吃到了果实,fd+1,分数+1,长度+1,记录被吃的果实的坐标存放数组的角标
{fd=fd-1;len++;iii++;sj=i;}
}
if(kk>(len-1))//头部每走一步,kk++,删除之前的轨迹坐标所对应的身子,即尾巴。若吃到食物则尾巴保留一次,待头部再次运动则删除。
{
if(map[a[aa]][b[bb]]!=wall)
{
map[a[aa]][b[bb]]=road;
paint(a[aa],b[bb]);
aa++;bb++;
kk--;
}
else
{aa+=9;bb+=9;map[a[aa]][b[bb]]=road;paint(a[aa],b[bb]);kk-=9;}
}
if(len>=18)//*版本代码
{
for (i=1;i<11;i++)
{map[a[k-11-i]][b[m-11-i]]=wall;paint((a[k-11-i]),(b[m-11-i]));}//从脑袋后第十二节开始变成墙
len-=8;
t+=4;
}
gotoxy(64,7);printf("3.分数:%d",iii);
Sleep(t-2*iii);//速度算法有待改进!!!!!!!!
}
if (len==0)//撞墙退出,退出while(1)总循环
break;
direction=getkey(direction);//按键按一下,getch提取并删除输入的字符,所以仍能继续进入while(!kbhit())中循环;
}
}
main()
{
srand(time(NULL));
hidden();
start();
game();
gotoxy(0,0);//锁定屏幕显示
getchar();
}
热心网友
时间:2023-10-21 10:19
能,你不能运行的主要原因是你没有装EasyX
所以没有头文件"graphics.h"
而贪吃蛇大多依靠着个头文件来运行
热心网友
时间:2023-10-21 10:19
这是我找别人的
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define food 7
#define head 5
#define body 6
#define wall 1
#define road 0
#define up 1
#define down 2
#define left 3
#define right 4
#define kuan 25
#define chang 30
#define num 20
int map[kuan][chang],hi,bj,fi,fj,t;//全局变量 地图数组 头部坐标,食物坐标,速度控制参数
void gotoxy(int x,int y) //移动坐标
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
void hidden()//隐藏光标
{
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
cci.bVisible=0;//赋1为显示,赋0为隐藏
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
}
void paint(int xx,int yy)
{
gotoxy(2*yy,xx);
switch(map[xx][yy])
{
case 0:printf(" ");break;
case 1:printf("□");break;
case 5:printf("◎");break;
case 6:printf("△");break;
case 7:printf("●");break;
}
}
void start()//初始化地图数组信息,随机蛇头位置,第一个食物位置
{
int i,j;
for(i=0;i<=kuan-1;i++)
{
map[i][0]=wall;
map[i][chang-1]=wall;
}
for(j=0;j<=chang-1;j++)
{
map[0][j]=wall;
map[kuan-1][j]=wall;
}
for (i=0;i<=kuan-1;i++)
for (j=0;j<=chang-1;j++)
paint(i,j);
gotoxy(64,2);printf("1.a减速//d加速");
gotoxy(64,4);printf("2. esc暂停");gotoxy(65,5);printf(" 任意键继续");
}
int getkey(int ddd)//接收按键根据当前方向按动任意键暂停不响应与运动方向相反的按键
{
char c;
while(c=getch())
{
switch(c)
{
case 72://1
{
if(ddd==2)
return down;
else
return up;
}
case 80://2
{
if(ddd==1)
return up;
else
return down;
}
case 75://3
{
if(ddd==4)
return right;
else
return left;
}
case 77://4
{
if(ddd==3)
return left;
else
return right;
}
case 27:continue;//esc暂停,a减速,d加速
case 97:{t+=10;return ddd;}
case 100:{t-=10;return ddd;}
default:{
return ddd;
}
}
return 0;
}
}
void game()
{
int fd=0,len=1,direction=4,a[100000],b[100000],k,m,kk=0,aa=0,bb=0,i,iii=0;
int sj=0;//sj用来记录吃到的果实的存放其坐标的数组的角标
int zz=0,mm=0,fa[num+2],fb[num+2];
t=250;//全局变量在这里赋值
hi=rand()%(kuan-7)+6;bj=rand()%(chang-8)+5;map[hi][bj]=head;paint(hi,bj);//在一定范围随机蛇头初始位置,身子为左侧3个格子(可以拓展写入game里面)
a[3]=hi;b[3]=bj;//头部位置存放到 a b数组中第四项中
for (i=0;i<3;i++)
{map[hi][bj-1-i]=body;paint(hi,bj-i-1);a[2-i]=hi;b[2-i]=(bj-i-1);}
//身子位置按照尾巴至颈部存放到 0 1 2 项中
k=4;m=4;//数组之后从第四位开始存放蛇头坐标
while(1)
{
while(!kbhit()&&len!=0)//当没有按键输入并且没有撞到墙使得len=0时候进入循环(防止撞到墙后没有按键输入仍终止不了)
{
while (fd<=num)//如果fd<=num 则进入循环随机刷新一个新果实
{
do
{fi=rand()%(kuan-3)+1;fj=rand()%(chang-3)+1;}
while(map[fi][fj]>0);//不在墙或者蛇的身体内
if(fd<20)
{map[fi][fj]=food;paint(fi,fj);fa[zz++]=fi;fb[mm++]=fj;fd++;}
else
{map[fi][fj]=food;paint(fi,fj);fa[sj]=fi;fb[sj]=fj;fd++;}//如果fd=20进来循环,就会把新生成的果实的坐标赋给被上次被吃的数组,便于之后的循环检测
}
switch(direction)
{
case 1: {map[hi][bj]=body;paint(hi,bj);hi--;break;}
case 2: {map[hi][bj]=body;paint(hi,bj);hi++;break;}
case 3: {map[hi][bj]=body;paint(hi,bj);bj--;break;}
case 4: {map[hi][bj]=body;paint(hi,bj);bj++;break;}
}
if ((map[hi][bj]==body)||(map[hi][bj]==wall))//在画出新的头部时刻先判断即将画出的位置是不是map上坐标为身子的位置。是则失败
{gotoxy(30,12);printf("失败了!");len=0;break;}
map[hi][bj]=head;paint(hi,bj);//接上,不是则执行这一步画出头部
a[k++]=hi;b[m++]=bj;kk++;//另设置两个数组记录头部经过的坐标,kk代表头部运行的次数
for(i=0;i<=num;i++)
{
if (hi==fa[i]&&bj==fb[i])//吃到了果实,fd+1,分数+1,长度+1,记录被吃的果实的坐标存放数组的角标
{fd=fd-1;len++;iii++;sj=i;}
}
if(kk>(len-1))//头部每走一步,kk++,删除之前的轨迹坐标所对应的身子,即尾巴。若吃到食物则尾巴保留一次,待头部再次运动则删除。
{
if(map[a[aa]][b[bb]]!=wall)
{
map[a[aa]][b[bb]]=road;
paint(a[aa],b[bb]);
aa++;bb++;
kk--;
}
else
{aa+=9;bb+=9;map[a[aa]][b[bb]]=road;paint(a[aa],b[bb]);kk-=9;}
}
if(len>=18)//*版本代码
{
for (i=1;i<11;i++)
{map[a[k-11-i]][b[m-11-i]]=wall;paint((a[k-11-i]),(b[m-11-i]));}//从脑袋后第十二节开始变成墙
len-=8;
t+=4;
}
gotoxy(64,7);printf("3.分数:%d",iii);
Sleep(t-2*iii);//速度算法有待改进!!!!!!!!
}
if (len==0)//撞墙退出,退出while(1)总循环
break;
direction=getkey(direction);//按键按一下,getch提取并删除输入的字符,所以仍能继续进入while(!kbhit())中循环;
}
}
main()
{
srand(time(NULL));
hidden();
start();
game();
gotoxy(0,0);//锁定屏幕显示
getchar();
}
热心网友
时间:2023-10-21 10:19
这是我找别人的
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define food 7
#define head 5
#define body 6
#define wall 1
#define road 0
#define up 1
#define down 2
#define left 3
#define right 4
#define kuan 25
#define chang 30
#define num 20
int map[kuan][chang],hi,bj,fi,fj,t;//全局变量 地图数组 头部坐标,食物坐标,速度控制参数
void gotoxy(int x,int y) //移动坐标
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
void hidden()//隐藏光标
{
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
cci.bVisible=0;//赋1为显示,赋0为隐藏
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
}
void paint(int xx,int yy)
{
gotoxy(2*yy,xx);
switch(map[xx][yy])
{
case 0:printf(" ");break;
case 1:printf("□");break;
case 5:printf("◎");break;
case 6:printf("△");break;
case 7:printf("●");break;
}
}
void start()//初始化地图数组信息,随机蛇头位置,第一个食物位置
{
int i,j;
for(i=0;i<=kuan-1;i++)
{
map[i][0]=wall;
map[i][chang-1]=wall;
}
for(j=0;j<=chang-1;j++)
{
map[0][j]=wall;
map[kuan-1][j]=wall;
}
for (i=0;i<=kuan-1;i++)
for (j=0;j<=chang-1;j++)
paint(i,j);
gotoxy(64,2);printf("1.a减速//d加速");
gotoxy(64,4);printf("2. esc暂停");gotoxy(65,5);printf(" 任意键继续");
}
int getkey(int ddd)//接收按键根据当前方向按动任意键暂停不响应与运动方向相反的按键
{
char c;
while(c=getch())
{
switch(c)
{
case 72://1
{
if(ddd==2)
return down;
else
return up;
}
case 80://2
{
if(ddd==1)
return up;
else
return down;
}
case 75://3
{
if(ddd==4)
return right;
else
return left;
}
case 77://4
{
if(ddd==3)
return left;
else
return right;
}
case 27:continue;//esc暂停,a减速,d加速
case 97:{t+=10;return ddd;}
case 100:{t-=10;return ddd;}
default:{
return ddd;
}
}
return 0;
}
}
void game()
{
int fd=0,len=1,direction=4,a[100000],b[100000],k,m,kk=0,aa=0,bb=0,i,iii=0;
int sj=0;//sj用来记录吃到的果实的存放其坐标的数组的角标
int zz=0,mm=0,fa[num+2],fb[num+2];
t=250;//全局变量在这里赋值
hi=rand()%(kuan-7)+6;bj=rand()%(chang-8)+5;map[hi][bj]=head;paint(hi,bj);//在一定范围随机蛇头初始位置,身子为左侧3个格子(可以拓展写入game里面)
a[3]=hi;b[3]=bj;//头部位置存放到 a b数组中第四项中
for (i=0;i<3;i++)
{map[hi][bj-1-i]=body;paint(hi,bj-i-1);a[2-i]=hi;b[2-i]=(bj-i-1);}
//身子位置按照尾巴至颈部存放到 0 1 2 项中
k=4;m=4;//数组之后从第四位开始存放蛇头坐标
while(1)
{
while(!kbhit()&&len!=0)//当没有按键输入并且没有撞到墙使得len=0时候进入循环(防止撞到墙后没有按键输入仍终止不了)
{
while (fd<=num)//如果fd<=num 则进入循环随机刷新一个新果实
{
do
{fi=rand()%(kuan-3)+1;fj=rand()%(chang-3)+1;}
while(map[fi][fj]>0);//不在墙或者蛇的身体内
if(fd<20)
{map[fi][fj]=food;paint(fi,fj);fa[zz++]=fi;fb[mm++]=fj;fd++;}
else
{map[fi][fj]=food;paint(fi,fj);fa[sj]=fi;fb[sj]=fj;fd++;}//如果fd=20进来循环,就会把新生成的果实的坐标赋给被上次被吃的数组,便于之后的循环检测
}
switch(direction)
{
case 1: {map[hi][bj]=body;paint(hi,bj);hi--;break;}
case 2: {map[hi][bj]=body;paint(hi,bj);hi++;break;}
case 3: {map[hi][bj]=body;paint(hi,bj);bj--;break;}
case 4: {map[hi][bj]=body;paint(hi,bj);bj++;break;}
}
if ((map[hi][bj]==body)||(map[hi][bj]==wall))//在画出新的头部时刻先判断即将画出的位置是不是map上坐标为身子的位置。是则失败
{gotoxy(30,12);printf("失败了!");len=0;break;}
map[hi][bj]=head;paint(hi,bj);//接上,不是则执行这一步画出头部
a[k++]=hi;b[m++]=bj;kk++;//另设置两个数组记录头部经过的坐标,kk代表头部运行的次数
for(i=0;i<=num;i++)
{
if (hi==fa[i]&&bj==fb[i])//吃到了果实,fd+1,分数+1,长度+1,记录被吃的果实的坐标存放数组的角标
{fd=fd-1;len++;iii++;sj=i;}
}
if(kk>(len-1))//头部每走一步,kk++,删除之前的轨迹坐标所对应的身子,即尾巴。若吃到食物则尾巴保留一次,待头部再次运动则删除。
{
if(map[a[aa]][b[bb]]!=wall)
{
map[a[aa]][b[bb]]=road;
paint(a[aa],b[bb]);
aa++;bb++;
kk--;
}
else
{aa+=9;bb+=9;map[a[aa]][b[bb]]=road;paint(a[aa],b[bb]);kk-=9;}
}
if(len>=18)//*版本代码
{
for (i=1;i<11;i++)
{map[a[k-11-i]][b[m-11-i]]=wall;paint((a[k-11-i]),(b[m-11-i]));}//从脑袋后第十二节开始变成墙
len-=8;
t+=4;
}
gotoxy(64,7);printf("3.分数:%d",iii);
Sleep(t-2*iii);//速度算法有待改进!!!!!!!!
}
if (len==0)//撞墙退出,退出while(1)总循环
break;
direction=getkey(direction);//按键按一下,getch提取并删除输入的字符,所以仍能继续进入while(!kbhit())中循环;
}
}
main()
{
srand(time(NULL));
hidden();
start();
game();
gotoxy(0,0);//锁定屏幕显示
getchar();
}
热心网友
时间:2023-10-21 10:19
能,你不能运行的主要原因是你没有装EasyX
所以没有头文件"graphics.h"
而贪吃蛇大多依靠着个头文件来运行
热心网友
时间:2023-10-21 10:19
能,你不能运行的主要原因是你没有装EasyX
所以没有头文件"graphics.h"
而贪吃蛇大多依靠着个头文件来运行