C语言贪吃蛇小游戏演示和说明

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

相关推荐
传奇开心果编程8 分钟前
【Rust入门知识点学与练】第3课:String 与 &str 的区别
开发语言·学习·rust
秋名RG19 分钟前
Java 核心特性一览
java·开发语言
平头哥AI1 小时前
Day 01 | go run 跑通第一个 Go 程序,go build 留下一个能拷走的 exe
开发语言·后端·golang
糖糖单片机设计1 小时前
STM32 老人跌倒监测报警系统
stm32·单片机·嵌入式硬件
葡萄城技术团队1 小时前
工业数据可视化:使用活字格 AIcoding + Three.js 构建轻量化三维设备监控大屏
开发语言·javascript·信息可视化
qiaosaifei1 小时前
JAVA老项目中有大量的类名_编译时报找不到符号错误
java·开发语言
聪明蛋子哟2 小时前
MCP协议深度落地:如何用Python/Java双语言实现统一的工具调用网关?
java·开发语言·python
是隼人2 小时前
buuctf-pwn [HarekazeCTF2019]baby_rop2(64位ret2libc)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
一晌小贪欢2 小时前
python-第27天:Python面向对象详解
开发语言·python·数据可视化·面向对象·python办公
智闲电子设计2 小时前
STM32 硬件 CRC 与 UID 实战:固件校验防变砖,UID 防抄板,这两个外设白用太可惜
stm32·单片机·嵌入式硬件