当前位置: 首页 > news >正文

C语言之扫雷

C语言之扫雷

  • game.h
  • game.c
  • test.c

参考
https://blog.csdn.net/m0_62391199/article/details/124694375

game.h

#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2#define EASY_COUNT 10//初始化雷区
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);void DisplayBoard(char board[ROWS][COLS], int row, int col);  //只用9*9,但还是要用完整board//设置雷
void SetMine(char board[ROWS][COLS], int row, int col);//查找雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;  //表示要初始化的字符}}
}void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("------------------扫雷游戏-------------------\n");for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("------------------游戏结束-------------------\n");
}void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;//x = 1~9//y = 1~9while (count){int x = rand() % row + 1; //rand() % 9 = 0~8int y = rand() % col + 1;//判断该坐标是否已经布置过雷,避免重复不知if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}//获取坐标周围的雷的个数
static int get_mine_count(char board[ROWS][COLS], int x, int y)
{return (board[x - 1][y - 1] +board[x - 1][y] +board[x - 1][y + 1] +board[x][y - 1] +board[x][y + 1] +board[x + 1][y - 1] +board[x + 1][y] +board[x + 1][y + 1] - 8 * '0');
}//int get_mine_count(char board[ROWS][COLS], int x, int y)
//{
//	int i = 0;
//	int j = 0;
//	int count = 0;
//	for (i = x - 1; i <= x + 1; i++)
//	{
//		for(j = y - 1; j <= y + 1;j++)
//		{
//			if (board[x][y] == '1')
//			{
//				count++;
//			}
//		}
//	}
//	return count;
//}void ExplosionSpread(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y, int* pw);
void MarkMine(char board[ROWS][COLS], int row, int col);void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;//找到非雷的个数,用来标记是否取得胜利int* pw = &win;char ch = 0;  //用来接收是否需要标记雷while (win < row * col - EASY_COUNT){printf("请输入要排查的坐标");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)  //判断坐标的合法性{if (mine[x][y] == '1')  //这里就是设置雷数组和排查雷数组的交互{printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else{if (show[x][y] != '*'){printf("该坐标一排查过,不能重复排");continue; //忘记写,直接进入下一次循环}else//如果不是雷{ExplosionSpread(mine, show, row, col, x, y, pw);  //爆炸展开一片system("cls");DisplayBoard(show, row, col);printf("需要标记雷的位置请输入y/Y,否则请按任意键->");while ((ch = getchar() != '\n'));scanf("%c", &ch);if (ch == 'Y' || ch == 'y'){MarkMine(show, row, col);  //标记雷system("cls");DisplayBoard(show, row, col);}else{continue;  //当玩家选择不标记雷,执行continue,跳过当前循环的剩余部分,直接进入下一次循环,等待玩家输入新的坐标}}}}else{printf("输入坐标错误,请重新输入\n");}}if (win == row * col - EASY_COUNT){system("cls");printf("恭喜你,排雷成功\n");DisplayBoard(show, ROW, COL);  //不是显示DisplayBoard(mine,ROW,COL);return;}
}//基础功能
//1、标记功能
//2、展开一片
void ExplosionSpread(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y, int *pw) //爆炸展开一片
{if (x >= 1 && x <= row && y >= 1 && y <= col)  //判断坐标是否在排查的范围内{int num = get_mine_count(mine, x, y);  //获取坐标周围雷的个数(*pw)++;  //增加win的值,因为这是一个非雷区域if (num == 0)  //如果没有雷{show[x][y] = ' ';  //如果没有雷,就把该坐标设置成空格,并向周围八个坐标展开int i = 0;int j = 0;for (i = x - 1; i <= x + 1; i++){for (j = y - 1; j <= y + 1; j++){if (show[i][j] == '*')  //限制递归条件,防止已经排查过的坐标再次递归,从而造成死递归, 别写成show[i][j] = '*,此时会为死递归{ExplosionSpread(mine, show, row,col, i, j, pw);}}}}else  //如果当前坐标周围有雷,但当前坐标本身是非雷区域{show[x][y] = num + '0';  //显示周围有多少个雷}}
}
void MarkMine(char board[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;while (1){printf("请选择你需要标记的坐标\n");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)//判断合法性{if (board[x][y] == '*'){board[x][y] = '!';printf("是否需要继续标记?(0: 继续标记, 其他: 结束标记): ");int if_continue_mark = 1;while (scanf("%d", &if_continue_mark) != 1)  // 输入验证{printf("输入无效,请输入数字 (0: 继续标记, 其他: 结束标记): ");while (getchar() != '\n');  // 清空输入缓冲区}if (!if_continue_mark){continue;  // 继续标记,进入下一次循环}else{break;  // 无需继续标记,跳出循环}/*int if_continue_mark = 1;printf("0:继续标记 其他:无需标记");scanf("%d", &if_continue_mark);*/if (!if_continue_mark){continue;}else{break;}}else if (board[x][y] == '!'){board[x][y] = '*';printf("已取消标记,是否需要继续标记?(0: 继续标记, 其他: 结束标记): ");int if_continue_mark = 1;while (scanf("%d", &if_continue_mark) != 1)  // 输入验证{printf("输入无效,请输入数字 (0: 继续标记, 其他: 结束标记): ");while (getchar() != '\n');  // 清空输入缓冲区}if (!if_continue_mark){continue;  // 继续标记,进入下一次循环}else{break;  // 无需继续标记,跳出循环}}else{printf("该坐标不能被标记,请重新输入!\n");}}else{printf("坐标输入错误,请重新输入");}}
}

test.c

#define _CRT_SECURE_NO_WARNINGS#include "game.h"void menu()
{printf("*********************************\n");printf("************* 1. play ***********\n");printf("************* 0. exit ***********\n");printf("*********************************\n");
}void game()
{char mine[ROWS][COLS] = { 0 };  //存放布置好的雷的信息char show[ROWS][COLS] = { 0 };  //存放排查出的雷的信息//初始化数组的内容为指定的内容//mine 数组在没有布置雷的情况下 都是'0'InitBoard(mine, ROWS, COLS, '0');//show 数组在没有排查雷的时候,都是'*'InitBoard(show, ROWS, COLS, '*');//设置雷SetMine(mine, ROW, COL);//打印//DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);}int main()
{int input = 0;//设置随机数的生成起点srand((unsigned int)time(NULL));  //用于随机生成坐标的rand函数的种子srand函数只需要在main函数中声明一次do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1://玩游戏//printf("扫雷\n");game();break;case 0://退出printf("退出游戏\n");break;default:printf("选择错误,重新选择");break;}} while (input);return 0;
}

相关文章:

C语言之扫雷

C语言之扫雷 game.hgame.ctest.c 参考 https://blog.csdn.net/m0_62391199/article/details/124694375 game.h #pragma once #include <stdio.h> #include <time.h> #include <stdlib.h>#define ROW 9 #define COL 9#define ROWS ROW2 #define COLS COL2#de…...

半导体制造工艺讲解

目录 一、半导体制造工艺的概述 二、单晶硅片的制造 1.单晶硅的制造 2.晶棒的切割、研磨 3.晶棒的切片、倒角和打磨 4.晶圆的检测和清洗 三、晶圆制造 1.氧化与涂胶 2.光刻与显影 3.刻蚀与脱胶 4.掺杂与退火 5.薄膜沉积、金属化和晶圆减薄 6.MOSFET在晶圆表面的形…...

Ollama+DeepSeek R1+AnythingLLM训练自己的AI智能助手

1.下载Ollama安装 1.1.安装Ollama Ollama官网&#xff1a;Ollama 下载Ollama,点击“Download”按钮。 根据电脑操作系统&#xff0c;下载合适的版本即可。 下载完成后点击安装&#xff0c;完成后安装窗口会自动关闭&#xff0c;你的系统托盘图标会出现一个Ollama图标。 1.2.…...

基于java手机销售网站设计和实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

5-R循环

R 循环 ​ 有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了更为复杂执行路径的多种控制结构。 循环语句允许我们多…...

Qlabel 每五个一换行 并、号分割

学习点 Qlabel 每五个一换行 并、号分割 QString MainWindow::formatHobbies(const std::set<QString>& hobbies) {QString formattedHobbies;int count 0;for (const QString& hobby : hobbies) {if (count > 0 && count % 5 0)formattedHobbies…...

加速PyTorch模型训练:自动混合精度(AMP)

在深度学习领域&#xff0c;模型训练的速度和效率尤为重要。为了提升训练速度并减少显存占用&#xff08;较复杂的模型中&#xff09;&#xff0c;PyTorch自1.6版本起引入了自动混合精度&#xff08;Automatic Mixed Precision, AMP&#xff09;功能。 AMP简单介绍 是一种训练…...

【py】python安装教程(Windows系统,python3.13.2版本为例)

1.下载地址 官网&#xff1a;https://www.python.org/ 官网下载地址&#xff1a;https://www.python.org/downloads/ 2.64版本或者32位选择 【Stable Releases】&#xff1a;稳定发布版本&#xff0c;指的是已经测试过的版本&#xff0c;相对稳定。 【Pre-releases】&#…...

Django REST Framework:如何获取序列化后的ID

Django REST Framework&#xff1a;如何获取序列化后的ID &#x1f604; 嗨&#xff0c;小伙伴们&#xff01;今天我们来聊一聊Django REST Framework&#xff08;简称DRF&#xff09;中一个非常常见的操作&#xff1a;如何获取序列化后的ID。对于那些刚入门的朋友们&#xff…...

QT修仙笔记 事件大圆满 闹钟大成

学习笔记 牛客刷题 闹钟 时钟显示 通过 QTimer 每秒更新一次 QLCDNumber 显示的当前时间&#xff0c;格式为 hh:mm:ss&#xff0c;实现实时时钟显示。 闹钟设置 使用 QDateTimeEdit 让用户设置闹钟时间&#xff0c;可通过日历选择日期&#xff0c;设置范围为当前时间到未来 …...

Leetcode - 149双周赛

目录 一、3438. 找到字符串中合法的相邻数字二、3439. 重新安排会议得到最多空余时间 I三、3440. 重新安排会议得到最多空余时间 II四、3441. 变成好标题的最少代价 一、3438. 找到字符串中合法的相邻数字 题目链接 本题有两个条件&#xff1a; 相邻数字互不相同两个数字的的…...

解决 ComfyUI-Impact-Pack 中缺少 UltralyticsDetectorProvider 节点的问题

解决 ComfyUI-Impact-Pack 中缺少 UltralyticsDetectorProvider 节点的问题 1. 安装ComfyUI-Impact-Pack 首先确保ComfyUI-Impact-Pack 已经下载 地址: https://github.com/ltdrdata/ComfyUI-Impact-Pack 2. 安装ComfyUI-Impact-Subpack 由于新版本的Impact Pack 不再提供这…...

使用Kickstart配置文件封装操作系统实现Linux的自动化安装

使用Kickstart配置文件封装操作系统实现Linux的自动化安装 创建ks.cfg配置文件 可以使用已经安装完成的Linux操作系统中的/root目录下的anaconda.cfg配置文件 注意&#xff0c;配置文件会因为kickstart的版本兼容性的问题导致无法安装报错需要在实际使用过程中删除某些参数 …...

Android笔记【snippet】

一、 6、Card及ConstraintLayout线性布局 //定义单独的机器人单独一行的卡片 Composable fun RobotCard(robot: Robot,navController:NavController){Card(modifier Modifier.fillMaxWidth().wrapContentHeight().padding(5.dp),colors CardDefaults.elevatedCardColors(co…...

zsh: command not found: conda

场景描述 在 Linux 服务器上使用 zsh 时&#xff0c;如果出现 zsh: command not found: conda 错误&#xff0c;说明你的系统未正确配置 conda 命令&#xff0c;或者你尚未安装 Anaconda/Miniconda。 解决方案 确保已安装 Anaconda 或 Miniconda conda 是 Anaconda 或 Minico…...

【知识科普】CPU,GPN,NPU知识普及

CPU,GPU,NPU CPU、GPU、NPU 详解1. CPU&#xff08;中央处理器&#xff09;2. GPU&#xff08;图形处理器&#xff09;3. NPU&#xff08;神经网络处理器&#xff09; **三者的核心区别****协同工作示例****总结** CPU、GPU、NPU 详解 1. CPU&#xff08;中央处理器&#xff0…...

【C++八股】struct和Class的区别

1. 默认访问控制 struct&#xff1a;结构体中的成员默认是 public&#xff0c;即外部代码可以直接访问结构体的成员。class&#xff1a;类中的成员默认是 private&#xff0c;即外部代码不能直接访问类的成员&#xff0c;必须通过公有接口&#xff08;通常是成员函数&#xff…...

鹧鸪云光伏仓储、物料管理软件详细功能

采购中心 &#xff1a;作为核心枢纽&#xff0c;能集中管理多品牌设备&#xff0c;企业可灵活按需采购。采购与退货流程高效便捷&#xff0c;审核通过后物资快速补充、问题货物及时退回&#xff0c;保障资金与物资顺畅周转&#xff0c;避免积压浪费。付款与退款环节 &#xff1…...

bazel 小白理解

Bazel命令是用于构建和测试软件项目的一个强大工具&#xff0c;尤其适用于大规模和多语言的软件项目。对于小白来说&#xff0c;可以这样理解Bazel及其命令&#xff1a; Bazel的基本概念 构建系统&#xff1a;Bazel是一个构建系统&#xff0c;它的主要任务是自动化地编译和链…...

MVC(Model-View-Controller)framework using Python ,Tkinter and SQLite

1.项目结构 sql: CREATE TABLE IF NOT EXISTS School (SchoolId TEXT not null, SchoolName TEXT NOT NULL,SchoolTelNo TEXT NOT NULL) 整体思路 Model&#xff1a;负责与 SQLite 数据库进行交互&#xff0c;包括创建表、插入、删除、更新和查询数据等操作。View&#xff1…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...