C语言贪吃蛇详解

一、数据结构和算法

C语言贪吃蛇主要运用了以下数据结构和算法:

1. 链表

typedef struct body {
    int x;
    int y;
    struct body *next;
} body;

贪吃蛇身体使用链表来储存,每个节点包括x,y坐标和下一个节点的指针。新的节点插入在头部,旧的节点从尾部删除。

2. 随机数

#include 
srand(time(NULL));
int rand_num = rand() % 4;

每次移动时,贪吃蛇会随机生成一个随机数,决定下一步往上、下、左、右哪个方向移动。

3. 碰撞检测

for (body *ptr = snake->next; ptr != NULL; ptr = ptr->next) {
    if (snake->x == ptr->x && snake->y == ptr->y) {
        return true;
    }
}

贪吃蛇在移动时需要检测是否与自己相撞,通过遍历链表来检查贪吃蛇的头部与身体的坐标是否重复。

二、游戏逻辑实现

贪吃蛇的整个游戏逻辑包括游戏的启动、渲染、输入接收和移动。

1. 启动

游戏启动时需要生成初始的贪吃蛇身体节点和食物坐标,以及初始化游戏地图。

body *snake = malloc(sizeof(body)); // 初始化蛇的头部节点
snake->x = 10;
snake->y = 10;
snake->next = NULL;

int food_x = rand() % map_width;
int food_y = rand() % map_height;

2. 渲染

游戏需要在终端上进行渲染,包括游戏地图、贪吃蛇身体和食物。

printf("Score: %d\n", score);
for (int i = 0; i < map_height; i++) {
    for (int j = 0; j next; ptr != NULL; ptr = ptr->next) {
                if (ptr->x == j && ptr->y == i) {
                    printf("#");
                    body_flag = true;
                    break;
                }
            }
            if (!body_flag) {
                printf(".");
            }
        }
    }
    printf("\n");
}

3. 输入接收

游戏需要接收玩家的键盘输入,来控制贪吃蛇的方向。

char input = getch();
switch (input) {
    case 'w':
        if (direction != 2) direction = 0;
        break;
    case 's':
        if (direction != 0) direction = 2;
        break;
    case 'a':
        if (direction != 1) direction = 3;
        break;
    case 'd':
        if (direction != 3) direction = 1;
        break;
}

4. 移动

贪吃蛇每隔一段时间就会向前移动一格,玩家需要控制方向来移动贪吃蛇。

int next_x = snake->x;
int next_y = snake->y;
switch (direction) {
    case 0: // 上
        next_y--;
        break;
    case 1: // 右
        next_x++;
        break;
    case 2: // 下
        next_y++;
        break;
    case 3: // 左
        next_x--;
        break;
}

三、代码示例

以下是完整的C语言贪吃蛇代码示例:

#include 
#include 
#include 
#include 
#include 

#define map_width 20
#define map_height 20

typedef struct body {
    int x;
    int y;
    struct body *next;
} body;

int score = 0;
int direction = 1;

body *snake;

void generate_food(int *food_x, int *food_y)
{
    do {
        *food_x = rand() % map_width;
        *food_y = rand() % map_height;
    } while (*food_x == snake->x && *food_y == snake->y);

}

bool check_collision(int x, int y)
{
    if (x = map_width || y = map_height) { // 超出边界
        return true;
    }

    for (body *ptr = snake->next; ptr != NULL; ptr = ptr->next) { // 撞到自己
        if (x == ptr->x && y == ptr->y) {
            return true;
        }
    }

    return false;
}

void game_over()
{
    printf("\nGame over!\nYour Score: %d\n", score);
    exit(0);
}

void game_loop()
{
    int food_x, food_y;
    generate_food(&food_x, &food_y);

    while (true) {
        system("cls");
        printf("Score: %d\n", score);
        for (int i = 0; i < map_height; i++) {
            for (int j = 0; j next; ptr != NULL; ptr = ptr->next) { // 蛇身体
                        if (ptr->x == j && ptr->y == i) {
                            printf("#");
                            body_flag = true;
                            break;
                        }
                    }
                    if (!body_flag) { // 空格
                        printf(".");
                    }
                }
            }
            printf("\n");
        }

        // 移动
        int next_x = snake->x;
        int next_y = snake->y;
        switch (direction) {
            case 0: // 上
                next_y--;
                break;
            case 1: // 右
                next_x++;
                break;
            case 2: // 下
                next_y++;
                break;
            case 3: // 左
                next_x--;
                break;
        }

        if (check_collision(next_x, next_y)) { // 检测碰撞
            game_over();
        }

        // 头部移动
        body *new_head = malloc(sizeof(body));
        new_head->x = next_x;
        new_head->y = next_y;

        new_head->next = snake;
        snake = new_head;

        // 检查是否吃到食物
        if (next_x == food_x && next_y == food_y) {
            score++;
            generate_food(&food_x, &food_y);
        } else {
            // 尾部删除
            body *prev_tail = snake;
            body *tail = snake->next;
            while (tail->next != NULL) {
                prev_tail = tail;
                tail = tail->next;
            }
            prev_tail->next = NULL;
            free(tail);
        }

        // 等待一段时间
        Sleep(100);
    }
}

int main()
{
    snake = malloc(sizeof(body)); // 初始化蛇的头部节点
    snake->x = 10;
    snake->y = 10;
    snake->next = NULL;

    srand(time(NULL));

    game_loop();

    return 0;
}

原创文章,作者:PSJMI,如若转载,请注明出处:https://www.506064.com/n/373241.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PSJMIPSJMI
上一篇 2025-04-25 15:26
下一篇 2025-04-25 15:26

相关推荐

  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • 学习Python对学习C语言有帮助吗?

    Python和C语言是两种非常受欢迎的编程语言,在程序开发中都扮演着非常重要的角色。那么,学习Python对学习C语言有帮助吗?答案是肯定的。在本文中,我们将从多个角度探讨Pyth…

    编程 2025-04-29
  • Python被称为胶水语言

    Python作为一种跨平台的解释性高级语言,最大的特点是被称为”胶水语言”。 一、简单易学 Python的语法简单易学,更加人性化,这使得它成为了初学者的入…

    编程 2025-04-29
  • OpenJudge答案1.6的C语言实现

    本文将从多个方面详细阐述OpenJudge答案1.6在C语言中的实现方法,帮助初学者更好地学习和理解。 一、需求概述 OpenJudge答案1.6的要求是,输入两个整数a和b,输出…

    编程 2025-04-29
  • Python按位运算符和C语言

    本文将从多个方面详细阐述Python按位运算符和C语言的相关内容,并给出相应的代码示例。 一、概述 Python是一种动态的、面向对象的编程语言,其按位运算符是用于按位操作的运算符…

    编程 2025-04-29
  • Python语言由荷兰人为中心的全能编程开发工程师

    Python语言是一种高级语言,很多编程开发工程师都喜欢使用Python语言进行开发。Python语言的创始人是荷兰人Guido van Rossum,他在1989年圣诞节期间开始…

    编程 2025-04-28
  • Python语言设计基础第2版PDF

    Python语言设计基础第2版PDF是一本介绍Python编程语言的经典教材。本篇文章将从多个方面对该教材进行详细的阐述和介绍。 一、基础知识 本教材中介绍了Python编程语言的…

    编程 2025-04-28
  • Python语言实现人名最多数统计

    本文将从几个方面详细介绍Python语言实现人名最多数统计的方法和应用。 一、Python实现人名最多数统计的基础 1、首先,我们需要了解Python语言的一些基础知识,如列表、字…

    编程 2025-04-28
  • Python作为中心语言,在编程中取代C语言的优势和挑战

    Python一直以其简单易懂的语法和高效的编码环境而著名。然而,它最近的发展趋势表明Python的使用范围已经从脚本语言扩展到了从Web应用到机器学习等广泛的开发领域。与此同时,C…

    编程 2025-04-28
  • Python基础语言

    Python作为一种高级编程语言拥有简洁优雅的语法。在本文中,我们将从多个方面探究Python基础语言的特点以及使用技巧。 一、数据类型 Python基础数据类型包括整数、浮点数、…

    编程 2025-04-28

发表回复

登录后才能评论