扫雷游戏(C语言)

目录

一、前言:

二、游戏规则:

三、游戏前准备

四、游戏实现

1、打印菜单

2、初始化棋盘

3、打印棋盘

4、布置雷

5、排雷

五、完整代码


一、前言:

用C语言完成扫雷游戏对于初学者来说,难度并不是很大,而且通过编程这个小游戏,会让你对函数调用,分支循环,连续输入等有很好的掌握,该过程并不涉及指针及以后的内容。

二、游戏规则:

扫雷游戏规则十分简单,比如9*9网格中,就是在81个网格中找到其中的10颗雷,并不被雷炸死。

三、游戏前准备

我们为了让代码更加简洁,将代码分成三个文件中编写,如图所示,在test.c文件中放主函数,

在game.h中放所需的头文件,在gam.c中放调用的函数。

四、游戏实现

为了方便下面的讲解,我先把主函数和头文件放出来

#include<stdio.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 10
void Initboard(char board[ROWS][COLS], int rows,int cols,char set);
void Printboard(char board[ROWS][COLS], int row, int col);
void Setmine(char board[ROWS][COLS],int row,int col);
void Finemine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

 game.h文件中放入头文件,并定义全文所需的宏变量,这样方便改动,比如本篇讲述的是9*9网格的,你只需将定义的9改成其他数据,就可以得到一个10*10或其他的网格


#include"game.h"
void game()
{char mine[ROWS][COLS];char show[ROWS][COLS];//第一步,初始化棋盘Initboard(mine, ROWS, COLS,'0');Initboard(show, ROWS, COLS,'*');//第二步,打印棋盘Printboard(show, ROW, COL);//第三步,布置雷Setmine(mine, ROW, COL);//Printboard(mine, ROW, COL);//第四步,排雷Finemine(mine, show, ROW, COL);
}
void menu()
{printf("****************\n");printf("**** 1 play ****\n");printf("**** 0 exit ****\n");printf("****************\n");
}
int main()
{int count = 0;srand((unsigned int)time(NULL));do{menu();printf("请输入你的选择:");scanf("%d", &count);switch (count){case 1:game();break;case 0:printf("你已选择退出游戏\n");break;default:printf("这是一个不规范的选择,请重新选择\n");break;}} while (count);return 0;
}

通过主函数,你应该能看出来我们实现这个游戏的逻辑是先打印出菜单,告诉你不同的选择,然后通过你的选择来判断是否进入游戏,所以游戏大体分成以下几步:

1、打印菜单

2、初始化棋盘

3、随机布置十颗雷

5、打印棋盘

4、排雷

下面我们逐步实现这几点:

1、打印菜单

void menu()
{printf("****************\n");printf("**** 1 play ****\n");printf("**** 0 exit ****\n");printf("****************\n");
}

运行后可以打印出菜单

2、初始化棋盘

在game()函数中,我们定义了两个字符数组

char mine[ROWS][COLS];
char show[ROWS][COLS];
//第一步,初始化棋盘
Initboard(mine, ROWS, COLS,'0');
Initboard(show, ROWS, COLS,'*');

其中第一个数组是雷盘,布置雷在上面,第二个数组是展示的,告诉玩家游戏进行情况,我们用0表示无雷,可以先把雷盘全部初始化为‘0’,展示盘全部初始化为‘*’

具体函数如下:

void Initboard(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;}}
}

3、打印棋盘

在主函数中,我们就提到了初始化后打印棋盘,其实打印棋盘和布置雷两步可以互换先后顺序,但是这里打印棋盘还可以用来检测上面初始化是否成功

//第二步,打印棋盘Printboard(show, ROW, COL);

代码如下:

void Printboard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (i = 0; i <=row; i++)printf("%d ", i);printf("\n");for (i = 1; i <= col; i++){printf("%d ", i);for (j = 1; j <= row; j++){printf("%c ", board[i][j]);}printf("\n");}
}

运行后结果如下:

4、布置雷

//第三步,布置雷Setmine(mine, ROW, COL);//Printboard(mine, ROW, COL);//这步可以用来检测雷是否布置成功,如果怕出错可以用上

初始化棋盘之后,就要在雷盘中随即找十个位置放雷,也就是说要放进去十颗雷

void Setmine(char board[ROWS][COLS], int row, int show)
{int num = mine_count;while (num){int i = rand() % 9 + 1;int j = rand() % 9 + 1;if (board[i][j] == '0'){board[i][j] = '1';num--;}}
}

用‘1’表示雷,就是将mine数组中随即找十个位置,将‘0’换成‘1’,表示在这里埋雷

5、排雷

排雷过程中只有两种结果,一种是正好是雷,那么就会炸死,另一种则是不是雷,如果不是雷,我们应该把它周围有几个雷判断出来,不然几乎不可能通关

代码如下:

int lei_count(char mine[ROWS][COLS], int a, int b)
{int count = mine[a - 1][b - 1] + mine[a - 1][b] + mine[a - 1][b + 1] + mine[a][b - 1] + mine[a][b + 1]+ mine[a + 1][b - 1] + mine[a + 1][b] + mine[a + 1][b + 1] - 8 * '0';return count;
}
void Finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int a, b;int wulei = row * col - mine_count;while (wulei){printf("请输入你要检查的坐标:");scanf("%d %d", &a, &b);if (a > 0 && a <= row && b > 0 && b <= col){if (mine[a][b] == '1'){printf("抱歉,这是雷,你被炸死了\n");break;}else{//既然不是雷,那就统计雷的数量int count = lei_count(mine, a, b);show[a][b] = count + '0';Printboard(show, ROW, COL);wulei--;}}elseprintf("此坐标不存在,请重新输入\n");}
}

五、完整代码

game.h

#include<stdio.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 10
void Initboard(char board[ROWS][COLS], int rows,int cols,char set);
void Printboard(char board[ROWS][COLS], int row, int col);
void Setmine(char board[ROWS][COLS],int row,int col);
void Finemine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

test.c

#include"game.h"
void game()
{char mine[ROWS][COLS];char show[ROWS][COLS];//第一步,初始化棋盘Initboard(mine, ROWS, COLS,'0');Initboard(show, ROWS, COLS,'*');//第二步,打印棋盘Printboard(show, ROW, COL);//第三步,布置雷Setmine(mine, ROW, COL);//Printboard(mine, ROW, COL);//第四步,排雷Finemine(mine, show, ROW, COL);
}
void menu()
{printf("****************\n");printf("**** 1 play ****\n");printf("**** 0 exit ****\n");printf("****************\n");
}
int main()
{int count = 0;srand((unsigned int)time(NULL));do{menu();printf("请输入你的选择:");scanf("%d", &count);switch (count){case 1:game();break;case 0:printf("你已选择退出游戏\n");break;default:printf("这是一个不规范的选择,请重新选择\n");break;}} while (count);return 0;
}

game.c

#include"game.h"
void Initboard(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 Printboard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (i = 0; i <=row; i++)printf("%d ", i);printf("\n");for (i = 1; i <= col; i++){printf("%d ", i);for (j = 1; j <= row; j++){printf("%c ", board[i][j]);}printf("\n");}
}
void Setmine(char board[ROWS][COLS], int row, int show)
{int num = mine_count;while (num){int i = rand() % 9 + 1;int j = rand() % 9 + 1;if (board[i][j] == '0'){board[i][j] = '1';num--;}}
}
int lei_count(char mine[ROWS][COLS], int a, int b)
{int count = mine[a - 1][b - 1] + mine[a - 1][b] + mine[a - 1][b + 1] + mine[a][b - 1] + mine[a][b + 1]+ mine[a + 1][b - 1] + mine[a + 1][b] + mine[a + 1][b + 1] - 8 * '0';return count;
}
void Finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int a, b;int wulei = row * col - mine_count;while (wulei){printf("请输入你要检查的坐标:");scanf("%d %d", &a, &b);if (a > 0 && a <= row && b > 0 && b <= col){if (mine[a][b] == '1'){printf("抱歉,这是雷,你被炸死了\n");break;}else{//既然不是雷,那就统计雷的数量int count = lei_count(mine, a, b);show[a][b] = count + '0';Printboard(show, ROW, COL);wulei--;}}elseprintf("此坐标不存在,请重新输入\n");}
}

用C语言解决扫雷游戏还是非常有意思的,上面这种还是最简单的,还有许多有趣的东西值得探索,比如如何搞一个20*20的棋盘,或如何用递归的方法实现快速展开,如果想了解更多,点击关注,去学习更多C语言的知识。

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

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

相关文章

一份轴承振动数据集摘引 - XJTU-SY2019

1.原始引用 我第一次看到这个数据集是在知乎&#xff1a; XJTU-SY数据集轴承故障诊断 - 知乎XJTU-SY数据集包含了3种工况下的15个滚动轴承的全寿命周期振动信号&#xff0c;且明确标注了每个轴承的失效部位&#xff0c;相关论文如下&#xff1a;[1]雷亚国,韩天宇,王彪,李乃鹏…

人工智能与低代码开发: 创新技术的未来

本文将探讨人工智能与低代码开发两个创新技术的结合&#xff0c;并为读者展示这种结合对未来技术发展的巨大潜力。我们将介绍人工智能和低代码开发的概念&#xff0c;并探讨它们分别在软件开发领域的作用。接着&#xff0c;我们将讨论它们如何相互影响和协作&#xff0c;以及它…

分享|2024年7款好用的电脑监控软件

电脑监控软件作为现代企业管理中不可或缺的一部分&#xff0c;能够帮助管理者们更好地管理和监控员工电脑的使用情况&#xff0c;保障企业的信息安全和机密数据的保密。在2024年&#xff0c;电脑监控软件哪些会更受欢迎&#xff1f; 1.绿虫 优势&#xff1a;具有目前市面上所…

如何写出一篇合格且优秀的硕士毕业论文

一、软件、插件推荐 谷歌浏览器、Edge浏览器&#xff08;有自动翻译成中文的小插件&#xff09; Scholarscope、EasyPubmed(浏览器插件&#xff0c;显示影响因子&#xff0c;被引用的次数&#xff0c;链接) 知云文献翻译&#xff08;文献阅读软件&#xff09; Endnote X9(插…

动态添加字段和注解,形成class类,集合对象动态创建Excel列

一.需求 动态生成Excel列&#xff0c;因为Excel列是通过类对象字段注解来添加&#xff0c;在不确定Excel列数的情况下&#xff0c;就需要动态生成列&#xff0c;对应类对象字段也需要动态生成&#xff1b; 二.ByteBuddy字节码增强动态创建类 1.依赖 <dependencies><…

DS:经典算法OJ题(1)

创作不易&#xff0c;友友们给个三连呗&#xff01;&#xff01; 本文为经典算法OJ题练习&#xff0c;大部分题型都有多种思路&#xff0c;每种思路的解法博主都试过了&#xff08;去网站那里验证&#xff09;是正确的&#xff0c;大家可以参考&#xff01;&#xff01; 一、移…

常用芯片学习——LM2596芯片

LM2596 3A降压型稳压器 使用说明 LM2596开关电压调节器是降压型电源管理单片集成电路&#xff0c;能够输出最大3A的驱动电流&#xff0c;同时具有很好的线性和负载调节特性。芯片按照输出版本可分为四种&#xff0c;分别是3.3V、5V、12V、ADJ&#xff08;可调版本&#xff09…

一文读懂Python中的映射

python中的反射功能是由以下四个内置函数提供&#xff1a;hasattr、getattr、setattr、delattr&#xff0c;改四个函数分别用于对对象内部执行&#xff1a;检查是否含有某成员、获取成员、设置成员、删除成员。 获取成员: getattr class Foo:def __init__(self, name, age):se…

【command】使用nr简化npm run命令

参考文章 添加 alias nrnpm run通过alias启动命令可以帮助我们节省运行项目输入命令的时间 $ cd ~ $ vim .bash_profile $ source ~/.bashrc

数据结构系统刷题

本文为系统刷leetcode的记录&#xff0c;会记录自己根据代码随想录刷过的leetcode&#xff0c;方便直接点开刷题&#xff0c;时常更新 时间复杂度简记为s 空间复杂度简记为k 数组 704 二分查找 一维二分查找 &#xff08;1&#xff09;[left, right] class Solution { publi…

自然语言处理发展(自然语言处理发展经历了哪些阶段)

​​​​​​​ 一、历史发展 自然语言处理的研究始于20世纪50年代初期&#xff0c;当时的主要任务是理解自然语言&#xff0c;并将其转换为机器语言。随着计算机硬件和软件的不断发展&#xff0c;NLP也得以逐步发展。在20世纪70年代&#xff0c;Chomsky提出了语法结构理论&a…

应急响应-流量分析

在应急响应中&#xff0c;有时需要用到流量分析工具&#xff0c;。当需要看到内部流量的具体情况时&#xff0c;就需要我们对网络通信进行抓包&#xff0c;并对数据包进行过滤分析&#xff0c;最常用的工具是Wireshark。 Wireshark是一个网络封包分析软件。网络封包分析软件的…

isctf---crypto

夹里夹气 可以发现是摩斯密码 得到flag easy_rsa nc连接 rsa_d nc连接 计算d 七七的欧拉 task import gmpy2 import libnum from crypto.Util.number import *flagbISCTF{*************} mbytes_to_long(flag)plibnum.generate_prime(1024) elibnum.generate_prime(51…

数据库分表分库的原则

什么是数据库分库分表 数据库分表&#xff08;Table Sharding&#xff09; 数据库分表是将一个大表按照某种规则拆分成多个小表存储在不同的物理表中的技术。通常&#xff0c;拆分规则是基于某个列的值进行拆分&#xff0c;例如根据用户ID或日期范围等进行拆分。每个小表只包…

【TensorRT】官方文档onnx序列化教程与推理教程

官方文档onnx序列化教程与推理教程 一、构建TensorRT序列化模型二、搭建阶段&#xff08;三步走&#xff09;2.1 创建网络2.2 使用ONNX解析器导入模型2.3 构建推理引擎 三、反序列化模型四、执行推理 一、构建TensorRT序列化模型 本博客主要说明的是TensorRT C API&#xff0c…

mybatis的动态标签,在实际开发中公共的字段怎么写sql

MyBatis的动态SQL是一种强大的机制&#xff0c;可以根据不同的条件生成不同的SQL语句&#xff0c;其中的动态标签包括<if>, <choose>, <when>, <otherwise>, <trim>, <where>, <set>, <foreach>等&#xff0c;使得在实际开发中…

NPDP证书:让你的职业生涯飞升!

&#x1f31f;没错&#xff01;NPDP证书正在成为产品经理们的“新宠”&#xff01;越来越多的同行们纷纷选择考取NPDP证书&#xff0c;为什么这么火爆&#xff1f;一起来探究下吧&#xff01; &#x1f680;NPDP认证&#xff1a;产品经理的国际通行证 &#x1f4cd;NPDP&#x…

Codeforces Round 921 (Div. 2) C. Did We Get Everything Covered? (思维题)

题目链接 思路: div.2的A题是本题的铺垫, A题的意思是将前k个字母循环出现m次即可, 则将前k个字母看成一个循环节。 本题则是在长为m的字符串中找循环节&#xff0c;注意循环节的意思是前k个字母出现至少一次&#xff0c; 则可知当找到一个循环节的时候&#xff0c;这个循环节…

快速掌握PHP:用这个网站,让学习变得简单有趣!

介绍&#xff1a;PHP是一种广泛使用的开源服务器端脚本语言&#xff0c;特别适合Web开发。 PHP&#xff0c;全称为Hypertext Preprocessor&#xff0c;即超文本预处理器&#xff0c;是一种嵌入在HTML中的服务器端脚本语言。它主要用于管理动态内容和数据库交互&#xff0c;使得…

【GAMES101】Lecture 09 纹理贴图 点查询与范围查询 Mipmap

目录 纹理贴图 纹理放大-双线性插值 点采样纹理所带来的问题 Mipmap 各向异性过滤 纹理贴图 我们在之前的着色里面说过如何给物体上纹理&#xff0c;就是对于已经光栅化的屏幕点&#xff0c;就是每个像素的中心&#xff0c;去寻找对应纹理的映射位置的纹理颜色&#xff0…