c语言贪吃蛇详解3.让蛇动起来

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

c语⾔贪吃蛇详解3.让蛇动起来
c语⾔贪吃蛇详解3.让蛇动起来
前⼏天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写⼀下题解。

我将分⼏步来教⼤家写⼀个贪吃蛇⼩游戏。

由于⼤家c语⾔未学完,这个教程只涉及数组和函数等知识点。

上次我已经教⼤家画出蛇了,现在我就教⼤家让蛇动起来。

为了让⼤家更好理解,蛇的移动就⽤最简单的办法,这⾥就不⽤链表,顺序队列什么的了。

蛇的移动就是头往前移动,然后后⾯的⾝体移动到前⼀节⾝体原来的位置上。

就像这样:
 int i;
for(i=sLength-1;i<1;i--) //从尾巴开始,每⼀个点的位置等于它前⾯⼀个点的位置
{
s[i][0]=s[i-1][0];
s[i][1]=s[i-1][1];
}
那蛇头怎么办呢?
为了确定蛇头的位置,我们定义⼀个变量原来存储蛇现在的⽅向。

int direction; //蛇的⽅向
我们可以通过direction的值来标记现在蛇的⽅向。

⽐如0代表上,1代表下。

为了⽅便,我们定义⼀些常量
//定义direction的每个值代表的⽅向
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
这样,我们就可以这样写
switch(direction)
{
case UP:
s[0][0]--;
break;
case DOWN:
s[0][0]++;
break;
case LEFT:
s[0][1]--;
break;
case RIGHT:
s[0][1]++;
break;
}
写好的move函数如下
void move()
{
int i;
for(i=sLength-1;i>0;i--) //从尾巴开始,每⼀个点的位置等于它前⾯⼀个点的位置
{
s[i][0]=s[i-1][0];
s[i][1]=s[i-1][1];
}
switch(direction)
{
case UP:
s[0][0]--;
break;
case DOWN:
s[0][0]++;
break;
case LEFT:
s[0][1]--;
break;
case RIGHT:
s[0][1]++;
break;
}
}
然后move写好了,我们还要写个循环,这样就可以让蛇⼀直动了。

地图画完⼀次并且画了蛇之后,我们要把光标移动到起始位置。

最简单的办法是每⼀次画地图的时候都把关标移动到(0,0)。

修改drawMap函数为下⾯这样。

在开头加⼀个设置位置的语句。

void drawMap() //画地图
{
gotoxy(0,0);
int i,j;
for(i=0;i<H;i++)
{
for(j=0;j<W;j++) //两重for循环遍历数组
{
if(a[i][j]==0) //为0输出空格
printf("");
else//为1输出#
printf("#");
}
printf("\n"); //别忘了换⾏
}
}
然后建⽴⼀个循环,不断地画蛇,移动。

int main()
{
init(); //程序开始时的初始化操作
drawMap(); //画地图
while(1)
{
drawSnake(); //画蛇
Sleep(WAIT_TIME); //等待⼀段时间
move(); //移动蛇(主要是修改蛇⾝数组的数据)
}
getchar();
return0;
}
然后观察⼀下,蛇确实⾛了,但是蛇的痕迹还在。

这样我们可以在蛇移动函数⾥⾯,擦去上⼀次的尾巴。

修改过后的move函数如下
void move()
{
int i;
gotoxy(s[sLength-1][0],s[sLength-1][1]);
printf(""); //在尾巴上⾯画空格以擦除尾巴
for(i=sLength-1;i>0;i--) //从尾巴开始,每⼀个点的位置等于它前⾯⼀个点的位置 {
s[i][0]=s[i-1][0];
s[i][1]=s[i-1][1];
}
switch(direction)
{
case UP:
s[0][0]--;
break;
case DOWN:
s[0][0]++;
break;
case LEFT:
s[0][1]--;
break;
case RIGHT:
s[0][1]++;
break;
}
}
运⾏⼀下,蛇动起来了。

然后试试修改下⽅向。

在init函数最后写⼀个
direction=LEFT;
再运⾏试试
好,感觉很正常。

现在我们可以通过给direction变量赋值来改变蛇的前进⽅向了。

接下来,我们试试⽤键盘控制它。

写⼀个新函数key,⽤来处理键盘输⼊。

我们的输⼊不能在屏幕上有痕迹,并且不能输⼊⼀个按键就回车⼀下。

所以我们⽤getch函数。

加conio.h头⽂件。

然后getch会暂停程序等待输⼊,⽽蛇只在转弯的时候需要输⼊。

所以我们就需要⼀个判断有没有输⼊的函数
然后通过输⼊的字符是w还是a还是s或者d来控制蛇的⽅向。

void key()
{
if(kbhit()!=0) //如果有键盘输⼊
{
char in;
while(!kbhit()==0) //如果玩家输⼊了多个按键,以最后⼀个按键为准
in=getch();
switch(in)
{
case'w':
case'W':
if(direction!=DOWN) //不能缩头吧。

direction=UP;
break;
case's':
case'S':
if(direction!=UP)
direction=DOWN;
break;
case'a':
case'A':
if(direction!=RIGHT)
direction=LEFT;
break;
case'd':
case'D':
if(direction!=LEFT)
direction=RIGHT;
break;
}
}
}
好了,现在我们就能通过wasd这四个按键控制蛇到处⾛了。

(进⼊游戏先切换为英⽂输⼊法)
下⾯附这⼀步的完整代码。

#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
#define H 23
#define W 75
#define WAIT_TIME 500
//定义direction的每个值代表的⽅向
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
int a[H][W]; //地图数组
int s[H*W][2]; //蛇⾝坐标数组
int sLength; //蛇的长度
int direction; //蛇的⽅向
void init() //程序开始时的初始化操作
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); //隐藏关标
int i,j;
for(i=0; i<H; i++)
{
a[i][0]=1; //让第⼀列为1
a[i][W-1]=1; //让最后⼀列为1
for(j=0; j<W; 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;i<4;i++)
{
s[i][0]=s[0][0]+i;
s[i][1]=s[0][1]; //给刚开始的蛇⾝⼏个初始坐标
}
direction=UP;
}
void gotoxy(int i,int j) //移动光标
{
COORD position={j,i};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position); }
void drawMap() //画地图
{
gotoxy(0,0);
int i,j;
for(i=0;i<H;i++)
{
for(j=0;j<W;j++) //两重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(""); //在尾巴上⾯画空格以擦除尾巴
for(i=sLength-1;i>0;i--) //从尾巴开始,每⼀个点的位置等于它前⾯⼀个点的位置 {
s[i][0]=s[i-1][0];
s[i][1]=s[i-1][1];
}
switch(direction)
{
case UP:
s[0][0]--;
break;
case DOWN:
s[0][0]++;
break;
case LEFT:
s[0][1]--;
break;
case RIGHT:
s[0][1]++;
break;
}
}
void drawSnake() //画蛇
{
int i;
for(i=0;i<sLength;i++)
{
gotoxy(s[i][0],s[i][1]); //移动关标到蛇的坐标
printf("@"); //在这个位置画蛇
}
}
void key()
{
if(kbhit()!=0) //如果有键盘输⼊
{
char in;
while(!kbhit()==0) //如果玩家输⼊了多个按键,以最后⼀个按键为准
in=getch();
switch(in)
{
case'w':
case'W':
if(direction!=DOWN) //不能缩头吧。

direction=UP;
break;
case's':
case'S':
if(direction!=UP)
direction=DOWN;
break;
case'a':
case'A':
if(direction!=RIGHT)
direction=LEFT;
break;
case'd':
case'D':
if(direction!=LEFT)
direction=RIGHT;
break;
}
}
}
int main()
{
init(); //程序开始时的初始化操作
drawMap(); //画地图
while(1)
drawSnake(); //画蛇
Sleep(WAIT_TIME); //等待⼀段时间
key();
move(); //移动蛇(主要是修改蛇⾝数组的数据) }
getchar();
return0;
}。

相关文档
最新文档