一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被吃掉,这时蛇的身体长一节,同时计1分;接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体)游戏结束。
单链表,并使用头插法。
Dev c++
ps:不同的编译工具可能导致有些代码无故报错,但编写贪吃蛇的思想是一样的
(①让蛇自行前进。②改变蛇的移动方向)
①如何让蛇自行移动:
我们就需要一个移动光标的函数,这个函数的名字可以自行创建,但函数里面必须要包含以下内容(详情请看我举例,这里我把我的光标移动函数命名为gotoxy( ) )。在创建光标函数的时候我们需要引入一个头文件 #include
当我们一个c语言 编译 运行 成功后,将会打开一个窗口,这时水平方向表示x轴,垂直方向表示y轴。但我们需要注意的是 x轴,y轴 的起始位置从0开始,所以在我的样例中,你会看见 pos.X = x-1; pos.Y = y-1; 这里我将x轴,y轴 的起始位置变成了从1开始。但如果你想让你的x轴,y轴 的起始位置从0开始,则需要将 pos.X = x; pos.Y = y;
#include
#include
void gotoxy(int x,int y){ //用于移动光标
COORD pos;
pos.X = x-1; //起始位置从1开始
pos.Y = y-1;
/*
pos.X = x; //起始位置从0开始
pos.Y = y;
*/
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
int main(){
gotoxy(50,10);
printf("*********");
gotoxy(50,30);
printf("*********");
return 0;
}
运行如图所示:
那如何让蛇自行移动呢?
首先我们需要定义蛇的结构,所以我们适用结构体,来定义:
typedef struct snake{
int x,y;
struct snake *SnakeNext;
}SNAKE,*Snake;
ps:在这篇文章中我主要的还是讲解,贪吃蛇的原理实现,代码可以比较少,但是在文章最后我会将我的源码分享出来。
如何让蛇移动:
在蛇移动之前,我们可以通过光标函数 gotoxy(),将蛇的初始化状态打印出来。
假设蛇的初始方向是 向左 那么这时我们只需要将蛇的蛇头的坐标变为向左后的坐标,这时蛇头的坐标已经变成了新的坐标。然后我们只需要一个循环将蛇的第一节身体变为蛇头以前的坐标,第二节身体变为第一节身体以前的坐标,然后依次类推。然后在用 上面提及到的光标函数 gotoxy(),将蛇依次打印出来。
那么这时我们会产生一个问题,随着蛇的移动,蛇的身体在运行窗口中可能会变得越来越长,这个不是因为 蛇的单链表中插入了数据,而是我们在蛇的移动中没有将蛇的尾部打印坐标对应的图案掩盖掉,这时我们只需要通过当蛇移动时,将蛇尾的坐标保留下来,然后在利用 光标函数 在这里打印一个 空格 从而掩盖蛇原先的蛇尾,每次移动我们都需要将蛇尾用空格进行掩盖。从而达到蛇移动的现象。
但是在蛇的运行过程中,我们会发现一个问题,就时蛇的移动速度太快了,那么这时我们该如何处理这个问题呢?
这时我们就需要用到一个新的函数 Sleep() 需要引入#include
ps:Sleep()函数的简单介绍
功 能: 执行挂起一段时间 (简单的说:当程序运行到Sleep()函数这里时,程序将暂停多长时间然后在继续运行)
eg: Sleep(50) 表示的是程序将暂停50毫秒
这个时候我们就引入一个问题,Sleep()函数,在贪吃蛇中有什么作用呢?
首先我们知道Sleep()函数可以将程序挂起,来控制程序的运行时间。所以我们可以通过这个函数来控制蛇的移动速度。为什么可以控制蛇的速度呢?其本质还是控制打印蛇的速度。
ps:通过Sleep()函数,那么我们就可以为游戏设置 游戏难度 的功能。
②如何让蛇改变移动方向:
在之前,我们需要了解两个函数,kbhit(),getch()。
函数名:kbhit()
功能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。
用 法:int kbhit(void);
C++语言包含头文件: include
。 C语言不需包含额外头文件。
在VC++6.0下为_kbhit()
功能及返回值同上;
函数名:getch():
所在头文件:conio.h
函数用途:从控制台读取一个字符,但不显示在屏幕上
函数原型:int getch(void)
返回值:读取的字符
例如:
char ch;或int ch;
getch();或ch=getch();
用getch();会等待你按下任意键,再继续执行下面的语句;
用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。
通过kbhit(),getch()这两个函数我们就可以用来控制蛇的移动。
列如 我们通过W A S D 来控制方向,当我们按下W的时候这时我们只需要改变 蛇头 的坐标,然后重复 蛇自行移动 的步骤从而使蛇移动。
那么当我们什么都不按下的时候,怎么可以让蛇自行移动呢?
ps: 我们可以将向上,向下,向左,向右,分别写一个函数,然后将其封装起来,然后在用一个死循环即可。
最后文章最后我将附上源码,供大家参考。
(①产生随机食物②蛇吃食物)
①产生随机食物:
需要srand() 和 rand()函数
include
#include
#include
int main(){
srand((unsigned)time(NULL));
for(int i=0;i<5;i++)
{
//srand((unsigned)time(NULL)); 只能调用一次,否者会使产生的随机数相同
printf("%d ",rand()%5+1);
}
return 0;
}
这样产生的随机数就是1-5之间的随机函数
这二个函数的工作过程如下:
1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3) 根据需要多次调用rand(),从而不间断地得到新的随机数;
4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
②蛇吃食物:
当蛇头按照它的运行轨迹下一个坐标将要到达食物的坐标时我们利用链表的头插法将食物的坐标插入进链表中,这时我们就不能将蛇的尾部进行覆盖。
利用光标函数,进行地图的打印。
当蛇撞到自己或者墙时表示死亡,我们可以用 exit(0) 来强制中断程序。需要头文件#include
需要导入头文件#include
system("color XY"); 中只需要改变X Y 的值就可以改变游戏背景的颜色。
百度云(贪吃蛇源码):
链接:https://pan.baidu.com/s/1kVvk_UgL0MR-BL9pcHTJtQ
提取码:lr78
如果第一个不得行可以试试下面这个:
https://pan.baidu.com/s/1Qe_YH8RWjSsfOkDHPkabgQ 提取码:sdd1
游戏GIF图展示
闯关模式:
休闲模式(可以选择地图,有三种地图,四种难度模式):