C语言扫雷游戏完整版、标记、取消标记、自动拓展

文章目录

  • 前言
  • 一、扫雷完整代码
  • 总结


前言

用C语言实现扫雷游戏,标记功能,取消标记功能,自动拓展功能,标记只是雷,并且数量等于雷的数量,自动获胜。


一、扫雷完整代码

// test.c 源文件
#define  _CRT_SECURE_NO_WARNINGS#include "game.h"void menu()
{printf("********************\n");printf("*****  1. Play *****\n");printf("*****  0. Quit *****\n");printf("********************\n");}void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };int choose = 0;int win = 0; // 记录标记的雷的个数int sign = 0; // 记录标记的个数// 初始化棋盘 一个是布置雷的信息 一个是排查雷的信息InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');// 设置雷SetMine(mine, ROW, COL);// 打印初始化棋盘//DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);while (win < ROW * COL - EASY_COUNT){printf("********************\n");printf("***** 1. 标记  *****\n");printf("***** 2. 排雷  *****\n");printf("********************\n");printf("请选择:>");scanf("%d", &choose);switch (choose){case 1:// 标记win = SignShow(show,mine,ROW,COL);break;case 2:// 排雷win = FindMine(mine, show, ROW, COL, win);break;default :printf("选择错误,请重新选择\n");break;}if (win == -1){break;}}if (win == ROW * COL - EASY_COUNT){printf("恭喜你,排雷成功!\n");DisplayBoard(mine, ROW, COL);}// 排雷//FindMine(mine, show, ROW, COL);
}
int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("游戏开始\n");game();break;case 0:printf("退出游戏\n");break;default :printf("选择错误\n");break;}} while (input);return 0;
}

 // game.h 头文件
#pragma once#include <stdio.h>
#include <stdlib.h>
#include <time.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 ret);// 打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);// 设置雷
void SetMine(char board[ROWS][COLS], int row, int col);// 排雷
int FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int win);// 标记函数
int SignShow(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col);// 拓展函数
void Extend(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);

// game.c 源文件
#define  _CRT_SECURE_NO_WARNINGS
#include "game.h"// 初始化函数声明
void InitBoard(char board[ROWS][COLS], int rows, int cols, char ret)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = ret;}}
}// 打印函数定义
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("----------扫雷游戏-----------\n");int i = 0;for (i = 0; i <= row; i++){printf("%2d ", i);}printf("\n");for (i = 1; i <= row; i++){int j = 0;printf("%2d ", i);for (j = 1; j <= col; j++){// 打印数据printf("%2c ", board[i][j]);}printf("\n");}printf("----------扫雷游戏-----------\n");}// 设置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}// 标记雷
int SignShow(char board[ROWS][COLS],char mine[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int flag = 0; // 判断标记还是取消标记static int count = 0; // 标记的个数static int sign = 0;while(1){printf("*********************\n");printf("***** 1.标记 ********\n");printf("***** 0.取消标记 ****\n");printf("*********************\n");printf("请选择操作:>");scanf("%d", &flag);if (1 == flag){printf("请输入标记坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x][y] == '*'){sign++;board[x][y] = '$';if ('1' == mine[x][y]){count++;}DisplayBoard(board, ROW, COL);break;}else{printf("已经排查过了,无法标记!\n");DisplayBoard(board, ROW, COL);break;}}else{printf("超出棋盘范围,请重新输入\n");DisplayBoard(board, ROW, COL);break;}}else if(0 == flag){printf("请输入标记坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x][y] == '$'){sign--;board[x][y] = '*';if ('1' == mine[x][y]){count--;}DisplayBoard(board, ROW, COL);break;}else{printf("此处未被标记,请选择其他位置\n");DisplayBoard(board, ROW, COL);break;}}else{printf("超出棋盘范围,请重试\n");DisplayBoard(board, ROW, COL);break;}}else{printf("输入错误,请重新输入\n");DisplayBoard(board, ROW, COL);}}if (sign == count && count == EASY_COUNT){sign = 0;count = 0;return (ROW * COL - EASY_COUNT);}}// 计算雷的个数
int Sum_mine(char board[ROWS][COLS], int x, int y)
{int i = 0;int sum = 0;for (i = -1; i <= 1; i++){int j = 0;for (j = -1; j <= 1; j++){//printf("%c", board[x + i][y + i]);sum = sum + (board[x + i][y + j] - '0');//printf("%d", sum);}}return sum;//return (mine[x - 1][y - 1] +//	mine[x - 1][y] +//	mine[x - 1][y + 1] +//	mine[x][y - 1] +//	mine[x][y + 1] +//	mine[x + 1][y - 1] +//	mine[x + 1][y] +//	mine[x + 1][y + 1] - 8 * '0');
}// 排雷
int FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int win)
{int x = 0;int y = 0;int wins = win;printf("请输入坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] == '*'){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");DisplayBoard(mine, ROW, COL);wins = -1;return wins;}else{wins++;int count = Sum_mine(mine, x, y);printf("%d", count);if (count == 0){//printf("开始执行拓展函数\n");Extend(mine, show,x,y);DisplayBoard(show, ROW, COL);}else{show[x][y] = count + '0';DisplayBoard(show, ROW, COL);}return wins;}}else{printf("已经排查过了,请勿重复排查\n");}}else{printf("超出棋盘范围,请重新输入\n");}
}// 拓展函数
void  Extend(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{//DisplayBoard(mine, ROW, COL);//printf("%d", mine[x][y]);int count = Sum_mine(mine, x, y);if (0 == count){show[x][y] = ' ';int i = 0;for (i = -1; i <= 1; i++){int j = 0;for (j = -1; j <= 1; j++){if (i == j && 0 == j){continue;}else if (show[x + i][y + j] == ' '){continue;}else{Extend(mine, show, x + i, y + j);}}}}else{show[x][y] = count + '0';}}

总结

用C语言实现扫雷游戏,标记功能,取消标记功能,自动拓展功能,标记只是雷,并且数量等于雷的数量,自动获胜。自动拓展到有雷的地方显示周围雷的个数。

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

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

相关文章

Linux Supervisor进程控制系统完全教程

一、简介 Supervisor是一个进程控制系统&#xff0c;它使用户能够监视和控制类unix操作系统进程。它通过提供基于配置或事件启动、停止和重新启动进程的机制&#xff0c;帮助管理应该在系统中连续运行的进程。对于需要控制和监视Linux或其他类unix操作系统上多个进程的状态的开…

如何设置unbuntu时间及同步时间

文章目录 时区时间同步与服务 时间同步的重要性Ubuntu系统中设置时间和同步时间方法一&#xff1a;通过图形界面设置查看当前时间设置时间和时区设置时区&#xff08;假设设置为UTC&#xff09;&#xff1a;设置本地时间&#xff08;例如&#xff0c;设置时间为2024年4月21日 1…

String、StringBuilder、StringBuffer区别;String底层详解,实例化、拼接、比较;String为什么不可变

文章目录 0、前言一、String、StringBuilder、StringBuffer区别二、String简介2.1 String类特点2.2 创建String对象、String实例化2.2.1 实例化方法2.2.2 String str1"abc"和String str2new String("abc")区别 2.3 String的比较2.4 String类的“加法”2.5 …

idea的maven打包只有几kb

在pom.xml文件中添加以下&#xff1a; <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.4.RELEASE</version><configuration><!-- 指定该Main Class…

【youcans电力电子仿真 03】Boost变换电路

【youcans电力电子仿真 03】Boost变换电路 Boost变换电路是Buck变换电路的对偶拓扑&#xff0c;也属于非隔离型直流变换器&#xff0c;其输出电压大于输入电压。Boost变换电路具有效率高、输出稳定、控制简单和成本低的优点&#xff0c;广泛应用于电子设备、光伏发电、无线通信…

了解MySQL InnoDB多版本MVCC(Multi-Version Concurrency Control)

了解MySQL InnoDB多版本MVCC&#xff08;Multi-Version Concurrency Control&#xff09; 在数据库管理系统中&#xff0c;多版本并发控制&#xff08;MVCC&#xff09;是一种用于实现高并发和事务隔离的技术。MySQL的InnoDB存储引擎支持MVCC&#xff0c;这使得它可以在提供高…

伪分布Hadoop下安装Hive

一、下载并安装Mysql &#xff08;1&#xff09;下载mysql安装包&#xff08;mysql-8.0.26-1.el7.x86_64.rpm-bundle.tar&#xff09; 下载官网&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ &…

Linux-用户管理类命令实训

掌握Linux各类命令的使用方法。熟悉Linux操作环境。掌握常用文件目录类命令掌握常用系统信息类命令了解其他常用命令 一、文件与目录管理 &#xff08;1&#xff09;查看根目录下有哪些内容 &#xff08;2&#xff09;进入/tmp目录&#xff0c;以自己的学号建一个目录&#x…

HTML部分常用标签补充

table&#xff08;布局方面不建议使用&#xff0c;而是使用CSS来完成&#xff09;: 标签解释&#xff1a; ~table标签顾名思义&#xff0c;是表格的意思 ~table其中可以使用boder属性来显示表格的线&#xff0c;最好使用CSS来配合HTML的使用 ~table内的内容可以使用colspan来定…

Vue2slot插槽(理解与应用)

1、插槽的概念 插槽&#xff08;Slot)是vue为组件的封装者提供的能力。允许开发者在封装组件时&#xff0c;把不确定的、希望由用户指定的部分定义为插槽。 举个例子&#xff1a;组件好比小霸王游戏机&#xff0c;插槽就是游戏机的插口&#xff0c;看用户插什么卡&#xff0c;就…

【论文精读】Attention is all you need

摘要 主要的序列转换模型是基于复杂的循环或卷积神经网络&#xff0c;其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意力机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c;完全基于注意机制&#xff0c;完全…

vue中 export default 与 export 写法的区别

文章目录 1、export default 用法1.1、定义函数1.2、使用 2、export 用法2.1、定义函数2.1、使用1&#xff09;使用方法1&#xff1a;一次性导入所有函数2&#xff09;使用方法2&#xff1a;按需导入函数&#xff0c;使用 **大括号** 3、总结 1、export default 用法 1.1、定义…

24五一杯资料汇总!!!!

以下内容为23年五一杯内容&#xff0c;24年也将会按时更新资料&#xff01;&#xff01;&#xff01; 问题1&#xff1a;给定建筑物数据&#xff0c;假设该建筑物内温度需要一直保持在18-26度&#xff0c;在温度不适宜的时候要通过电来调节温度&#xff0c;消耗一度电相当于0.…

gazebo中vins-fusion在仿真小车上的部署

软件要求&#xff1a;Ubuntu 20.04 ros的noetic版本&#xff0c;我是在虚拟机vitrualbox上运行的 这几天在学ROS&#xff0c;跟着赵虚左老师过了一遍之后&#xff0c;感觉还是有很多不懂的地方&#xff0c;xtdrone上仿真跟着文档走了一遍&#xff0c;好像没学到什么东西&#…

java解决常见递归问题

最基本的&#xff0c;斐波那契数列&#xff0c;阶乘&#xff08;0&#xff0c;1的阶乘均为1&#xff09; 返回字母“x”第一次出现的位置 使用递归编写一个函数&#xff0c;读取一个字符串&#xff0c;返回字母“x”第一次出现的位置。例如&#xff0c;字符串 "abcdefgh…

力扣练习题(2024/4/21)

贪心算法是一种在每一步选择中都做出最佳选择的算法方法。它以尽量减少当前问题的复杂性为目标&#xff0c;在每一步选择中尽可能取得最佳结果。尽管贪心算法不能保证总是获得最优解&#xff0c;但在许多情况下&#xff0c;它是解决问题的高效方法。 1分发饼干 如果连续数字之…

centos安装服务及设置自启动

centos安装redis及设置自启动 centos安装redis及设置自启动redis安装脚本redis启动脚本chkconfig设置开机自启动systemctl设置开机自启动nginx脚本mysql脚本mongodb脚本rabbitmq脚本java服务脚本删除日志定时任务 centos安装redis及设置自启动 redis安装脚本 进入 /opt/redis…

Python数据挖掘项目开发实战:利用神经网络破解验证码

注意&#xff1a;本文的下载教程&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程&#xff1a;Python数据挖掘项目开发实战_用神经网络破解验证码_编程案例解析实例详解课程教程.pdf 使用Pyth…

【小浩算法cpp实现】删除链表的倒数第n个节点

目录 前言我的思路思路一思路二 我的代码 前言 今天继续学习算法&#xff0c;前几天觉得数组的题还是简单了&#xff0c;今天换个链表的&#xff0c;没想到也是考研期间学过的比较经典的链表算法&#xff0c;就当复习cpp啦&#xff01; 我的思路 首先我觉得大家应该已经懂了…

pdf在线免费转word网站推荐,纯免费、不注册

pdf在线免费转word网站推荐&#xff0c;纯免费、不注册 pdf在线免费转word文档 https://orcc.online/pdf 不限次数、免费不需要注册&#xff0c;上传之后过一段时间&#xff0c;右侧就会出现转换完成的word文档。 其他工具 时间戳转换 https://orcc.online/timestamp Base…