C语言版贪吃蛇:第三部分
概述
经过前两章的学习,我们已经基本实现了游戏的一半功能
- 绘制围墙
- 绘制蛇,绘制食物
本章将要学习
如何使我们的蛇动起来
这是贪吃蛇游戏中最重要的功能,实现了运动,游戏的主体也就完成了。
蛇的运动
设计思路
- 设置一个while 循环语句,判断条件是是否有键盘读入
- 如果有键盘读入,根据读入的按键,选择是否改变运动方向。
- 如果没有键盘读入,则保持运动状态
重绘的方法
- 设置一个clear()函数,在原来蛇的地方打印空格,相当于把原来的蛇“擦掉”
- 根据键盘读入的按键,改变每一节蛇的坐标
- 再用 上一章的 printsnake( ) 把新的蛇打印出来
键盘读入函数
- 需要头文件 conio.h
- kbhit( ) :判断是否有按键输入
- getch( ) :读取按键,但不会在屏幕上显示出来
具体实现
定义变量
- direation: 存储当前运动方向(即键盘输入)
- direation_pre: 读入按键后,存储上一次的运动方向
- 主要是要避免原来向上运动,而键盘读入是下,产生bug。
- 字符型是为了存储 W,A,S,D
全局变量,参考代码
// 定义三个变量存 蛇长,蛇头,蛇尾
int lenth, head, nail;
// 食物位置
int food_x, food_y;
// 储存蛇的当前,和上一次的移动方向
char direation,direation_pre;
clear()函数
- 代码其实和printsnake( )基本一样,可以合并
- 这里为了理解方便重设了一个
- 将原来在坐标位置上答应 * (星号) 改为空格即可
参考代码如下:
// 清除蛇
void clear()
{
int i, j = head;
for (i = 1; i <= lenth; i++)
{
// 注意 里面的参数是j,j从蛇头移动到蛇尾
gotoxy(Snake[j].x, Snake[j].y);
printf(" ");
j = Snake[j].next;
}
}
move( )函数测试
- 现在这个部分只是做测试用的
- 以clear( ) 里面的for循环为模板
- 将打印部分替换成改变坐标
参考代码如下:
实现蛇的坐标右移一格
void move()
{
int i, j = head;
for (i = 1; i <= lenth; i++)
{
Snake[j].x++;
j = Snake[j].next;
}
}
测试时的主函数:
- 在主函数里设置一个while循环
- 依次调用三个函数
- clear( )
- move( )
- printsnake( )
- 实现蛇的不断右移
- 测试后会发现蛇移动太快了
- 这里加入一个Sleep函数,让程序中途停止一会
- Sleep( 参数); 单位是毫秒
参考代码如下
int main()
{
init(); // 初始化函数,绘制围墙
while(1)
{
clear();
move();
printsnake();
Sleep(150);
}
system("pause");
return 0;
}
正式版 move( ) 函数
回顾一下上章中介绍的运动原理
考虑到,每运动一次,实际上只有蛇头和蛇尾的位置有变化。可以通过将蛇尾接到蛇头前面,就可以得到新的蛇位置。
我们将基于这个原理进行程序的编写
- 根据 direation