前言
这次要分享的博客是软件实习的课程项目二,主要是实现贪吃蛇。
具体实现主要是用到了链表(相比于数组的话,链表更容易,处理起来更方便,更快捷)。
一、贪吃蛇的核心思想。
小时候大家应该都玩过贪吃蛇的小游戏,那么回忆一下,一个贪吃蛇游戏有哪些比较重要的元素呢?主要也就是以下几点了:
- 地图。地图决定了贪吃蛇的活动区域,电脑屏幕的大小是固定的,如果你不决定地图的大小的话,你的蛇很可能会出去屏幕外面,这样都无法观测到蛇的运行了。
- 蛇头以及蛇身。想想贪吃蛇游戏,除了地图之外,如果没画出来蛇的图形的话,那岂不是黑乎乎的一片,什么也看不到吗。所以用什么来表示和画出蛇的样子,就需要我们去思考了。
- 食物。贪吃蛇,贪吃蛇,不吃食物怎么可以叫做贪吃蛇呢?所以要想想食物是怎么生成的,而且食物也不能生成在蛇的身体上,或者界外。
- 蛇的移动判断。贪吃蛇只有可以移动才能吃到食物,才能真正实现增加长度的功能,并且移动的方向还有移动是否可行的判断,我们都需要自己去考虑一下具体是如何是实现的。
- 显示得分和长度。其实说比较主要的因素,就是蛇和食物以及地图了,其他都是增加游戏的可玩性。往往一个很基础的东西通过一些优化之后会得到意想不到的效果,毕竟作为一个合格的程序员,要让自己写出来的东西得到认可的话,我们就必须要相反设法地去让自己写出来的应用或者程序更加吸引别人。得分和长度的显示就是为了增加游戏的可玩性,得分的话可以自己想一个公式,根据长度来判断得分。
二、实现的具体步骤
1.地图的生成
- 应该考虑的是,我们是要固定生成的地图,还是要让玩家决定地图的大小呢?
例如,固定地图的话,我们可以定义一个值为常数的全局变量,无论是地图的生成,还是一些食物生成的判断或者是蛇体撞墙的判断都可以使用那个全局变量。可以用一个宏定义来定义一个最大值N,然后生成地图的话可以用这个N来确定;
-下面是相关的代码,具体用处我在函数中已经注释出来了。 有一点在DEV C++中地图可以定义为map数组,可是到了VS中map数组已经有自己的初始化定义了,所以可能会报错,我们直接定义一个map1就可以解决所有问题了。
还有关于输出数组,如果用二维数组来输出的话,一定一定要在行和列的for循环中间加一个输出换行的符号,要不然会直接输入在同一行上的,所生成的地图出来会变的很不是样子。有兴趣的话可以把printf输出的那个换行注释掉,看一下生成的效果。
关于墙体形状的设置,一定要注意无论定义什么样的墙体,必须登场,字符串字节为1,那么在数组输出空白处的地方一定要是单空格,如果墙体输出的是两个字符的话,在空白处输出的一定要是双空格,要不输出的地图也会非常奇怪。
#define N 30;
map1[N][N];//所生成地图的数组大小
void print_wall() {
//用数组来输出整个地图,即为输出墙,其他都是空白的)
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
map1[i][j] = 0;
}
}
for (int i = 0; i <= N; i++) {
map1[i][L] = 1;
map1[i][b] = 1;//第一列和最后一列都赋值为1.
}
for (int i = 0; i <= N; i++) {
map1[H][i] = 1;
map1[a][i] = 1; //
}
for (int i = 0; i <= N; i++) {
for (int j = 0; j <= N; j++) {
if (map1[i][j] == 0)printf(" ");
if (map1[i][j] == 1)printf("■");
}
printf("\n");//这一行是非常非常关键的。
}
}
- 对于要让用户自己输入大小的话,其实原理都是差不多的,只不过我们要在输出地图的函数上定义要输入的参数,分别作为长和宽,基本也就是上个函数的整体内容,一个模子里刻出来的,就是长和宽的参数换了一下。
*有一个地方需要注意的是i表示行数,第几行,这在整个屏幕上其实是输入的宽,对应的j表示的列数,第几列,这个对应的才是整个电脑的长。
void print_wall(int,int)
cin>>m>>n;
print_wall(m,n);
void print_wall(int m, int n) {
//用数组来输出整个地图
int a, b;
a = m + H;//主要是为了生成居中一点
b = n + L;//居中
for (int i = 0; i < m+H; i++) {
for (int j = 0; j < n+L; j++) {
map1[i][j] = 0;
}
}
for (int i = H; i