C语言小游戏--迷宫

迷宫

<
迷宫是一种有趣的游戏,也是计算机图形学中的经典问题之一。在游戏开发中,迷宫通常被用来测试玩家的智力和反应力。而在计算机图形学中,迷宫的设计和实现也是一个重要的研究方向。C语言是一门广泛使用的编程语言,可以用来设计各种各样的程序,包括迷宫游戏。本文将介绍如何使用C语言设计一个简单的迷宫游戏,并提供一些实现上的思路和技巧,希望能对初学者有所帮助。

代码运行环境

本文基于C语言三个头文件

#include <graphics.h>
#include <conio.h>
#include <time.h>

迷宫设计

迷宫设置

#define WIDTH 20   // 迷宫宽度
#define HEIGHT 10  // 迷宫高度
#define WALL_SIZE 30  // 墙的尺寸
#define PATH_COLOR RGB(216, 216, 216)
#define WALL_COLOR RGB(80, 80, 80)
#define PLAYER_COLOR RGB(0, 255, 0)
#define EXIT_COLOR RGB(255, 0, 0)

int maze[HEIGHT][WIDTH];  // 存储迷宫的二维数组
int player_x, player_y;   // 玩家所在位置的坐标
int exit_x, exit_y;       // 出口所在位置的坐标

绘制单元格

// 绘制单元格
void draw_cell(int x, int y, int type) {
    switch (type) {
    case 0:
        setfillcolor(PATH_COLOR);   // 空路
        break;
    case 1:
        setfillcolor(WALL_COLOR);   // 墙
        break;
    case 2:
        setfillcolor(PLAYER_COLOR); // 玩家
        break;
    case 3:
        setfillcolor(EXIT_COLOR);   // 出口
        break;
    default:
        break;
    }
    solidrectangle(x * WALL_SIZE, y * WALL_SIZE, (x + 1) * WALL_SIZE, (y + 1) * WALL_SIZE);
}

绘制迷宫

// 绘制迷宫
void draw_maze() {
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            draw_cell(j, i, maze[i][j]);
        }
    }
}

生成迷宫

// 生成迷宫                
void generate_maze() {
    // 初始化迷宫
    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            if (i == 0 || i == HEIGHT - 1 || j == 0 || j == WIDTH - 1) {
                maze[i][j] = 1;  // 迷宫边缘固定为墙
            }
            else {
                maze[i][j] = 0;  // 其余位置初始化为空路
            }
        }
    }

    // 随机生成迷宫的内部结构
    srand((unsigned int)time(NULL));

    for (int i = 1; i < HEIGHT - 1; i++) {
        for (int j = 1; j < WIDTH - 1; j++) {
            if (rand() % 100 < 30) {
                maze[i][j] = 1;
            }
        }
    }

    // 随机生成入口和出口
    player_y = rand() % (HEIGHT - 2) + 1;
    maze[player_y][0] = 2;

    exit_y = rand() % (HEIGHT - 2) + 1;
    maze[exit_y][WIDTH - 1] = 3;

    // 防止入口和出口重叠
    while (exit_y == player_y) {
        exit_y = rand() % (HEIGHT - 2) + 1;
    }
}

移动玩家

// 移动玩家
void move_player(int x, int y) {
    if (maze[y][x] != 1) {
        maze[player_y][player_x] = 0;
        player_x = x;
        player_y = y;
        maze[player_y][player_x] = 2;
    }
}

检查是否到达出口

// 检查是否到达出口
bool check_exit(int x, int y) {
    if (x == WIDTH - 1 && y == exit_y) {
        return true;
    }
    else {
        return false;
    }
}

主函数代码

int main() {
    initgraph(WIDTH * WALL_SIZE, HEIGHT * WALL_SIZE);
    generate_maze();
    draw_maze();

    while (1) {
        if (_kbhit()) {  // 判断是否有键盘输入
            char input = _getch();

            switch (input) {
            case 'w':
                move_player(player_x, player_y - 1);
                break;
            case 's':
                move_player(player_x, player_y + 1);
                break;
            case 'a':
                move_player(player_x - 1, player_y);
                break;
            case 'd':
                move_player(player_x + 1, player_y);
                break;
            default:
                break;
            }

            if (check_exit(player_x, player_y)) {
                    break;
            }

            draw_maze();
        }

        Sleep(5);  // 延时
    }

    closegraph();
    return 0;
}

#迷宫照片
迷宫图片

(制作不易)若需完整代码,请订阅专栏:

完整代码

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值