字符游戏——贪吃蛇
如何用C语言写出一个贪吃蛇小游戏呢?
首先是游戏的场景设定,首先初始化和相关预设定及变量声明:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>r BL_CHA ' ';
char WALL_CHAR = '*';
char SNAKE_HEAD_CHAR = 'H';
char SNAKE_BODY_CHAR = 'X';
char FOOD_CHAR = '$';
char map[12][13] = {
"************",
"*XXXXH *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"************",
};
int snakeBodyX[100] = { 1,1,1,1 }, snakeBodyY[100] = { 4,3,2,1 };
int snakeBodyLen = 4;
int snakeTailIndex = 3;
int willBeLonger = 0;
int foodX = 0, foodY = 0;
int gameRunning = 1;
然后要每输入符界面刷新一次:
void printMap() {
system("cls");
for (int i = 0; i < 12; ++i) {
printf("%s\n", map[i]);
}
}
随机创建食物:
void spaood() {
// Random food position
foodX = rand() % 10 + 1;
foodY = rand() % 10 + 1;
while (map[foodX][foodY] != BLANK_CHAR) {
foodX = rand() % 10 + 1;
foodY = rand() % 10 + 1;
}
map[foodX][foodY] = FOOD_CHAR;
}
输入字符移动蛇并产生相关事件,吃食物和判断是否游戏失败:
void snakeMove(char control) {
map[snakeHeadX][snakeHeadY] = BLANK_CHAR;
// record the previous snake head position
int prevSnakeHeadX = snakeHeadX;
int prevSnakeHeadY = snakeHeadY;
switch (control) {
case 'w':
snakeHeadX--;
break;
case 'a':
snakeHeadY--;
break;
case 's':
snakeHeadX++;
break;
case 'd':
snakeHeadY++;
break;
default:
return;
}
if (map[snakeHeadX][snakeHeadY] != BLANK_CHAR && map[snakeHeadX][snakeHeadY] != FOOD_CHAR) {
// DIED
gameOver();
}
map[snakeHeadX][snakeHeadY] = SNAKE_HEAD_CHAR;
int moved = 0;
// If willBeLonger, then make it longer
if (willBeLonger) {
willBeLonger = 0;
moved = 1;
// make space
for (int i = snakeBodyLen - 1; i > snakeTailIndex; --i) {
snakeBodyX[i + 1] = snakeBodyX[i];
snakeBodyY[i + 1] = snakeBodyY[i];
}
snakeBodyX[snakeTailIndex + 1] = prevSnakeHeadX;
snakeBodyY[snakeTailIndex + 1] = prevSnakeHeadY;
if (snakeTailIndex < 0) snakeTailIndex = 0;
map[prevSnakeHeadX][prevSnakeHeadY] = SNAKE_BODY_CHAR;
snakeBodyLen++;
}
// Check if ate food
if (snakeHeadX == foodX && snakeHeadY == foodY) {
willBeLonger = 1;
spawnFood();
}
// Head has already moved, **Move the body**
// if "no body" here or added tail just now, then it needn't move
if ( moved) return;
map[snakeBodyX[snakeTailIndex]][snakeBodyY[snakeTailIndex]] = BLANK_CHAR;
snakeBodyX[snakeTailIndex] = prevSnakeHeadX;
snakeBodyY[snakeTailIndex] = prevSnakeHeadY;
map[prevSnakeHeadX][prevSnakeHeadY] = SNAKE_BODY_CHAR;
// Move tail index
snakeTailIndex = (snakeTailIndex - 1 + snakeBodyLen) % snakeBodyLen;
}
游戏结束界面:
void gameOver() {
printf("GAME OVER!!\n");
gameRunning = 0;
}
主程序:游戏的启动和运行:
int main() {
// Initialize random seed
srand(time(NULL));
initGame();
char control = 0;
while (gameRunning) {
scanf(" %c", &control); // " %c": the space is used to skip blank character, like '\n'
snakeMove(control);
printMap();
}
return 0;
}