扫雷游戏小程序

目录

一.文件

1.头文件

2.源文件

二.游戏界面和执行(test.c)

三.函数实现(void game部分,源文件game.c)

1.定义雷二维数组和展示二维数组

2.初始化地雷数组

3.初始化显示的数组

4.显示当前的情况

5.随机放置地雷

6.排雷

ps:深度优先遍历数组

四.结束


一.文件

1.头文件

game.h

用于存放所有源文件需要用的标准库头文件函数的声明。(便于查找和让代码更简洁)

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define COLS COL+2
#define ROWS ROW+2
#define ALLMINE 10
void InitBoard(char board[ROWS][COLS],int row,int col,char set);
void DisplayBoard(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 board[ROWS][COLS], int row, int col);

ROW和COL扫雷的行和列,也就是面积

ROWS和ROWS行和列加2,加2是因为我们后面需要统计每个格子四周的8个格子一共含有的雷数,为了避免越界问题,特地+2,左右上下各加一行或者一列嘛。

ALLMINEE所有的雷一共10个

InitBoard,DisplayBoard,SetMine,FineMine为后面需要用到的函数的声明

2.源文件

game.c

test.c

game.c用来写所有自定义函数的代码

test.c用来写游戏界面的执行入口游戏函数执行顺序

如图:

二.游戏界面和执行(test.c)

注意:记得加上自定义头文件game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu() {printf("********************************\n");printf("********   1.开始游戏   ********\n");printf("********   0.退出游戏   ********\n");printf("********************************\n");
}
void game() {int mine[ROWS][COLS];int show[ROWS][COLS];InitBoard(mine,ROWS,COLS,'0');//初始化地雷数组InitBoard(show, ROWS, COLS,'*');//初始化显示的数组DisplayBoard(show,ROW,COL);//显示当前的情况/*DisplayBoard(mine, ROW, COL);*/SetMine(mine,ROW,COL);//放置地雷,随机/*DisplayBoard(mine, ROW, COL);*/FineMine(mine,show, ROW, COL);//排雷
}
int main() {menu();int input = 0;srand((unsigned int)time(NULL));//需要标准库头文件stdlib.h和time.hdo {printf("请输入1或0:>\n");scanf("%d", &input);switch (input) {case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");}} while (input);return 0;
}

解释:

1.游戏的进入与退出我们使用do while循环先执行一遍再根据输入的数判断是否再次决定游戏的进入与退出

2.至于srand()函数,void srand(unsigned int seed);是他的原型,srand 函数用于设置随机数生成器的种子。这个种子值决定了 rand 函数(后面会讲到)生成的随机数序列(如果种子为固定值,则随机的数也是固定值)。通常在调用 rand 之前调用 srand,并传入一个无符号整数作为种子值。这里我们使用时间作为种子,因为时间是一直在流逝的嘛,所以其总能够生成随机数。

3.game()函数也就是后面会讲的game.c。

效果如下图:

三.函数实现(void game部分,源文件game.c)

注意:记得加上自定义头文件game.h

1.定义二维数组和展示二维数组

2.初始化地雷数组

给每个格子都初始化为0

void InitBoard(char board[ROWS][COLS], int row, int col,char set){//InitBoard(mine,ROWS,COLS,'0');for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {board[i][j] = set;}}
}

3.初始化显示的数组

注意和初始化地雷数组的区别,这个传入的 实参为show,上面那个传入的是mine

给每个格子初始化为' * '

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char board[ROWS][COLS], int row, int col,char set){//InitBoard(show, ROWS, COLS,'*');for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {board[i][j] = set;}}
}

4.显示当前的情况

注意这里的row和col为ROW,COL,而不是ROWS,COLS,我们显示的话只显示9*9的面积就可以了

上面那两个初始化则就是ROWS,COLS,

void DisplayBoard(char board[ROWS][COLS], int row, int col) {//DisplayBoard(show,ROW,COL);for (int i = 0; i <= row; i++) {printf("%d ", i);//给列显示坐标}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");}
}

效果如图:

5.随机放置地雷

void SetMine(char board[ROWS][COLS], int row, int col) {//SetMine(mine,ROW,COL);int n = ALLMINE;//前面在头文件定义了ALLMINE为10,也就是雷的个数while (n) {int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '1') {continue;}//避免了在同一个坐标放置雷else {board[x][y] = 1 + '0';n--;//放好雷之后才n--}}
}

解释:

1.

rand

rand 函数用于生成一个伪随机数。该函数不需要参数,返回一个在 0RAND_MAX 之间整数(包括 0RAND_MAX)。RAND_MAX 是一个常量,定义在 <stdlib.h> 中,通常是 32767,但这取决于具体的实现。

srand

srand 函数用于设置随机数生成器的种子。这个种子值决定了 rand 函数生成的随机数序列。通常在调用 rand 之前调用 srand,并传入一个无符号整数作为种子值

2.

int x = rand() % row + 1;

int y = rand() % col + 1;

因为row和col都是9,所以我们让这个随机数上一个9,得到的数的范围一定是0~8,此时我们再让他+1,那他的范围就是1~9了,就符合我们的坐标条件了

6.排雷

代码如下:

void FineMine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col) {;//FineMine(mine,show, ROW, COL);int x;int y;//x,y为你要排查的坐标,输入int count = 0;//你排查了的坐标的个数while (1) {//一直循环排雷,直到排到雷,或者是成功通关就结束循环printf("请输入你要排查的坐标:>");scanf("%d", &x);scanf("%d", &y);if (mine[x][y] != '1') {if (show[x][y] = '*') {//dfs(mine, show, x, y);//深度优先遍历DisplayBoard(show, ROW, COL);//每排查一个坐标就接着显示面板count++;//排查了的坐标++}elseprintf("该坐标已经被占用,请重新输入:>");//如果不为'*'意味着已经排查过这个坐标了}else {printf("很不幸,你被炸死了\n");DisplayBoard(mine, ROW, COL);//炸死后显示所有雷的位置break;}if (count == row * col - ALLMINE+1) {printf("恭喜你,成功通关了!\n");break;}}
}

至于dfs()函数后面讲

效果如图:

ps:深度优先遍历数组

当然目的就是让其每输入一个坐标都有可能展开一片的操作,极大地减少了工作量。

写这个代码前建议大家刷一下力扣的这道题:

. - 力扣(LeetCode)

代码如下:

上面有注释

void dfs(char mine[ROWS][COLS], char show[ROWS][COLS], int a, int b) {//dfs(mine, show, x, y);int dx[8] = { -1,-1,-1,0,0,1,1,1 };//每个x都对应着其相同下标的yint dy[8] = { -1,0,1,-1,1,-1,0,1 };//输入的x和y所在位置的周围八个位置int count = 0;//用来记录(a,b)周围雷的个数for (int i = 0; i < 8; i++) {int r = a + dx[i];int c = b + dy[i];//定位到xy周围的位置if (r >= 1 &&r<=9&& c >= 1&&c<=9 && mine[r][c] =='1') {//r >= 1 &&r<=9&& c >= 1&&c<=9这一坨就是判断有没有越界count++;//该位置是雷的话,就count++}}if (count == 0) {//周围八个位置没有雷show[a][b] = '0';for (int i = 0; i < 8; i++) {//在这没有雷的位置扩散开来,直到找到其周围有雷的为止int r = a + dx[i];int c = b + dy[i];if (r >= 1 && r <= 9 && c >= 1 && c <= 9 && show[r][c] == '*') {//注意show[r][c] == '*'这个条件,不要遍历到重复的已经遍历过的dfs(mine, show, r, c);//从这个坐标开始扩散}}}

效果如图:

可以看到边界都显示有雷的!

四.结束

一键三连哦,感谢大家的阅读!

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

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

相关文章

《Single-Stage Extensive Semantic Fusion for multi-modal sarcasm detection》

系列论文研读目录 文章目录 系列论文研读目录文章题目含义ABSTRACTKeywords1. Introduction2. Related work3. Method3.1. Multi-modal projection 多模态投影3.2. Extensive Semantic Fusion Multiway Transformer 可拓语义融合多路Transformer3.3. Multi-objective optimizat…

LeetCode 热题 HOT 100 (011/100)【宇宙最简单版】

【图论】No. 0200 岛屿数量 【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xf…

DjangoRF-10-过滤-django-filter

1、安装pip install django-filter https://pypi.org/ 搜索django-filter基础用法 2、进行配置 3、进行内容调试。 4、如果碰到没有关联的字段。interfaces和projects没有直接关联字段&#xff0c;但是interface和module有关联&#xff0c;而且module和projects关联&#x…

linux下使用yum安装mysql

本文使用常规方式手动安装mysql 第一步 下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm第二步 安装mysql-community-release-el7-5.noarch.rpm包 rpm -ivh mysql-community-release-el7-5.noarch.rpm第三步 安装mysql-server yum -y…

Esp_server 安卓嵌入壳子,原创! 2024/7/28 20:58

用到的软件: uni-app 思路: 让用户感觉是,一个完整的程序.实际上只是一个类浏览器壳子.轻便小巧. 由于是第一次用uni-app开发类软件,所以前前后后耗费7小时! 隔行如隔山,不是白讲的. 软件界面: 软件功能: 简化输入: 输入ip地址,例:http:// www.baidu.com 完整网址 前面…

Javaer 5分钟入门 Golang

文章目录 前言一个 go 文件长啥样&#xff1f;Go 语言的变量变量类型变量声明 Go 语言的函数&方法Go 语言没有的概念访问修饰符面向对象模型异常处理机制 Go 语言高效简洁的并发编程总结 前言 这两年主流的编程语言 Golang&#xff0c;想必大家或多或少都接触过。云原生领…

使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录

前言 RabbitMQ 是一个功能强大的开源消息队列系统&#xff0c;它实现了高效的消息通信和异步处理。 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验。 特点 成熟&#xff0c;稳定消息持久化灵活的消息路由高性能&#xff0c;高可用性&#xff0c;可扩展性高支…

【PYTHON】多进程运行示例含共享数据

运行结果 Python多进程调用示例 import multiprocessing import time import os import sys# 注册多个函数用于不同进程分别调用 def testcase0():time.sleep(1)return "case0_"get_time()def testcase1(timestamp):return "case1_"timestampdef testcase…

Python | TypeError: ‘float’ object is not subscriptable

Python | TypeError: ‘float’ object is not subscriptable 在Python编程中&#xff0c;遇到“TypeError: ‘float’ object is not subscriptable”这一错误通常意味着你尝试对浮点数&#xff08;float&#xff09;使用了下标访问&#xff08;如数组或列表那样的访问方式&a…

Mindspore框架循环神经网络RNN模型实现情感分类|(四)损失函数与优化器

Mindspore框架循环神经网络RNN模型实现情感分类 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;一&#xff09;IMDB影评数据集准备 Mindspore框架循环神经网络RNN模型实现情感分类|&#xff08;二&#xff09;预训练词向量 Mindspore框架循环神经网络RNN模型实现…

探索 Blockly:自定义积木实例

3.实例 3.1.基础块 无输入 , 无输出 3.1.1.json var textOneJson {"type": "sql_test_text_one","message0": " one ","colour": 30,"tooltip": 无输入 , 无输出 };javascriptGenerator.forBlock[sql_test_te…

数据结构:二叉树(堆)的顺序存储

文章目录 1. 树1.1 树的概念和结构1.2 树的相关术语 2. 二叉树2.1 二叉树的概念和结构2.2 二叉树的特点2.3 特殊的二叉树2.3.1 满二叉树2.3.2 完全二叉树 2.4 二叉树的性质 3. 实现顺序结构二叉树3.1 堆的概念和结构3.2 初始化3.3 销毁3.4 插入数据3.5 向上调整算法3.6 删除数据…

【二叉树】—— 算法题

一、单值二叉树 题目要求&#xff1a;判断二叉树是不是单值二叉树&#xff08;就是所以节点的值都相等&#xff09;。 思路&#xff1a; 利用二叉树的递归思想&#xff0c;判断每一个节点值与其左右子节点的值是否相等&#xff0c;如果遇到空节点&#xff0c;就返回true&#…

醒醒,别睡了...讲《数据分析pandas库》了—/—<7>

一、 1、处理缺失值 1.1 认识缺失值 系统默认的缺失值 None 和 np. nan datapd.Series([3,4,np.nan,1,5,None]) dfpd.DataFrame([[1,2,None],[4,np.nan,6],[5,6,7]]) 1.2 缺失值查看 直接调用info() 方法就会返回每一列的缺失情况。 dfpd.DataFrame([[1,2,np.nan],[4,np.n…

在Linux中,MySQL备份与恢复

随着自动化办公与电子商务的不断发展&#xff0c;企业对于信息系统的依赖性越来越高&#xff0c;而数据库在信息系统中担任着非常重要的角色。尤其一些对数据可靠性要求非常高的行业,如银行、证券、电信等&#xff0c;如果发生意外宕机或数据丢失&#xff0c;其损失是非常严重的…

[ACTF2020 新生赛]Upload1

打开靶机&#xff0c;发现什么都没有 查看源码发现有个表单&#xff0c;不过高度为0&#xff0c;所以被隐藏了&#xff0c;我们直接找打css文件&#xff0c;清空&#xff08;也可以设置原始高度&#xff09; 然后提交木马脚本&#xff0c;直接提交PHP不通过 修改为phtml&#x…

Java | Leetcode Java题解之第299题猜数字游戏

题目&#xff1a; 题解&#xff1a; class Solution {public String getHint(String secret, String guess) {int bulls 0;int[] cntS new int[10];int[] cntG new int[10];for (int i 0; i < secret.length(); i) {if (secret.charAt(i) guess.charAt(i)) {bulls;} e…

初学Mybatis之多对一查询 association 和一对多查询 collection

XML 映射器 多对一&#xff1a;关联&#xff08;association&#xff09; 一对多&#xff1a;集合&#xff08;collection&#xff09; mysql 创建教师、学生表&#xff0c;插入数据 create table teacher(id int(10) primary key,name varchar(30) default null ) engineI…

OpenSource - Ip2region 离线IP地址定位库和IP定位数据管理框架

文章目录 Ip2region 是什么Ip2region 特性1、IP 数据管理框架2、数据去重和压缩3、极速查询响应 xdb 数据查询xdb 数据生成xdb 数据更新手动编辑更新检测自动更新 相关备注1、并发查询必读2、技术资源分享 Release Ip2region 是什么 https://github.com/lionsoul2014/ip2regio…

【C++】使用哈希表封装unordered_map与unordered_set

文章目录 1. unordered系列关联式容器1.1 unordered_set1.2 unordered_map 2. unordered_set/map的封装2.1 基本接口2.2 迭代器2.2.1 迭代器的结构2.2.2 set迭代器的封装2.2.3 map迭代器的封装 3.完整代码3.1HashTable3.2unordered_set3.3unordered_map 1. unordered系列关联式…