C语言贪吃蛇小游戏演示和说明
设计贪吃蛇游戏的主要目的是让大家夯实C语言基础,训练编程思维,培养解决问题的思路,领略多姿多彩的C语言。
游戏开始后,会在中间位置出现一条只有三个节点的贪吃蛇,并随机出现一个食物,如下图所示:
图1:游戏初始化
按下键盘上的任意一个键,贪吃蛇开始移动。和大部分游戏一样,你可以通过W、A、S、D四个键来控制移动方向,如下图所示:
图2:游戏进行中
当贪吃蛇出界或者撞到自己时,游戏结束,如下图所示:
图3:游戏结束
这个版本的贪吃蛇将有以下特点:
- 使用控制台(终端)
- ASCII字符表示蛇和食物
- 方向控制(W, A, S, D)
- 简单的游戏结束逻辑(蛇撞墙或撞到自己)
cpp
c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h> // 注意:这是特定于某些编译器的,如Borland C或Turbo C
#include <windows.h> // 用于Sleep函数
#define WIDTH 20
#define HEIGHT 10
#define SNAKE_LEN 100
typedef struct {
int x, y;
} Point;
Point snake[SNAKE_LEN], food;
int snakeSize = 3;
int direction = 2; // 0: left, 1: up, 2: right, 3: down
int gameOver = 0;
void initialize() {
for (int i = 0; i < WIDTH + 2; i++)
printf("#");
printf("\n");
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++)
printf(" ");
printf("#\n");
}
for (int i = 0; i < 3; i++) {
snake[i].x = WIDTH / 2 + i;
snake[i].y = HEIGHT / 2;
}
food.x = rand() % (WIDTH - 2) + 1;
food.y = rand() % (HEIGHT - 1) + 1;
while (snake[0].x == food.x && snake[0].y == food.y) {
food.x = rand() % (WIDTH - 2) + 1;
food.y = rand() % (HEIGHT - 1) + 1;
}
draw();
}
void draw() {
system("cls");
for (int i = 0; i < WIDTH + 2; i++)
printf("#");
printf("\n");
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
if (j == 0 || j == WIDTH - 1)
printf("#");
else if (i == snake[0].y && j == snake[0].x)
printf("O");
else {
int eat = 0;
for (int k = 0; k < snakeSize; k++)
if (snake[k].x == j && snake[k].y == i) {
printf("o");
eat = 1;
break;
}
if (!eat && i == food.y && j == food.x)
printf("F");
else
printf(" ");
}
}
printf("#\n");
}
for (int i = 0; i < WIDTH + 2; i++)
printf("#");
printf("\n");
}
void input() {
if (_kbhit()) {
switch (_getch()) {
case 'w':
case 'W':
if (direction != 1) direction = 0;
break;
case 's':
case 'S':
if (direction != 0) direction = 1;
break;
case 'a':
case 'A':
if (direction != 3) direction = 2;
break;
case 'd':
case 'D':
if (direction != 2) direction = 3;
break;
}
}
}
void move() {
Point head = snake[0];
switch (direction) {
case 0: head.x--; break;
case 1: head.y--; break;
case 2: head.x++; break;
case 3: head.y++; break;
}
// Check collision
if (head.x >= WIDTH || head.x < 0 || head.y >= HEIGHT || head.y < 0)
gameOver = 1;
for (int i = 1; i < snakeSize; i++)
if (snake[i].x == head.x && snake[i].y == head.y)
gameOver = 1;
for (int i = snakeSize - 1; i > 0; i--)
snake[i] = snake[i - 1];
snake[0] = head;
if (head.x == food.x && head.y == food.y) {
food.x = rand() % (WIDTH - 2) + 1;
food.y = rand() % (HEIGHT - 1) + 1;
snakeSize++;
while (snake[0].x == food.x && snake[0].y == food.y) {
food.x = rand() % (WIDTH - 2) + 1;
food.y = rand() % (HEIGHT - 1) + 1;
}
}
}
int main() {
initialize();
while (!gameOver) {
input();
move();
draw();
Sleep(100); // 控制游戏速度
}
printf("Game Over!\n");
return 0;
}
注意:
代码中使用了_kbhit()和_getch()函数,这些函数是特定于某些编译器的(如Borland C或Turbo C),在标准C库中并不包含。如果你使用的是GCC或其他不支持这些函数的编译器,你可能需要寻找替代方法(如使用curses库等)。
Sleep()函数用于Windows平台,如果你在其他平台上编译,可能需要替换为相应的函数(如usleep()在Unix/Linux上)。
演示程序百度网盘下载地址:百度网盘 请输入提取码 密码:u5ee