送餐的基本思路是在地图上随机找一个没有蛇和障碍物的地方,然后将这个地方的地图数组值标记为-1(之前我们让空地为0,障碍物为1)。
让我们写一个函数来判断一个点是否满足上述条件。
Int check(int ii,int jj) //要判断食物是否可以放在这个点,可以放回1,但不能放回0{ if(a[ii][jj]==1) //如果有障碍,返回0。
返回0;int I;for(I=0;isLength(一)
{if(ii==s[i]0jj==s[i][1]) //如果与其中一个蛇体重合,将返回0。
返回0;
}如果(ii==0 | | ii==h-1 | | | jj==0 | | jj==w-1)//如果它在边界之上,则返回0。
返回0;返回1;//最终过滤的点是合格的点}要使用随机数,首先
#包含stdlib.h然后,因为你想根据时间设置随机数种子,你必须
#includetime.h在init函数中编写这段代码。
srand((无符号)时间(NULL));//把随机数种子设置到现在的时间,然后写一个食物函数,这样就可以放一个食物进去了。
空食物()
{ int i,j;做
{
I=兰德()% H;//生成一个0到h-1之间的数字
j=兰德()% W;
}while(检查(I,j)=0);//生成点,直到满足条件。
a[I][j]=-1;//标记为食物gotoxy(i,j);
printf(' $ ');//绘制食物}然后在主中的循环前调用一次食物,这样在游戏开始时就有了食物。然后检查黑鱼是否与食物重叠,如果重叠,就叫一次食物,放入一个食物。
int main()
{
init();//程序开始时的初始化操作
draw map();//地图食品();而(1)
{
drawing();//画一条蛇
睡眠(等待时间);//等待一段时间键();
move();//移动蛇(主要是修改蛇体阵的数据)
如果(a[s[0][0]][s[0][1]]=-1)//如果蛇头碰到食物,再次放入食物,将食物点重置为0 {
食物();
a[s[0][0]][s[0][1]]=0;
}
}
getchar();返回0;
}来看看效果。
截至目前的代码:
# includes dio . H # includes dlib . H # includes time . H # includes windows . H #定义h23 #定义w75 #定义wait _ time 500//定义方向#定义up0 #定义down1 #定义left2 #定义right 3 in ta[H][//映射数组int s[H * W][2];//Snake坐标数组int sLength//蛇在方向上的长度;//Snake方向void init() //程序开头的初始化操作{
srand((无符号)时间(NULL));//将随机数种子设置为当前时间
CONSOLE _ CURSOR _ INFO CURSOR _ INFO={ 1,0 };
SetConsoleCursorInfo(GetStdHandle(STD _ OUTPUT _ HANDLE),cursor _ info);//隐藏徽标
int i,j;for(I=0;iH;(一)
{
a[I][0]=1;//让第一列为1
a[I][W-1]=1;//让最后一列为1}表示(j=0;jW;j)
{
a[0][j]=1;//让第一个行为1
a[H-1][j]=1;//让最后一个行为1}
sLength=4;//让蛇的初始长度为4
s[0][0]=H/2;
s[0][1]=W/2;//给黑鱼的坐标赋值
for(I=1;i4;(一)
{
s[I][0]=s[0][0]I;
s[I][1]=s[0][1];//给出蛇身的初始坐标}
方向=向上;
}void gotoxy(int i,int j) //移动光标{
坐标位置={j,I };
SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE),位置);
}int check(int ii,int jj) //判断此时是否可以放食物。可以放回1,但不能放回0{如果(a[ii][jj]==1) //有障碍,返回0。
返回0;int I;for(I=0;isLength(一)
{if(ii==s[i][0]jj==s[i][1]) //如果与其中一个蛇体重合,将返回0。
返回0;
}如果(ii==0 | | ii==h-1 | | | jj==0 | | jj==w-1)//如果它在边界之上,则返回0。
返回0;返回1;//最终过滤后,符合条件的点数为}void food()
{ int i,j;做
{
I=兰德()% H;//生成一个0到h-1之间的数字
j=兰德()% W;
} while(检查(I,j)=0);//生成点,直到满足条件。
a[I][j]=-1;//标记为食物gotoxy(i,j);
printf(' $ ');//绘制食物}void drawMap() //绘制地图{
gotoxy(0,0);int i,j;for(I=0;iH;(一)
{ for(j=0;jW;J) //Double for循环遍历数组{if(a[i][j]==0) //输出0的空格。
printf(' ');Else //是1输出#
printf(' # ');
}
printf(' n ');//别忘了换行}
}void move()
{ int I;
gotoxy(s[sLength-1][0],s[SLength-1][1]);
printf(' ');//在尾巴上画一个空格擦掉。
对于(I=Slength-1;i0;i - ) //从尾巴开始,每一个点的位置等于它前面一个点的位置{
s[I][0]=s[I-1][0];
s[I][1]=s[I-1][1];
}开关(方向)
{案例UP:
s[0][0]-;打破;下套管:
s[0][0];打破;左盒:
s[0][1]-;打破;右:号案件
s[0][1];打破;
}
}void drawSnake() //画蛇{ int I;for(I=0;isLength(一)
{
gotoxy(s[i][0],s[I][1]);//移动关标到蛇的坐标
printf(' @ ');//在这个位置画蛇}
}无效键()
{ if(kbhit()!=0) //如果有键盘输入{ char inwhile(!kbhit()==0) //如果玩家输入了多个按键,以最后一个按键为准
in=getch();开关(接通)
{案例w':案例W': if(方向!=DOWN) //不能缩头吧。
方向=向上;打破;案例s':案例S': if(方向!=向上)
方向=向下;打破;案例A':案例A': if(方向!=右)
方向=左;打破;案例d':案例D': if(方向!=左)
方向=右;打破;
}
}
}int main()
{
init();//程序开始时的初始化操作
绘制地图();//画地图食物();而(1)
{
绘图();//画蛇
睡眠(等待时间);//等待一段时间key();
move();//移动蛇(主要是修改蛇身数组的数据)
if(a[s[0][0]][s[0][1]]===-1)//如果蛇头碰到食物,就重新投放食物,并且把食物点重置为0 {
食物();
a[s[0][0]][s[0][1]]=0;
}
}
getchar();返回0;
}