【C/C++数据结构与算法】C语言扫雷游戏

news2024/10/7 14:22:02

目录

项目分析

外部头文件

初始化

打印

扫雷游戏函数

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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/663066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis入门指南:面向测试工程师

现在测试工程师面试难度越来越大&#xff0c;关于技术方面考察&#xff0c;很多面试官经常会问你是否了解过Redis缓存中间件&#xff0c;这道题一方面是考察你是否对后端技术有一定了解&#xff0c;另一方面也考察你测试工作的深浅。 所以本文将由浅到深、由易到难列举Redis相…

亿发软件:智慧中医馆一体化系统解决方案,实现中医药煎配信息化

近年来&#xff0c;随着中药制造领域先进技术的大力推广和应用&#xff0c;先进制造技术的融合对关键工艺和装备进行了革新。传感器、过程检测技术、自动化设备和信息管理系统的采用显著提高了中药汤剂的生产。下面我们来探讨一下中药煎配信息化管理系统&#xff1a;中药生产过…

photoshop beta正在面临高峰 用不了报错的解决方法

作为一款非常实用的修图软件&#xff0c;photoshop beta是很多正在工作的白领都会使用的&#xff0c;我们可以在其中完成图片的制作&#xff0c;方便又快捷&#xff0c;为大家的工作提供了更多便捷的服务。不过最近也有部分用户在使用这个软件的时候出现了正在面临高峰的报错&a…

LeetCode·1262. 可被三整除的最大和·贪心

作者&#xff1a;小迅 链接&#xff1a;https://leetcode.cn/problems/greatest-sum-divisible-by-three/solutions/2314049/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun-r0n76/ 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 著作权归作者所有。商业转载请联系作者获得…

企业数字化转型的“整体规划”与“人才建设”有多重要?

超级干货&#xff01;&#xff01;全文爆肝5000字&#xff0c;一篇文章带你全面掌握低代码起源以及数字化转型的整体规划与人才建设&#xff0c;本文无废话&#xff0c;全程高能&#xff0c;全部都是来自于实践经验&#xff0c;纯小白也能看懂。 建议先点赞收藏&#xff0c;码…

电脑出现“无法启动此程序,因为计算机中丢失MSVCR71.dll”怎么办?

MSVCR71.dll是一个动态链接库&#xff0c;是Windows系统用于操作应用程序的文件。当某个应用程序需要文件中的某个函数时&#xff0c;将调用DLL文件。MSVCR71.dll错误通常出现于启动应用程序时&#xff0c;因此我们会收到“无法启动此程序&#xff0c;因为计算机中丢失MSVCR71.…

从0到1精通自动化测试,pytest自动化测试框架,环境准备与入门(一)

目录 一、前言 二、pytest简介 三、安装pytest 四、快速开始 五、写个测试类 六、pytest用例规则 一、前言 先说下为什么要学pytest&#xff0c;在此之前相信大伙已经掌握了python里面的单元测试单元测试框架&#xff0c;那再学一个框架肯定是需要学习时间的 刚开始我原…

019: vue中使用fetch读取本地txt文件

第019个 查看专栏目录: VUE — element UI 在做卫星项目的时候&#xff0c;会将两行根数放在txt文件中&#xff0c;放在public的文件夹中&#xff0c; 如何读取呢&#xff1f; 可以用以下方法&#xff1a; 方法1 loadFile(name) { const xhr new XMLHttpRequest() const okS…

【人工智能】— 无监督学习、K-means聚类(K-means clustering)、K-means损失函数,目标函数

【人工智能】— 无监督学习、K-means聚类&#xff08;K-means clustering&#xff09;、K-means损失函数&#xff0c;目标函数 无监督学习聚类&#xff08;Clustering&#xff09;K-means聚类&#xff08;K-means clustering&#xff09;K-means损失函数目标函数策略&#xff1…

pikachu靶场-url重定向

打开测试界面 不安全的URL跳转 发现有四条超链接&#xff0c;依次打开都会进行内容跳转 当我们点击最下面的一个超链接&#xff0c;可以看到url变成了这样 我们对urli进行参数修改 设置payload为 http://ip:port/vul/urlredirect/urlredirect.php?urlhttp://www.baidu.com输…

Unity的IL2CPP

​ 目录 背景 概念 AOT编译器 运行时库 对比 Mono IL2CPP IL2CPP打包注意事项 类型裁剪 泛型实例 泛型方法 背景 在Unity4.6.1 p5以后版本中&#xff0c;在PlayerSettings—>Other Settings—>Scripting Backend有mono和il2cpp两个选项&#xff0c;它们是Un…

面试阿里,嫌弃面试官装逼当场怒怼,“把我的简历还给我”,疑似被拉黑

好家伙&#xff0c;这奇葩事可真是多&#xff0c;前两天和粉丝聊天&#xff0c;他说前段时间面试阿里的测试岗&#xff0c;最后和面试官干起来了。 我问他为什么&#xff0c;他说没啥&#xff0c;就觉得面试官太装B了&#xff0c;就爱问一些虚而不实的东西&#xff0c;显得自己…

Web自动化中常用的跳过验证码操作

目录 前言 通过cookies值登录 通OCR识别验证码 总结 前言 自动化测试中经常需要避免手动输入验证码的操作&#xff0c;因为这会增加测试成本&#xff0c;耗费测试人员的时间。通过自动化程序跳过验证码&#xff0c;可以减少测试时间&#xff0c;提高测试效率。 安静今天通过几个…

增值税高企业发展受限怎么办?采用此方法可化险为夷!

增值税高企业发展受限怎么办&#xff1f;采用此方法可化险为夷&#xff01; 《税筹顾问》专注于园区招商&#xff0c;您的贴身节税小能手&#xff0c;合理合规节税 企业的发展&#xff0c;一方面需要依靠自身的生产经营&#xff0c;那么另一方面就需要在一些支出上尽可能的开源…

如何用 Python 给树莓派 Pico RP2040 编程

使用 MicroPython&#xff0c;仅用 8 行代码&#xff0c;我们就可以实现 LED 闪烁程序。 下载安装 Python IDE&#xff1a;Thonny Thonny 是 一个面向初学者的 Python IDE 环境&#xff0c;自带 Python&#xff0c;相对简单&#xff0c;比较容易上手。对于树莓派 Pico 开发&am…

实验篇(7.2) 12. 站对站安全隧道 - 仅一方发起连接(FortiGate-IPsec) ❀ 远程访问

【简介】上一篇实验发现&#xff0c;两端都是可以远程的公网IP的话&#xff0c;两端防火墙都可以发出连接请求&#xff0c;并且都能够连通。这样的好处是安全隧道不用随时在线&#xff0c;只在有需求时才由发起方进行连接。但是现实中很多情况下只有一端公网IP可以远程&#xf…

实战:求年月日时间前后遇到的坑和解决方式

这里写目录标题 前言正确实例&#xff1a;错误实例&#xff1a; 需求 前言 这周接到一个时间转换任务需要处理&#xff0c;本来没什么问题&#xff0c;后来完成后发现时间有偏差&#xff0c;又重写了一遍代码&#xff0c;感觉很有记录必要性&#xff0c;希望看过的小伙伴可以避…

代理ip会不会影响网络速度和稳定性

代理ip是一种可以帮助用户隐藏真实IP地址的技术&#xff0c;通常使用代理服务器作为中介来连接互联网。代理ip在网络安全、隐私保护、跨区域访问等方面都有广泛的应用。但是&#xff0c;使用 代理ip是否会影响网络速度和稳定性这一问题也一直备受关注。下面是一些有关代理ip对网…

k8s部署redis集群

写在前面 一般来说&#xff0c;REDIS部署有三种模式。 单实例模式&#xff0c;一般用于测试环境。哨兵模式集群模式 后两者用于生产部署 哨兵模式 在redis3.0以前&#xff0c;要实现集群一般是借助哨兵sentinel工具来监控master节点的状态。 如果master节点异常&#xff0c…

计算机网络管理-网络管理软件SNMPc软件的下载,安装和使用教程说明

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…