学了编程后难免会有些手痒,于是饥渴难耐的我瞄上了小学的经典记忆——贪吃蛇。
下面我就游戏的设计来逐步讲解我打造C语言版贪吃蛇的过程。这是一个系列的文章,共三篇,第一篇讲游戏的主体设计,第二篇就设计的细节及具体实现给出讲解,第三篇给出简易游戏AI的设计。
游戏中用到了Windows的库,只保证能在Windows环境下运行。
先看最终效果:
游戏地图大小为40*30,这里为了测试缩小地图到10*10大小。
可以看到游戏里有启动提示,模式选择,作弊模式,排行榜的功能模块。
下面应用自顶向下,逐步求精的设计思想来完成这条蛇。
游戏主体设计
1. 框架分析
主函数是游戏的流程,包含:
- 开始游戏
用于游戏开始的提示,只显示一次。 - 选择模式
进行难度的选择。 - 进行游戏
游戏过程的主体。 - 游戏结束
用于游戏结束的提示,每次游戏结束都显示。 - 重新开始
返回第二步。
模板如下:
int main() {
startGame();
while(1) {
selectMode();
playGame();
gameOver();
restart();
}
return 0;
}
游戏的目标就是依次实现以上函数。
2. 要素分析
贪吃蛇里需要有基础的游戏功能及排行榜模块,据此分析贪吃蛇游戏需要的要素如下:
- 地图
地图控制蛇可移动的范围,地图只要在蛇移动一步局部刷新即可。地图在开始游戏时只打印一次。 - 蛇
蛇需要储存节点的坐标以及蛇长以及蛇的速度,以一个结构体实现。 - 食物
食物在蛇吃掉后需要立即在新位置产生,需要包含食物当前坐标以及是否存在的信息,以一个结构体实现。 - 玩家
用于记录玩家信息,每次结束游戏后进行排名,需要包含玩家姓名,游戏日期,以及分数,以一个结构体实现。
可以这么定义以上要素:
struct Snake {
int x[MAP_LENGTH * MAP_HIGHT];
int y[MAP_LENGTH * MAP_HIGHT];
int length;
int speed;
};
struct Food {
int x;
int y;
int exist;
};
struct Player {
char name[20];
char date[20];
int score;
};
其中蛇的x[n], y[n] 表示蛇节点的坐标,定义最大蛇长为地图长*宽,x[0], y[0] 表示蛇头的横纵坐标。