贪吃蛇

题目:C语言编写一个贪吃蛇游戏,要求:

1. 蛇在一块区域中吃食物,吃完食物后,蛇的身体会变长,同时蛇的运动速度加快

2. 用户按上,下,左,右键,蛇会上下左右跑

3. 蛇可以咬死自己,撞墙死,然后游戏结束,用户按Esc键,游戏强制结束

分析:

1. 首先要弹出一个游戏欢迎界面,在欢迎界面上显示游戏的规则,这些规则设定在屏幕中间位置,所以,需要定位屏幕的光标位置,然后输出相关信息。

       设置光标位置函数,可以借助如下函数:
BOOL SetConsoleCursorPosition(HANDLE hConsoleOutputCOORD dwCursorPosition);
该函数第一个参数类型是HANDLE,用于定义屏幕句柄,第二个参数是结构体类型COORD,用于定义光标的横纵坐标。该函数的作用是利用屏幕的句柄将光标定位在结构体变量指定的位置处。代码如下:

贪吃蛇

        定义欢迎界面函数,利用上述光标定位函数,在指定位置处输出相应信息:

贪吃蛇

2. 然后进入游戏开始界面。在该界面中要搭建好游戏的边界,以及初始化一条蛇,和在某个位置设定一个食物。

      (1) 搭建游戏边界函数:自己设定边界的大小及摆放的位置,用一个个□构成边界,注意,屏幕上向右 和向下分别是x轴,y轴增大的方向,因为需要很多□,所以将其设置为宏。边界的大致图像如下图:

贪吃蛇


贪吃蛇

贪吃蛇

       (2)要用*绘制出一条蛇,所以,将*也设置为宏。每个*的摆放均需要位置,所以将蛇的身体结点*设置为结构体变量,用于储存每个节点的位置信息,蛇的身体是由一个个*串起来,所以还要存储指向下个结点的指针变量,因此,将蛇的身体信息存储在一个链表中:

贪吃蛇

贪吃蛇

      关于蛇的描述不止有蛇的身体,还有蛇的运动方向,蛇的运动方向,蛇的存活状态,蛇的停顿时间以及蛇的食物。而对于蛇的每个描述可能有不同的情况,所以将每个描述的可能情况列举出来,将每个描述集合在结构体中,可以利用结构体遍历便于管理蛇的各个描述:

贪吃蛇

       接下来就是初始化蛇的相关信息,并在屏幕上绘制蛇的身体,蛇的初始位置可以人为设置好:

贪吃蛇

贪吃蛇

        然后随机生成食物的位置,并根据该位置将食物打印在屏幕上:

贪吃蛇

        整个第2步过程为:

贪吃蛇

3. 游戏开始界面设定好后,游戏便开始进行。游戏开始后,除了蛇自己咬死,撞墙死,玩家强制退出可以使游戏结束,否则游戏将一直进行下去。玩家可以按键盘上的上下左右键来控制蛇的运动方向,蛇每走一步,就要判断蛇的存活状态,如果蛇死亡,弹出相应的死亡信息,否则,游戏一直进行。

       (1)首先,读取键盘上的虚拟键,可以使用函数:void GetAsyncKeyState(int VKey),该函数的参数是键盘上的虚拟键指定的特定常量,如VK_RIGHT就表示键盘上的向右的方向键,如果玩家按了相应的键,该函数就返回一个非零值,否则返回零值。

      (2) 然后,根据玩家指定的方向蛇开始运动,蛇的运动过程就是不断打印*的过程,蛇运动过程中会吃食物,所以每向前一步就要判断下一步是否会吃到食物。

贪吃蛇

贪吃蛇

       如果有食物,蛇的身体就会变长,就要多绘制一个*,同时蛇的速度加快:

贪吃蛇

        如果没有食物,蛇的长度不变,当蛇要在运动的方向绘制图案

贪吃蛇

        蛇运动过程为:

贪吃蛇

贪吃蛇

        (3)蛇每运动一步,就要判断蛇的存活状态,若死亡,是什么原因死亡,若存活,要停顿一下,然后继续运动。

       如果蛇的头碰到蛇的身体,说明蛇自己咬死自己。此时弹出咬死自己的相关信息。

贪吃蛇

       如果蛇的头撞到边界,说明蛇撞墙了。此时弹出撞墙的相关信息。

贪吃蛇

        如果玩家按Esc键退出,弹出强制退出的信息。

        整个蛇运动过程(第3步)为:

贪吃蛇

贪吃蛇

总:蛇运动的这三步为:

贪吃蛇

运行结果:

欢迎界面:

贪吃蛇

游戏开始界面:

贪吃蛇

蛇咬死自己界面:

贪吃蛇

蛇撞墙界面:

贪吃蛇

玩家强制退出界面:

贪吃蛇

本游戏还存在许多的不足,欢迎大家随时指教。