扫雷小游戏

目录

一.扫雷小游戏 

二.游戏主体一览

​编辑

 三.模块化设计扫雷游戏

3.1打印欢迎菜单

 3.2创建两个二维数组

 3.3棋盘稍加修改

3.4布置雷

3.5排查雷

四.游戏总体代码

4.1game.h头文件

4.2game.c函数实现源文件

4.3游戏main函数主体

五.游戏效果图


一.扫雷小游戏 

 这是一个经典的扫雷小游戏界面,可以看出扫雷游戏实际上跟代码中的二维数组很相似,因此扫雷小游戏便是对二维数组的使用。

二.游戏主体一览


int main()
{int input = 0;do{//创造游戏菜单界面menu();printf("请选择:\n");scanf("%d", &input);switch (input){case 1://游戏函数主体部分game();break;case 0:printf("游戏已退出\n");default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

 三.模块化设计扫雷游戏

3.1打印欢迎菜单

//游戏菜单函数
void menu()
{printf("                        \n");printf("         扫雷小游戏     \n");printf("***       1.play     ***\n");printf("***       0.exit     ***\n");printf("*********        *******\n");printf("*********        *******\n");
}

 3.2创建两个二维数组

为什么要创建两个二维数组呢?

  • 创建第一个mine数组用来存放布置好的雷的信息
  • 创建第二个show数组用来存放排查出的雷的信息
  • 为了代码实现过程的简化要求两个数组大小一致
//创建两个二维数组,初始化char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };initboard(mine, ROWS, COLS,'0');initboard(show, ROWS, COLS,'*');

mine数组中存放的是雷的信息:1表示雷,0表示没有雷

show数组存放玩家每次排查该位置后周围雷的个数

在此之后便于我们随机化雷的位置和显示周围雷的个数。

我们打印出初始化后棋盘来看看效果:

//根据初始化内容  初始化数组函数
void initboard(char mine[ROW][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){mine[i][j] = set;}}}
//打印棋盘
void display(char mine[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (i = 1; i <= row; i++){for (j = 1; j <= col; j++){printf("%c ",mine[i][j]);}printf("\n");}}

 3.3棋盘稍加修改

//游戏菜单函数
void menu()
{printf("                        \n");printf("         扫雷小游戏     \n");printf("***       1.play     ***\n");printf("***       0.exit     ***\n");printf("*********        *******\n");printf("*********        *******\n");
}
//根据初始化内容  初始化数组函数
void initboard(char mine[ROW][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){mine[i][j] = set;}}}
//打印棋盘
void display(char mine[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("-----扫雷-----\n");for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", mine[i][j]);}printf("\n");}}

在实现代码过程中两个棋盘都打印出来是为类方便我们观察,后续真正游玩便只需打印出show数组棋盘给玩家看即可。

3.4布置雷

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{int count = mine_count;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}}void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//我们放置雷的棋盘initboard(mine, ROWS, COLS,'0');//玩家能看到的扫雷棋盘initboard(show, ROWS, COLS,'*');//布置雷set_mine(mine, ROW, COL);//让我们看一下布置雷是否成功display(mine, ROW, COL);//排查雷}

 上和左的数字是棋盘的坐标,在内部9*9的表中1代表雷

3.5排查雷

//排查雷
int get_surround_mine_count(char mine[ROWS][COLS], int x, int y)
{int c = 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';return c;}void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row * col - mine_count){printf("请输入你要排查的坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("你被炸死了\n");printf("雷区分布如下:\n");display(mine, ROW, COL);break;}else{int surround_mine_count = get_surround_mine_count(mine, x, y);show[x][y] = surround_mine_count + '0';display(show, ROW, COL);win++;}}else{printf("坐标非法,重新输入");}}if (win == row * col - mine_count){printf("成功排雷结束");display(show, ROW, COL);}
}

 当我们输入一个坐标后显示一下棋盘


四.游戏总体代码

4.1game.h头文件

#pragma once
#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 10void initboard(mine, rows, cols, set);void display(mine, row, col);void set_mine(mine, row, col);void find_mine(mine, show, row, col);int get_surround_mine_count(mine, x, y);

4.2game.c函数实现源文件

#include "game.h"//游戏菜单函数
void menu()
{printf("                        \n");printf("         扫雷小游戏     \n");printf("***       1.play     ***\n");printf("***       0.exit     ***\n");printf("*********        *******\n");printf("*********        *******\n");
}
//根据初始化内容  初始化数组函数
void initboard(char mine[ROW][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){mine[i][j] = set;}}}
//打印棋盘
void display(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("-----扫雷-----\n");for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}}//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{int count = mine_count;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}}//排查雷//记录排查坐标周围雷的个数
int get_surround_mine_count(char mine[ROWS][COLS], int x, int y)
{int c = 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';return c;}void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row * col - mine_count){printf("请输入你要排查的坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("你被炸死了\n");printf("雷区分布如下:\n");display(mine, ROW, COL);break;}else{int surround_mine_count = get_surround_mine_count(mine, x, y);show[x][y] = surround_mine_count + '0';display(show, ROW, COL);win++;}}else{printf("坐标非法,重新输入");}}if (win == row * col - mine_count){printf("成功排雷结束");display(show, ROW, COL);}
}

4.3游戏main函数主体

#include "game.h"
//游戏主体函数
void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//我们放置雷的棋盘initboard(mine, ROWS, COLS, '0');//玩家能看到的扫雷棋盘initboard(show, ROWS, COLS, '*');//打印出放置雷的棋盘//display(mine,ROW,COL);//打印出扫雷棋盘display(show,ROW,COL);//布置雷set_mine(mine, ROW, COL);//查看布置的雷//display(mine, ROW, COL);//排查雷find_mine(mine, show, ROW, COL);}
int main()
{srand((unsigned int)time(NULL));int input = 0;do{//创造游戏菜单界面menu();printf("请选择:\n");scanf("%d", &input);switch (input){case 1://游戏函数主体部分game();break;case 0:printf("游戏已退出\n");default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

五.游戏效果图

 游玩过程中直到被炸死或者排完所有雷结束游戏。


实现扫雷游戏,感谢大家的支持

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

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

相关文章

Jmeter+ServerAgent

一、Jmeter 下载 https://jmeter.apache.org/download_jmeter.cgi选择Binaries二进制下载 apache-jmeter-5.6.2.tgz 修改配置文件 jmeter下的bin目录&#xff0c;打开jmeter.properties 文件 languagezh_CN启动命令 cd apache-jmeter-5.6/bin sh jmeter二、ServerAgent 监…

实战 图书馆系统管理案例

config &#xff1a;敏感的配置一般都是在配置中心配置&#xff0c;比如consul或者阿波罗上面controller &#xff1a;写一些handler的&#xff0c;拿到参数要去调用service层的逻辑。&#xff08;只负责接受参数&#xff0c;怎么绑定参数&#xff0c;要去调用哪个service的&am…

Viobot输出数据说明

一.原始数据 1.ROS话题 1)相机原始图像数据 Type: sensor_msgs::Image Topic: 左目&#xff1a;/image_left 右目&#xff1a;/image_right 2&#xff09;imu数据 Type: sensor_msgs::Imu Topic: /imu 3&#xff09;TOF数据 点云数据&#xff1a; Type: sensor_msgs::P…

算法与数据结构(十)--图的入门

一.图的定义和分类 定义&#xff1a;图是由一组顶点和一组能够将两个顶点连接的边组成的。 特殊的图&#xff1a; 1.自环&#xff1a;即一条连接一个顶点和其自身的边; 2.平行边&#xff1a;连接同一对顶点的两条边&#xff1b; 图的分类&#xff1a; 按照连接两个顶点的边的…

带你速览主数据管理(MDM)的前世今生

主数据管理的历史可以追溯到很久以前&#xff0c;可以说主数据管理是生产生活的一部分。随着社会生产力和生产工具的不断发展&#xff0c;主数据和主数据管理在其中的作用不断提升&#xff0c;成为当今政府、企业和社会团队等组织管理中必不可少基础管理工作&#xff0c;同时也…

FrameBuffer 应用编程

目录 什么是FrameBufferLCD 的基础知识使用ioctl()获取屏幕参数信息使用mmap()将显示缓冲区映射到用户空间 LCD 应用编程练习之LCD 基本操作LCD 应用编程练习之显示BMP 图片BMP 图像介绍在LCD 上显示BMP 图像在开发板上测试 在LCD 上显示jpeg 图像在LCD 上显示png 图片LCD 横屏…

C语言_分支和循环语句(2)

文章目录 前言一、for 循环1.1语法1.2 for 语句的循环控制变量1.3 一些 for 循环的变种 二、do ... while()循环2.1 do 语句的语法2.2 do ... while 循环中的 break 和 continue2.3 练习1 **- 计算n的阶乘**2. - **在一个有序数组中查找具体的某个数字 n** 二分查找算法&#x…

68、使用aws官方的demo和配置aws服务,进行视频流上传播放

基本思想:参考官方视频,进行了配置aws,测试了视频推流,rtsp和mp4格式的视频貌似有问题,待调研和解决 第一步:1) 进入aws的网站,然后进入ioT Core 2)先配置 Thing types & Thing,选择香港的节点,然后AWS ioT--->Manage---> Thing type 然后输入名字,创建Th…

screen命令,可以断开服务器连接,依旧能运行你的程序了

可以参考博客1&#xff1a;https://blog.csdn.net/nima_zhang_b/article/details/82797928 可以参考博客2:https://blog.csdn.net/herocheney/article/details/130984403 Linux中的screen是一个命令行工具&#xff0c;可以让用户在同一个终端会话中创建多个虚拟终端。它非常有…

null值 字段运算

null值字段运算前先把null转成0 test表如下&#xff0c;num2为null select num1-num2 from test; 结果为null减去null值结果为null select sum(num1),SUM(num2) from test ;sum求和结果为null 判断字段是null不能用 null ,要用is null 错误写法&#xff1a; select IF(…

Spring AOP基于注解方式实现和细节

目录 一、Spring AOP底层技术 二、初步实现AOP编程 三、获取切点详细信息 四、 切点表达式语法 五、重用&#xff08;提取&#xff09;切点表达式 一、Spring AOP底层技术 SpringAop的核心在于动态代理&#xff0c;那么在SpringAop的底层的技术是依靠了什么技术呢&#x…

CSS按钮-跑马灯边框

思路很简单&#xff0c;实现方法有很多很多。但是大体思路与实现方法都类似&#xff1a;渐变色 动画&#xff0c;主要区别在动画的具体实现 0、HTML 结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><titl…

服务网格实施周期缩短 50%,丽迅物流基于阿里云 ACK 和 ASM 的云原生应用管理实践

作者&#xff1a;王夕宁、 刘强、 华相 公司介绍 丽迅物流是百丽旗下专注于时尚产业、为企业提供专业物流及供应链解决方案的服务商。其产品服务主要包括城市落地配、仓配一体、干线运输及定制化解决方案。通过自研智能化物流管理平台&#xff0c;全面助力企业合作集约化发展…

4年外包出来,5次面试全挂....

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;毕业于普通二本院校非计算机专业&#xff0c;18年跨专业入行测试&#xff0c;第一份工作在湖南某软件公司&#xff0c;做了接近4年的外包测试工程师&#xff0c;今年年初&#xff0c;感觉自己不能够再这样下去了&…

leetcode 739. 每日温度

2023.8.28 本题用暴力双层for循环解会超时&#xff0c;所以使用单调栈来解决&#xff0c;本质上是用空间换时间。维护一个单调递减栈&#xff0c;存储的是数组的下标。 代码如下&#xff1a; class Solution { public:vector<int> dailyTemperatures(vector<int>&…

CPU和GPU的区别

介绍什么是GPU, 那就要从CPU和GPU的比较不同中能更好更快的学习到什么是GPU CPU和GPU的总体区别 CPU&#xff1a; 叫做中央处理器&#xff08;central processing unit&#xff09; 可以形象的理解为有25%的ALU(运算单元)、有25%的Control(控制单元)、50%的Cache(缓存单元)…

笔记:transformer系列

1、和其他网络的比较 CNN归纳偏置&#xff08;inductive bias&#xff0c;目标函数的必要假设) 1、平移不变性&#xff1a;平移旋转缩放等变化&#xff0c;CNN依旧能够识别 2、空间局部性&#xff1a;局部像素联系密切&#xff0c;因此每个神经元无需有全局感知&#xff0c;在…

webassembly003 ggml ADAM (暂记)

Adam优化器的工作方式是通过不断更新一阶矩估计和二阶矩估计来自适应地调整学习率&#xff0c;并利用动量法来加速训练过程。这种方式可以在不同的参数更新方向和尺度上进行自适应调整&#xff0c;从而更有效地优化模型。 https://arxiv.org/pdf/1412.6980.pdf 参数 这些参数…

Confluence使用教程(用户篇)

1、如何创建空间 可以把空间理解成一个gitlab仓库&#xff0c;空间之间相互独立&#xff0c;一般建议按照部门&#xff08;小组的人太少&#xff0c;没必要创建空间&#xff09;或者按照项目分别创建空间 2、confluence可以创建两种类型的文档&#xff1a;页面和博文 从内容上来…

开始MySQL之路——MySQL 事务(详解分析)

MySQL 事务概述 MySQL 事务主要用于处理操作量大&#xff0c;复杂度高的数据。比如说&#xff0c;在人员管理系统中&#xff0c;你删除一个人员&#xff0c;你即需要删除人员的基本资料&#xff0c;也要删除和该人员相关的信息&#xff0c;如信箱&#xff0c;文章等等&#xf…