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
c语言游戏贪吃蛇源码
#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)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论