惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
Kaspersky official blog
L
Lohrmann on Cybersecurity
T
Tenable Blog
Latest news
Latest news
C
CXSECURITY Database RSS Feed - CXSecurity.com
Security Latest
Security Latest
V
Vulnerabilities – Threatpost
The Hacker News
The Hacker News
P
Palo Alto Networks Blog
I
Intezer
T
Threatpost
C
Cisco Blogs
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
WordPress大学
WordPress大学
月光博客
月光博客
博客园 - 聂微东
Last Week in AI
Last Week in AI
V
V2EX
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Simon Willison's Weblog
Simon Willison's Weblog
T
The Exploit Database - CXSecurity.com
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
Spread Privacy
Spread Privacy
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
T
Threat Research - Cisco Blogs
博客园 - Franky
S
Schneier on Security
Know Your Adversary
Know Your Adversary
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
T
Tor Project blog
C
Cybersecurity and Infrastructure Security Agency CISA
腾讯CDC
Project Zero
Project Zero
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
量子位
The GitHub Blog
The GitHub Blog
I
InfoQ
P
Proofpoint News Feed
Cyberwarzone
Cyberwarzone
P
Privacy & Cybersecurity Law Blog
B
Blog RSS Feed

茗辰原

开源某克自动签到领取免费空间项目 Astro Gyoza 内容标签使用指南 内容标签使用指南 | 茗辰原 利用AI从Hexo迁移到Astro | 茗辰原 Cloud Photography | Galleries | 茗辰原 博客周浏览量又突破了! | MingCY 博客周浏览量又突破了! | 茗辰原 博客周浏览量又突破了! Twikoo配置图床S3/R2 抖音推流助手工具 收到"好站网"的抱枕了! 开了VPN但真实IP被WebRTC泄露 5.10母亲节 | MingCY 5.10母亲节 5.10母亲节 18成人礼 TheOne陪伴接入WX Bing免费送B站月卡 让AI替你SSH进服务器,5分钟搞定故障排查! 基于Cloudflare R2搭建免费云盘 关于我的近视手术 你真的会刷牙吗? Urban Photography — Layered City | Galleries | MingCY 内网穿透监控软件TailScale AI控制手机 Infinicloud Infinicloud | 茗辰原 实用网页推荐第一期 你的IP真的安全吗 抖音热门温柔提醒 我苦逼高三生活 LibreTV利用CF搭建 BLOB图床使用Vercel搭建 | MingCY 关于我最近在忙什么?! | MingCY 琥珀扫描 三行代码,成功破解(秒杀)希沃管家冰点还原 | MingCY 当今生活用品到底如何选? | MingCY 周受资:从新加坡少年到全球科技领袖的传奇之路 | MingCY 最美的妈妈 | MingCY 只要插入一根铁丝就能免费看电视 | MingCY 快速睡眠,解决困倦 | MingCY Escrcpy--手机投屏到电脑工具! | MingCY 寒假起航!老家畅游! | MingCY 新年快乐 | MingCY 新年快乐 | 茗辰原 研究性学习论文总结 | MingCY 强迫性思维😣 | MingCY 奋进青年奖状! | MingCY AI挑唆人类自杀? | MingCY 腹肌养成记 | MingCY Office-2025激活 | MingCY 震惊!AI塔罗牌 | MingCY TVBOX 配置两端通用 | MingCY 使用works制作随机图! | MingCY 获取QQ空间工具 | MingCY 获取QQ空间工具 | 茗辰原 五个人性心理实验 | MingCY 解锁全网安卓音乐 | MingCY 123云盘-下载工具 | MingCY Classlsand-班级课程表 | MingCY ODE多功能工具箱 | MingCY Hexo-添加音乐与视频 | MingCY Cloudflare上有趣的项目 | MingCY 所有应用广告通杀!! | MingCY 吾爱破解!鼠标录制酷! | MingCY 资源管理器一键修改了! | MingCY 安卓必备啊!语音起飞! | MingCY glary系统优化 | MingCY pdf修复工具 | MingCY 短视频视频批量下载! | MingCY 一个图片查地址----最强Aigeospy | MingCY win-文件查重 | MingCY 神奇应用!什么都能搜! | MingCY 取bilibili直连 | MingCY 绝版安卓工具箱?能有多强? | MingCY 神秘网站合集打开即用? | MingCY Vercel部署Typecho 博客 | MingCY 一挑四!全网SVIP无损音乐,随便下! | MingCY 什么竟然还有这样的神器? | MingCY 如何在 Gyoza 中使用图标? 计算机的基础知识 | MingCY 开往的礼物(纪念款) | MingCY 爱奇艺免费了? | MingCY 免费域名整理 | MingCY 在文章中嵌入视频和代码 Gyoza 使用指南 Markdown 示例 PDF24工具箱 | MingCY 【计算机基础】关于进制 | MingCY 李跳跳复活版! | MingCY QQ主题全部免费使用? | MingCY 幻休 | MingCY GKD跳过广告 | MingCY ChatGPT-KEY的获取[无需手机号绑定] | MingCY ChatGPT-KEY的获取[无需手机号绑定] | 茗辰原
C语言扫雷 | MingCY
茗辰原 · 2024-04-10 · via 茗辰原

前言

选自:PandaX Blog:https://pandax.wiki/15/

代码设计要求

  • Main 函数中不能出现具体实现的操作,必须通过调用函数实现各种操作。
  • 程序中必须通过结构体来储存必要信息。
  • 要有一定的代码规范。

程序实现要求

  • 打开程序后,首先进入主界面,主界面至少需要有 “开始游戏” 与 “退出游戏 “功能,其中,选择开始游戏后则开始扫雷游戏,选择退出游戏后则程序结束。
  • 开始扫雷后,每次输入两个数字,视为点击 XY 坐标上的格子,其中,当数字超过接线范围后,应输出 “坐标不对” 等报错信息。
  • 首次输入 XY 坐标时,必须保证不会踩到雷。
  • 当输入的 XY 坐标是雷的坐标时,应显示游戏失败,并且结束游戏 (但是程序不结束)。
  • 当输入的 XY 坐标不是雷的坐标的时候,显示此时周围 8 格存在的雷的数量。
  • 当输入的 XY 坐标不是雷且此时该坐标周围雷的数量为 0 时,显示上下左右的格子,若上下左右格子周围的雷数也为 0,则继续显示其上下左右格子,直到当前格子周围雷数不为 0 则停止。
  • 当输入的 XY 坐标不是雷且该格子已经被显示,应输出 “坐标已显示 “等报错信息。
  • 当所有非雷的格子都被点完后,应显示游戏胜利,并且结束游戏。
  • 游戏结束后程序不能直接结束,要有 “再次尝试” 和 “退出游戏” 的功能。
  • 所有的输入选项位置要有报错的能力。

部分效果图

https://pandax.wiki/wp-content/uploads/2023/01/1-1024x757.jpg

https://pandax.wiki/wp-content/uploads/2023/01/2-1024x524.jpg

https://pandax.wiki/wp-content/uploads/2023/01/3-1024x492.jpg

代码如下

#define _CRT_SECURE_NO_WARNINGS  1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define M 9//行数
#define N 9//列数
#define B 10//炸弹数
 
#define MS M + 2
#define NS N + 2
struct list {
    int boom, click;//boom 随机生成的雷 0不是雷1是雷
    char display;
};
struct list pri[MS][NS];
int o = 0;//用于判断是否结束
int win = 0;
//打印菜单
void menu(void) {
    printf("1.开始游戏\n");
    printf("2.退出游戏\n");
    printf("请选择\n");
}
void menu2(void) {
    printf("1.再次尝试\n");
    printf("2.退出游戏\n");
    printf("请选择\n");
}
//随机生成雷
void random() {
    int m, n;
    srand(time(NULL));
    for (int i = 0; i < B; i++) {
        int m = rand() % M + 1;
        int n = rand() % N + 1;
 
        //printf("%d %d\n", m, n);  //打印随机出现的雷,方便调试使用
 
        if (pri[m][n].boom == 1)
            i -= 1;
        else if (pri[m][n].boom == 0) {
            pri[m][n].boom = 1;
        }
    }
}
//棋盘初始化
void renew() {
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            pri[i + 1][j + 1].display = '*';
        }
    }
    for (int i = 0; i < M + 2; i++) {
        for (int j = 0; j < N + 2; j++) {
            pri[i][j].boom = 0;
            pri[i][j].click = 0;
        }
    }
    for (int i = 0; i <= M + 2; i++) {
        pri[0][i].click = 1;
        pri[M + 1][i].click = 1;
        pri[i][0].click = 1;
        pri[i][N + 1].click = 1;
    }
}
//打印棋盘
void print() {
    //打印第一行的数字
    printf("   ");
    for (int i = 0; i < M; i++) {
        printf("%d  ", i + 1);
    }
    printf("\n");
    //打印下面的
    for (int i = 0; i < N; i++) {
        printf("%d", i + 1);
        for (int j = 0; j < M; j++) {
            printf("  %c", pri[i + 1][j + 1].display);
        }
        printf("\n");
    }
}
//判断周围雷数
void scan(int m, int n) {
    int num = pri[m - 1][n - 1].boom + pri[m - 1][n].boom + pri[m - 1][n + 1].boom + pri[m][n - 1].boom + pri[m][n + 1].boom + pri[m + 1][n - 1].boom + pri[m + 1][n].boom + pri[m + 1][n + 1].boom;
    if (num != 0) {
        pri[m][n].display = num + '0';
    }
    else if (num == 0) {
        pri[m][n].display = '   ';
        if (m > 0 && m <= M + 1 && n > 0 && n <= N + 1) {
            if (pri[m - 1][n - 1].click == 0) {
                pri[m - 1][n - 1].click = 1;
                scan(m - 1, n - 1);
            }
            if (pri[m - 1][n].click == 0) {
                pri[m - 1][n].click = 1;
                scan(m - 1, n);
            }
            if (pri[m - 1][n + 1].click == 0) {
                pri[m - 1][n + 1].click = 1;
                scan(m - 1, n + 1);
            }
            if (pri[m][n - 1].click == 0) {
                pri[m][n - 1].click = 1;
                scan(m, n - 1);
            }
            if (pri[m][n + 1].click == 0) {
                pri[m][n + 1].click = 1;
                scan(m, n + 1);
            }
            if (pri[m + 1][n - 1].click == 0) {
                pri[m + 1][n - 1].click = 1;
                scan(m + 1, n - 1);
            }
            if (pri[m + 1][n].click == 0) {
                pri[m + 1][n].click = 1;
                scan(m + 1, n);
            }
            if (pri[m + 1][n + 1].click == 0) {
                pri[m + 1][n + 1].click = 1;
                scan(m + 1, n + 1);
            }
        }
    }
}
//判断胜负
void win_or_not() {
    win = 0;
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            if (pri[i + 1][j + 1].click == 1)
                win += 1;
        }
    }
    if (win == (M * N - B)) {
        printf("恭喜您扫雷成功\n");
        o = 1;
    }
}
//用户输入
void input(int* c) {
    int x, y;
    int p = scanf("%d %d", &x, &y);
 
    while (p == 0 || p == 1)
    {
        rewind(stdin);
        printf("输入错误,请重新输入\n");
        p = scanf("%d %d", &x, &y);
    }
    rewind(stdin);
    //判断第一次踩雷
    if (*c == 1) {
        *c += 1;
        if (x <= M && y <= N) {
            if (pri[x][y].boom == 0) {
                pri[x][y].click = 1;
                scan(x, y);
            }
 
 
            else if (pri[x][y].boom == 1) {
                renew();
                random();
                scan(x, y);
            }
        }
        else {
            printf("输入有误,请重新输入\n");
        }
    }
    //剩下的次数
    else
    {
        if (x <= M && y <= N)
        {
            if (pri[x][y].click == 1) {
                printf("此位置已经被排除\n");
            }
            else if (pri[x][y].boom == 0) {
                pri[x][y].click = 1;
                scan(x, y);
            }
            else if (pri[x][y].boom == 1) {
                printf("你踩到雷了\n");
                o = 1;
            }
        }
        else {
            printf("输入有误,请重新输入\n");
        }
    }
}
void game() {
    int c = 1;//判断是否是第一次
    renew();
    print();
    random();
    do {
        input(&c);
        print();
        win_or_not();
    } while (o == 0);
}
int main() {
    int option = 0;
    int i;
    for (i = 1;; i++) {
        o = 0;
        if (i == 1)
            menu();
        else
            menu2();
        while (scanf("%d", &option) == 0)
        {
            rewind(stdin);
            printf("输入错误,请重新输入\n\n");
            if (i == 1)
                menu();
            else
                menu2();
        }
        rewind(stdin);
        if (option == 1)
            game();
        else if (option == 2) {
            printf("退出游戏\n");
            break;
        }
        else {
            printf("输入有误,请重新输入\n\n");
            i -= 1;
        }
    }
    return 0;
}