贪吃蛇游戏相信是大家童年回忆,有各种各样的版本的,像数风格的、卡通形象的,等等,但是这些都只是表面装饰,真正的核心是不变的,那么我们就看下用C语言制作一个黑框版的简易贪吃蛇,是怎么样的吧。
首先制作一个简易地图以及各种会用到的变量:
char map[13][13] = {"************",
"*XXXXH *", //初始地图
"* *", //直接输出
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"************"};
int snakeX[SNAKE_MAX_LENGTH] = {1, 2, 3, 4, 5}; //定义初始坐标
int snakeY[SNAKE_MAX_LENGTH] = {1, 1, 1, 1, 1};
int snakeLength = 5; // 蛇的初始长度
int foodX = 0, foodY = 0; //食物的初始坐标
会移动的小虫子
首先最基本的一项就是移动。
void snakeMove (int x, int y) {
// 如果下一步蛇会撞到东西,则不让蛇行动,保证蛇只在框内游走
if(map[snakeY[snakeLength - 1] + y][snakeX[snakeLength - 1] + x] != BLANK_CELL)return;
cleanmap();
int i;
// 蛇身的坐标都替换成前一截身体的坐标(表示前进)
for (i = 0; i < snakeLength - 1; ++i) {
snakeX[i] = snakeX[i + 1];
snakeY[i] = snakeY[i + 1];
}
// 蛇头移向指令的方向一步 (身体会跟着移动)
snakeX[snakeLength - 1] += x;
snakeY[snakeLength - 1] += y;
renewSnake();
}
就是这么简单一个函数,将蛇头向指令方向走一步,身体其他部分跟着向前挪就好了(上面代码采取坐标的形式来移动)。这里蛇是永远不可能出去框中,或者撞到自己身体的,这只是个游动的小虫子(效果如下图)
会吃东西的蛇
那么贪吃蛇的精髓,肯定是“吃”啦,那如何让它吃东西呢?
//放置食物
void putfood () {
int i;
int food_on_snake ;
do {
foodX = rand() % 10 + 1; //随机食物放置的坐标,并让它不会放到墙上(1~11)
foodY = rand() % 10 + 1;
food_on_snake = 0;
for (i = 0; i < snakeLength; ++ i) {
//判断食物有没有放到蛇身上,如果有则重新随机
if (snakeX[i] == foodX && snakeY[i] == foodY) {
food_on_snake = 1;
break;
}
}
} while (food_on_snake == 1);
map[foodY][foodX] = SNAKE_FOOD ;//把食物打到表上
}
先随机放食物,并不能放到边界或蛇身上,那么吃,就是看蛇头有没有碰到食物啦
void judge_eatfood () {
//如果蛇头坐标与食物坐标相同,则吃到食物,需重新放置食物,以及变得更长
if (snakeX[snakeLength - 1] == foodX && snakeY[snakeLength - 1] == foodY &&
snakeLength < SNAKE_MAX_LENGTH) {
putfood();
snakeLength ++;
snakegrow();
}
//如果蛇达到最大长度,则吃到食物也不变长
else if(snakeX[snakeLength - 1] == foodX && snakeY[snakeLength - 1] == foodY) {
printf("**************************\n");
printf("***** You Win!!!! ****\n");
printf("**************************\n");
sleep (10);
}
//没吃到直接返回
else return;
}
吃到了就让蛇变长(即增加一节坐标):
void snakegrow () {
int i;
for (i = snakeLength - 1; i > 0; --i) {
snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
}
}
那么以上程序就可以做一个,一步一步走的贪吃蛇了。
但是一步一步仿佛很简单,这时候就要弄个检测键盘输入的函数了。
kbhit()函数就是这样,在windows里直接调用头文件< conio.h >就可以使用了。
只要在主函数里加一条if(kbhit)ch = getch();就能实现按一次键盘,就一直按一个方向走了。
至于智能蛇的算法,就像课件的伪代码一样,先搞个预判的函数,判断下一步走了,离食物的距离远近,向最近的方向走,但是这样就没考虑到与身体的距离,越到后面越可能被自己困住,所以先要学习一下其他算法,再进行分享。