C语言-----扫雷游戏

扫雷游戏的功能说明

• 使⽤控制台实现经典的扫雷游戏
• 游戏可以通过菜单实现继续玩或者退出游戏
• 扫雷的棋盘是9*9的格⼦
• 默认随机布置10个雷
• 可以排查雷:
◦ 如果位置不是雷,就显⽰周围有⼏个雷
◦ 如果位置是雷,就炸死游戏结束
◦ 把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束

test.c //⽂件中写游戏的测试逻辑
game.c //⽂件中写游戏中函数的实现等
game.h //⽂件中写游戏需要的数据类型和函数声明等

逻辑开始:

一、菜单

  1. 输入1进入游戏,输入0退出游戏,输入其他数字显示输入错误,并且重新输入
test.c
#include "game.h"int main()
{menu();{regain:printf("请输入你的选择:");int input1;scanf("%d", &input1);switch (input1){case 1:{printf("进入游戏\n");game();break;}case 0:{printf("退出游戏\n");break;}default:{printf("输入错误,请重新输入:");goto regain;}}}return 0;
}
game.c
#include "game.h"void menu()
{printf("****************\n");printf("**** 1.Play ****\n");printf("**** 0.Quit ****\n");printf("****************\n");}
game.h
#pragma once
#include <stdio.h>
#include "game.h"//菜单
void menu();

二、生成 9X9 的游戏界面

  1. 使用二维数组实现
  2. 运用两个棋盘,一个用于展示,一个用于设置雷,写出初始化棋盘的函数
  3. 将展示的棋盘char show全部初始化为 '*',将布置雷的棋盘char mine全部初始化为0
  4. 为方便后边测试,可以先把打印棋盘的函数写出

test.c文件增加了以下代码

test.c
#include "game.h"void game()
{//用于布置雷的二维数组char mine[ROWS][COLS] = { 0 };//用于游戏界面的的二维数组char show[ROWS][COLS] = { 0 };//用于游戏界面的的二维数组全部初始为 '*'set_keyboard(show, ROWS, COLS, '*');//用于布置雷的二维数组全部初始化为 '0'set_keyboard(mine, ROWS, COLS, '0');//打印函数printf_keyboard(show, ROW, COL);printf_keyboard(mine, ROW, COL);
}

game.c文件增加了以下代码

game.c
#include "game.h"//初始化棋盘
void set_keyboard(char board[ROWS][COLS], int rows, int cols, char set)
{for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){board[i][j] = set;}}
}//展示棋盘
void printf_keyboard(char board[ROWS][COLS], int row, int col)
{printf("-------扫雷--------\n");for (int r = 0; r <= row; r++){printf("%d ", r);}printf("\n");for (int i = 1; i <= row; i++){printf("%d ", i);for (int j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}

game.c文件增加了以下代码

#pragma once
#include <stdio.h>
#include "game.h"#define ROW 9
#define COL 9
#define ROWS ROW+3
#define COLS COL+2//菜单
void menu();//初始化棋盘
void set_keyboard(char board[ROWS][COLS], int rows, int cols, char set);//展示棋盘
void printf_keyboard(char board[ROWS][COLS], int row, int col);

三、随机布置雷

  1. 使用srand((unsigned int) time(NULL))rand()
  2. 将雷设置为1,雷只能布置在char mine[x][y] == '0'的地方

game.h文件增加了
#include <time.h>
#include "stdlib.h"
#define MINE 10
void set_mine(char board[ROWS][COLS], int row, int col, int mine);

game.h#pragma once
#include <stdio.h>
#include "game.h"
#include <time.h> 
#include "stdlib.h"#define ROW 9
#define COL 9
#define ROWS ROW+3
#define COLS COL+2
#define MINE 10//菜单
void menu();//初始化棋盘
void set_keyboard(char board[ROWS][COLS], int rows, int cols, char set);//展示棋盘
void printf_keyboard(char board[ROWS][COLS], int row, int col);//随机布置雷
void set_mine(char board[ROWS][COLS], int row, int col, int mine);

game.c文件增加以下代码
game.c//随机布置雷
void set_mine(char board[ROWS][COLS], int row, int col, int mine)
{srand((unsigned int) time(NULL));while (mine){int x = (rand() % row) + 1;int y = (rand() % col) + 1;if (board[x][y] == '0');{board[x][y] = '1';mine--;}}}

test.c文件增加以下代码

test.c//随机布置雷
set_mine(mine, ROW, COL, MINE);

四、排雷

  1. 注意输入的坐标,横纵坐标都只能是0~9,出现其他数字报错,并重新输入
  2. 所排的坐标要显示周围雷的个数,如果为0,展开周围的棋盘(运用到递归)
  3. 如果所排的坐标是雷,显示游戏结束
  4. 如果输入的坐标是已经输入过的坐标,显示该坐标已经排除
  5. 判断游戏胜利,排除的坐标个数与减掉雷后的格子数相等

test.c文件布局改为以下情况

test.c
void game()
{//用于布置雷的二维数组char mine[ROWS][COLS] = { 0 };//用于游戏界面的的二维数组char show[ROWS][COLS] = { 0 };//用于游戏界面的的二维数组全部初始为 '*'set_keyboard(show, ROWS, COLS, '*');//用于布置雷的二维数组全部初始化为 '0'set_keyboard(mine, ROWS, COLS, '0');//随机布置雷set_mine(mine, ROW, COL, MINE);//打印函数printf_keyboard(show, ROW, COL);//printf_keyboard(mine, ROW, COL);//排雷move_mine(show, mine, ROW, COL);
}

game.c文件增加了以下代码

game.c
//计算周围雷的个数
int Count_mine(char mine[ROWS][COLS], int x, int y)
{return mine[x][y] - '0';
}//展开棋盘----递归
void Open_keyboard(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y)
{//写递归首先写结束条件//越界时,返回if ((x > (ROWS - 2)) || (x < 1) || (y > (COLS - 2)) || (y < 1)){return;}//遇到以及排过雷的坐标返回if (show[x][y] != '*'){return;}//计算雷的个数int count = 0;for (int i = -1; i <= 1; i++){for (int j = -1; j <= 1; j++){count += Count_mine(mine, x + i, y + j);}}show[x][y] = count + '0';//按照游戏规则,如果坐标显示雷的数目不为零,则返回if (show[x][y] != '0'){return;}//展开雷for (int i = -1; i <= 1; i++){for (int j = -1; j <= 1; j++){Open_keyboard(show, mine, x + i, y + j);}}}//排雷
void move_mine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col)
{int x, y;while (1){printf("请输入要排查的坐标:");regain2:scanf("%d %d", &x, &y);if ((x >= 1 && x <= 9) && (y >= 1 && y <= 9)){if (show[x][y] == '*'){if (mine[x][y] == '0'){Open_keyboard(show,mine,x,y);printf_keyboard(show, ROW, COL);}else{printf("很遗憾,踩到雷了,游戏结束\n以下是雷的位置:");printf_keyboard(mine, ROW, COL);break;}}else{printf("该坐标已经排查过了,请输入别的坐标:");goto regain2;}}else{printf("输入错误,重新输入:");goto regain2;}//判断赢int Remove_mine_count = 0;for (int i = 1; i <= row; i++){for (int j = 1; j <= col; j++){if (show[i][j] != '*'){Remove_mine_count++;}}}if (Remove_mine_count == ((ROW * COL) - MINE)){printf("恭喜你,排除所有的雷,游戏胜利\n");printf_keyboard(mine, ROW, COL);break;}}
}

game.h文件的代码不变

game.h
#pragma once
#include <stdio.h>
#include "game.h"
#include <time.h> 
#include "stdlib.h"#define ROW 9
#define COL 9
#define ROWS ROW+3
#define COLS COL+2
#define MINE 10//菜单
void menu();//初始化棋盘
void set_keyboard(char board[ROWS][COLS], int rows, int cols, char set);//展示棋盘
void printf_keyboard(char board[ROWS][COLS], int row, int col);//随机布置雷
void set_mine(char board[ROWS][COLS], int row, int col, int mine);//排雷
void move_mine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col);

五、扫雷游戏完整代码

test.c

#include "game.h"void game()
{//用于布置雷的二维数组char mine[ROWS][COLS] = { 0 };//用于游戏界面的的二维数组char show[ROWS][COLS] = { 0 };//用于游戏界面的的二维数组全部初始为 '*'set_keyboard(show, ROWS, COLS, '*');//用于布置雷的二维数组全部初始化为 '0'set_keyboard(mine, ROWS, COLS, '0');//随机布置雷set_mine(mine, ROW, COL, MINE);//打印函数printf_keyboard(show, ROW, COL);//printf_keyboard(mine, ROW, COL);//排雷move_mine(show, mine, ROW, COL);
}int main()
{menu();{regain1:printf("请输入你的选择:");int input1;scanf("%d", &input1);switch (input1){case 1:{printf("进入游戏\n");game();break;}case 0:{printf("退出游戏\n");break;}default:{printf("输入错误,请重新输入:");goto regain1;}}}return 0;
}

game.c

#include "game.h"//界面
void menu()
{printf("****************\n");printf("**** 1.Play ****\n");printf("**** 0.Quit ****\n");printf("****************\n");}//初始化棋盘
void set_keyboard(char board[ROWS][COLS], int rows, int cols, char set)
{for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){board[i][j] = set;}}
}//展示棋盘
void printf_keyboard(char board[ROWS][COLS], int row, int col)
{printf("-------扫雷--------\n");for (int r = 0; r <= row; r++){printf("%d ", r);}printf("\n");for (int i = 1; i <= row; i++){printf("%d ", i);for (int j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}//随机布置雷
void set_mine(char board[ROWS][COLS], int row, int col, int mine)
{srand((unsigned int) time(NULL));while (mine){int x = (rand() % row) + 1;int y = (rand() % col) + 1;if (board[x][y] == '0');{board[x][y] = '1';mine--;}}
}//计算周围雷的个数
int Count_mine(char mine[ROWS][COLS], int x, int y)
{return mine[x][y] - '0';
}//展开棋盘----递归
void Open_keyboard(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y)
{//写递归首先写结束条件//越界时,返回if ((x > (ROWS - 2)) || (x < 1) || (y > (COLS - 2)) || (y < 1)){return;}//遇到以及排过雷的坐标返回if (show[x][y] != '*'){return;}//计算雷的个数int count = 0;for (int i = -1; i <= 1; i++){for (int j = -1; j <= 1; j++){count += Count_mine(mine, x + i, y + j);}}show[x][y] = count + '0';//按照游戏规则,如果坐标显示雷的数目不为零,则返回if (show[x][y] != '0'){return;}//展开雷for (int i = -1; i <= 1; i++){for (int j = -1; j <= 1; j++){Open_keyboard(show, mine, x + i, y + j);}}}//排雷
void move_mine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col)
{int x, y;while (1){printf("请输入要排查的坐标:");regain2:scanf("%d %d", &x, &y);if ((x >= 1 && x <= 9) && (y >= 1 && y <= 9)){if (show[x][y] == '*'){if (mine[x][y] == '0'){Open_keyboard(show,mine,x,y);printf_keyboard(show, ROW, COL);}else{printf("很遗憾,踩到雷了,游戏结束\n以下是雷的位置:");printf_keyboard(mine, ROW, COL);break;}}else{printf("该坐标已经排查过了,请输入别的坐标:");goto regain2;}}else{printf("输入错误,重新输入:");goto regain2;}//判断赢int Remove_mine_count = 0;for (int i = 1; i <= row; i++){for (int j = 1; j <= col; j++){if (show[i][j] != '*'){Remove_mine_count++;}}}if (Remove_mine_count == ((ROW * COL) - MINE)){printf("恭喜你,排除所有的雷,游戏胜利\n");printf_keyboard(mine, ROW, COL);break;}}
}

game.h

#pragma once
#include <stdio.h>
#include "game.h"
#include <time.h> 
#include "stdlib.h"#define ROW 9
#define COL 9
#define ROWS ROW+3
#define COLS COL+2
#define MINE 10//菜单
void menu();//初始化棋盘
void set_keyboard(char board[ROWS][COLS], int rows, int cols, char set);//展示棋盘
void printf_keyboard(char board[ROWS][COLS], int row, int col);//随机布置雷
void set_mine(char board[ROWS][COLS], int row, int col, int mine);//排雷
void move_mine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col);

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

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

相关文章

Python人脸识别库DeepFace使用教程及源码解析

目录 一、DeepFace介绍 1、人脸库设计 2、DeepFace.find 3、DeepFace.verify 4、DeepFace.analyze 5、DeepFace.extract_faces 6、DeepFace.represent 7、DeepFace.stream 二、DeepFace二次开发 1、开发活体检测API 2、模型权重持久化 三、总结 一、DeepFace介绍 …

Java多线程的面试面试题及答案解析

什么是进程&#xff1f;什么是线程&#xff1f;有什么区别&#xff1f; 进程是系统资源分配的基本单位&#xff0c;拥有独立的地址空间。线程是 CPU 调度和分派的基本单位&#xff0c;是比进程更小的独立执行的单位&#xff0c;共享所在进程的内存空间等资源。一个进程可以包含…

三分钟简单了解一些HTML的标签和语法_02

1.a标签演示 点击然后跳转 代码加入title 2.图片链接 3.锚点链接 点击就会跳转的当前位置 4.a标签小知识补充 该实例会跳转到顶,锚点链接则会跳转到相应的锚点 5. 结果:直接跳转到该页面的锚点处 6. 在 HTML 中&#xff0c;<tr>标签表示表格中的行&#xff08;TableRow&…

多选multiple下拉框el-select回显问题(只显示后端返回id)

首先保证v-model的值对应options数据源里面的id <el-form-item prop"subclass" label"分类" ><el-select v-model"formData.subclass" multiple placeholder"请选择" clearable :disabled"!!formData.id"><e…

2025年数学建模美赛:A题分析(1)Testing Time: The Constant Wear On Stairs

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

Qt——引用第三方SDK lib库的使用方法

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…

Java 反射与动态代理:实践中的应用与陷阱

Java 反射与动态代理&#xff1a;实践中的应用与陷阱 在现代Java应用中&#xff0c;反射和动态代理提供了强大的灵活性&#xff0c;但它们也带来了性能和复杂度上的挑战。本文将深入探讨这些技术在实际项目中的应用&#xff0c;分析它们可能导致的陷阱&#xff0c;并提供详细的…

Linux(Centos 7.6)命令详解:wc

1.命令作用 打印文件的行数、单词数、字节数&#xff0c;如果指定了多个文件&#xff0c;还会打印以上三种数据的总和(Print newline, word, and byte counts for each FILE, and a total line if more than one FILE is specified) 2.命令语法 Usage: wc [OPTION]... [FIL…

skynet 源码阅读 -- 核心概念服务 skynet_context

本文从 Skynet 源码层面深入解读 服务&#xff08;Service&#xff09; 的创建流程。从最基础的概念出发&#xff0c;逐步深入 skynet_context_new 函数、相关数据结构&#xff08;skynet_context, skynet_module, message_queue 等&#xff09;&#xff0c;并通过流程图、结构…

超分辨率体积重建实现术前前列腺MRI和大病理切片组织病理学图像的3D配准

摘要: 磁共振成像(MRI)在前列腺癌诊断和治疗中的应用正在迅速增加。然而,在MRI上识别癌症的存在和范围仍然具有挑战性,导致即使是专家放射科医生在检测结果上也存在高度变异性。提高MRI上的癌症检测能力对于减少这种变异性并最大化MRI的临床效用至关重要。迄今为止,这种改…

TypeScript 基础使用和相关问题

tsconfig.json 配置文件 {"compilerOptions": {"target": "esnext","jsx": "preserve","jsxImportSource": "vue","lib": ["esnext", "dom"],"useDefineForClassF…

leetcode-分割等和子集

本题涉及到的是01背包问题&#xff0c;我将从两种解决背包问题的思路写出题解 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#…

企业级流程架构设计思路-基于价值链的流程架构

获取更多企业流程资料 纸上得来终觉浅&#xff0c;绝知此事要躬行 一.企业流程分级规则定义 1.流程分类分级的总体原则 2.完整的流程体系需要体现出流程的分类分级 03.通用的流程分级方法 04.流程分级的标准 二.企业流程架构设计原则 1.流程架构设计原则 流程框架是流程体…

利用 SoybeanAdmin 实现前后端分离的企业级管理系统

引言 随着前后端分离架构的普及&#xff0c;越来越多的企业级应用开始采用这种方式来开发。前后端分离不仅提升了开发效率&#xff0c;还让前端和后端开发可以并行进行&#xff0c;减少了相互之间的耦合度。SoybeanAdmin 是一款基于 Spring Boot 和 MyBatis-Plus 的后台管理系…

智能风控 数据分析 groupby、apply、reset_index组合拳

目录 groupby——分组 本例 apply——对每个分组应用一个函数 等价用法 reset_index——重置索引 使用前​编辑 注意事项 groupby必须配合聚合函数、 关于agglist 一些groupby试验 1. groupby对象之后。sum&#xff08;一个列名&#xff09; 2. groupby对象…

尚硅谷大数据数仓项目superset db upgrade报错解决(2025.1.23解决)

尚硅谷大数据数仓项目superset db upgrade报错解决&#xff08;2025.1.23解决&#xff09;和 superset安装MySQL报错解决 解决方法&#xff08;2025.1.23解决&#xff09; 0.卸载之前安装好的Superset -- 退出当前环境 conda deactivate-- 卸载Superset conda remove -n sup…

linux-mysql在centos7安装和基础配置

1.安装mysql数据库 1.使用官网安装 1.检查是否存在mysql的分支mariadb [rootlocalhost ~]# rpm -qa |grep mariadb mariadb-libs-5.5.64-1.el7.x86_64 [rootlocalhost ~]# 2.卸载这个分支包 [rootlocalhost ~]# rpm -qa | grep mariadb mariadb-libs-5.5.64-1.el7.x86_64 …

YOLOv5训练自己的数据及rknn部署

YOLOv5训练自己的数据及rknn部署 一、下载源码二、准备自己的数据集2.1 标注图像2.2 数据集结构 三、配置YOLOv5训练3.1 修改配置文件3.2 模型选择 四、训练五、测试六、部署6.1 pt转onnx6.2 onnx转rknn 七、常见错误7.1 训练过程中的错误7.1.1 cuda: out of memory7.1.2 train…

移动端VR处理器和传统显卡的不同

骁龙 XR 系列芯片 更多地依赖 AI 技术 来优化渲染过程&#xff0c;而传统的 GPU 渲染 则倾向于在低画质下运行以减少负载。这种设计是为了在有限的硬件资源下&#xff08;如移动端 XR 设备&#xff09;实现高性能和低功耗的平衡。以下是具体的分析&#xff1a; 1. AI 驱动的渲染…

IoTDB结合Mybatis使用示例(增删查改自定义sql等)

IoTDB时序库是当前越来越流行以及基于其优势各大厂商越来越易接受的国产开源时序数据库&#xff0c;针对IoTDB的内容不做过多介绍&#xff0c;在使用该时序库时&#xff0c;往往有一定入门门槛&#xff0c;不同于关系型数据库或文档型数据库那般方便维护和接入开发&#xff0c;…