【C/C++实战项目】扫雷游戏

文章介绍了一个使用C语言编写的扫雷游戏程序。程序通过Windows.h和time.h头文件实现清屏和随机数功能,初始化地图并设置地雷,然后提供打印和颜色控制功能以增强用户体验。玩家通过输入坐标进行扫雷,游戏逻辑检查坐标是否包含地雷,并更新显示。主函数中包含游戏循环和用户菜单选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

项目分析

外部头文件

初始化

打印

扫雷游戏函数

main函数


项目分析

  • 游戏需要自定义地图的大小、埋雷的数量
  • 通过输入坐标进行扫雷,输入的坐标是埋雷的地方,则游戏失败
  • 输入的坐标未埋雷,则该坐标显示周围8个坐标总共的雷数
  • 游戏初始化两个数组,一个用于埋雷,一个用于打印
  • 控制颜色,提高游戏体验感

效果展示

外部头文件

Windows.h头文件用于清屏和控制颜色

time.h头文件生成随机数埋雷

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>

初始化

地图大小的长宽各加一,方便每一次扫雷是计算周围的雷数

#define ROW 8
#define COL 8
#define ROWS (ROW + 2)
#define COLS (COL + 2)
#define BOOM 8

int g_mine[ROWS][COLS] = { 0 };
char g_show[ROWS][COLS] = { 0 };

void Init(char c) 
{
    int boom = BOOM;
    while (boom) 
    {
        int x = rand() % ROW + 1;
        int y = rand() % COL + 1;
        if (g_mine[x][y] == 0) 
        {
            g_mine[x][y] = 1;
            --boom;
        }
    }

    int i, j;
    for (i = 1; i <= ROW; ++i) 
        for (j = 1; j <= COL; ++j) 
            g_show[i][j] = c;
}

打印

Color函数通过系统的API接口控制输出端颜色

两个打印函数,一个用于游戏中每次操作后打印,一个用于游戏结束后打印初始地图

注:windows系统的颜色接口中,土黄色是6,绿色是10,红色是12,白色是15

void Color(int x) 
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
}

void Display() 
{
    Color(10);
    system("cls");
    printf("----- Mine Sweeping -----\n");
    int i, j;
    for (i = 0; i <= COL; ++i) 
        printf("%2d ", i);

    printf("\n");
    for (i = 1; i <= ROW; ++i) 
    {
        Color(10);
        printf("%2d ", i);
        for (j = 1; j <= COL; ++j) 
        {
            Color(6);
            printf(" %c ", g_show[i][j]);
        }
        printf("\n");
    }
}

void ShowMine() 
{
    Color(10);
    printf("\n");
    int i, j;
    for (i = 0; i <= COL; ++i) 
        printf("%2d ", i);

    printf("\n");
    for (i = 1; i <= ROW; ++i) 
    {
        Color(10);
        printf("%2d ", i);
        for (j = 1; j <= COL; ++j) 
        {
            if (g_mine[i][j] == 1) 
            {
                Color(12);
                printf(" B ");
            }
            else 
            {
                Color(6);
                printf(" * ");
            }
        }
        printf("\n");
    }
}

扫雷游戏函数

GetMineCount函数获取周围雷数,并将其转化为char类型返回

Sweep是扫雷函数,通过循环控制

char GetMineCount(int x, int y) 
{
    return g_mine[x - 1][y - 1] + 
        g_mine[x][y - 1] +
        g_mine[x + 1][y - 1] +
        g_mine[x - 1][y] +
        g_mine[x + 1][y] + 
        g_mine[x - 1][y + 1] +
        g_mine[x][y + 1] + 
        g_mine[x + 1][y + 1] + '0';
}

void Sweep() 
{
    int count = ROW * COL - BOOM;
    while (count) 
    {
        Color(15);
        printf("请输入坐标扫雷: ");
        int x, y;
        scanf("%d%d", &x, &y);
        if (x < 1 || x > ROW || y < 1 || y > COL) 
        {
            Color(15);
            printf("输入错误,请重新输入\n");
            continue;
        }
        if (g_mine[x][y] == 1) 
        {
            Color(15);
            printf("很遗憾,你踩到了地雷\n");
            ShowMine();
            return;
        }
        else 
        {
            if (g_show[x][y] == '*') 
            {
                g_show[x][y] = GetMineCount(x, y);
                Display();
                --count;
            }
            else 
            {
                Color(15);
                printf("该坐标已经标记过,请重新输入\n");
            }
        }
        if (count == 0) 
        {
            Color(15);
            printf("\n恭喜你,扫雷成功!\n");
            ShowMine();
        }
    }
}

void Game() 
{
    Init('*');
    Display();
    Sweep();
}

main函数

void Menu() 
{
    printf("\n");
    printf("-------------------\n");
    printf("-------------------\n");
    printf("----  1. Game  ----\n");
    printf("----  0. Exit  ----\n");
    printf("-------------------\n");
    printf("-------------------\n");
    printf("请选择:");
}

int main() 
{
    srand((unsigned int)time(NULL));
    int input;
    do     
    {
        Color(15);
        Menu();
        scanf("%d", &input);
        switch (input) 
        {
        case 1:
            Game();
            break;
        case 0:
            system("cls");
            printf("退出游戏\n");
            return 0;
        default:
            printf("输入错误, 请重新选择\n");
        }
    } while (input);
    return 0;
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AllinTome

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值