用c语言写一个贪吃蛇小游戏
时间: 2023-11-18 19:02:13 浏览: 153
以下是一个简单的贪吃蛇小游戏的C语言代码,使用了Windows API库和控制台绘图,可以在Windows系统下运行:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
#define WIDTH 30 // 地图宽度
#define HEIGHT 20 // 地图高度
// 方向枚举
enum Direction {
UP,
DOWN,
LEFT,
RIGHT
};
// 蛇节点结构体
struct SnakeNode {
int x; // 节点横坐标
int y; // 节点纵坐标
struct SnakeNode* next; // 指向下一个节点的指针
};
// 全局变量
int score = 0; // 得分
int speed = 200; // 蛇移动速度(毫秒)
enum Direction direction = RIGHT; // 初始方向为向右
struct SnakeNode* head; // 蛇头指针
struct SnakeNode* tail; // 蛇尾指针
int food_x, food_y; // 食物坐标
// 初始化地图
void init_map() {
system("mode con cols=60 lines=25"); // 设置控制台窗口大小
system("title 贪吃蛇小游戏"); // 设置控制台窗口标题
srand((unsigned int)time(NULL)); // 随机数种子
food_x = rand() % WIDTH; // 随机生成食物坐标
food_y = rand() % HEIGHT;
}
// 初始化蛇
void init_snake() {
head = (struct SnakeNode*)malloc(sizeof(struct SnakeNode)); // 分配蛇头内存空间
head->x = WIDTH / 2; // 初始蛇头坐标为地图中心
head->y = HEIGHT / 2;
head->next = NULL;
tail = head; // 初始时蛇尾与蛇头重合,只有一个节点
}
// 生成食物
void generate_food() {
while (1) { // 随机生成食物坐标,直到不与蛇身重合
food_x = rand() % WIDTH;
food_y = rand() % HEIGHT;
struct SnakeNode* p = head;
while (p) {
if (p->x == food_x && p->y == food_y) {
break;
}
p = p->next;
}
if (!p) { // 食物坐标不与蛇身重合,退出循环
break;
}
}
}
// 在控制台绘制游戏界面
void draw() {
system("cls"); // 清空控制台
printf("贪吃蛇小游戏\n得分:%d\n", score); // 显示得分
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
if (x == food_x && y == food_y) { // 绘制食物
printf("●");
}
else if (x == head->x && y == head->y) { // 绘制蛇头
printf("■");
}
else { // 绘制空格
struct SnakeNode* p = head->next;
int flag = 0;
while (p) {
if (p->x == x && p->y == y) {
printf("■");
flag = 1;
break;
}
p = p->next;
}
if (!flag) {
printf(" ");
}
}
}
printf("\n");
}
}
// 蛇移动
void move() {
// 计算蛇头新坐标
int new_x = head->x, new_y = head->y;
switch (direction) {
case UP: new_y--; break;
case DOWN: new_y++; break;
case LEFT: new_x--; break;
case RIGHT: new_x++; break;
}
// 判断是否撞墙或撞到自己
if (new_x < 0 || new_x >= WIDTH || new_y < 0 || new_y >= HEIGHT) {
printf("游戏结束!得分:%d\n", score);
exit(0);
}
struct SnakeNode* p = head->next;
while (p) {
if (p->x == new_x && p->y == new_y) {
printf("游戏结束!得分:%d\n", score);
exit(0);
}
p = p->next;
}
// 判断是否吃到食物
if (new_x == food_x && new_y == food_y) {
score += 10;
speed -= 10;
generate_food(); // 生成新的食物
}
else { // 没有吃到食物,蛇尾移动
struct SnakeNode* tmp = tail;
tail = tail->next;
tail->next = NULL;
tail->x = new_x;
tail->y = new_y;
free(tmp);
}
// 蛇头移动
head->x = new_x;
head->y = new_y;
}
// 处理键盘输入
void handle_input() {
if (GetAsyncKeyState(VK_UP) && direction != DOWN) { // 上
direction = UP;
}
else if (GetAsyncKeyState(VK_DOWN) && direction != UP) { // 下
direction = DOWN;
}
else if (GetAsyncKeyState(VK_LEFT) && direction != RIGHT) { // 左
direction = LEFT;
}
else if (GetAsyncKeyState(VK_RIGHT) && direction != LEFT) { // 右
direction = RIGHT;
}
}
int main() {
init_map(); // 初始化地图
init_snake(); // 初始化蛇
generate_food(); // 生成食物
while (1) {
draw(); // 绘制游戏界面
move(); // 蛇移动
handle_input(); // 处理键盘输入
Sleep(speed); // 控制蛇移动速度
}
return 0;
}
```
运行以上代码后,可以使用方向键控制蛇的移动,吃到食物得分加10,速度加快,撞墙或撞到自己游戏结束,得分将会显示在控制台窗口中。
阅读全文