扫雷游戏——数组和函数实现

扫雷游戏的功能说明

  • 使⽤控制台实现经典的扫雷游戏
  •  游戏可以通过菜单实现继续玩或者退出游戏
  • 扫雷的棋盘是9*9的格⼦
  •  默认随机布置10个雷
  • 可以排查雷
  • 如果位置不是雷,就显⽰周围有⼏个雷
  • 如果位置是雷,就炸死游戏结束
  • 把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束

简单介绍:在一个9*9的格子中,随机种10个雷。如果这个地方放置雷,就存放1,不是雷就存放0。通过输入坐标来排除雷 。

主体框架:我创建了3个文件,一个专门用来声明函数的头文件game.h、一个用来进行游戏数据的game.c和一个主体逻辑的saolei.c这三个文件。

棋盘:

这里出现了一个问题,假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数是1。
假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个⻩⾊位置,统计周围雷的个数时,最下⾯的三个坐标就会越界,为了防⽌越界,我们在设计的时候,给数组扩⼤⼀圈,雷还是布置在中间的9*9的坐标上,周围⼀圈不去布置雷就⾏,这样就解决了越界的问题。所以我们将存放数据的数组创建成11*11是⽐较合适。

所以我创建了两个二维数组分别是mine和show。show数组显示棋盘,mine数组用来埋雷和统计周围雷的个数,同时将雷的个数传到show数组上面记录。

saolei.c文件

这个文件我用来编写游戏的主要框架。在main()函数中引入一个自定义函数text(),text()用来是否进行游戏,进入游戏就输入1,退出游戏就输入0,输入其他数字就提示重新选择。假如要进行多次游戏,这里我就采用了以do while循环。

void test()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch(input){case 1:game();break;case 0:printf("游戏结束,退出游戏\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);
}

那么我们输入1呢,就开始进行游戏了。首先是创建了两个字符二维数组mine和show,这两个数组都是11*11的,避免之后在9*9的棋盘中出现越界的情况。之后就是对这两个数组进行初始化。我创建了一个专门用来初始化棋盘的函数InitBoard。因为要对mine和show数组都要初始化,所以这个函数要传递4个参数,分别要传递数组,行和列、要初始化的值。注意传参时要一一对应。

void InitBoard(char arr[ROWS][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++){arr[i][j] = set;}}
}

接下来就是埋雷了,这里创建一个SetMine()函数,注意雷是在mine数组9*9上埋的。SetMine()函数传递3个参数,mine数组 行ROW和列COL。扫雷的精髓就是随机埋雷。这里就用到了上一次在猜数字游戏中讲到的rand和srand函数。不了解的可以去了解一下。当你输入的坐标不是雷(‘0’)就可以在这个位置上埋雷,埋上一个雷,雷的数量就减1,直到减为0,这里用一个while循环。

void SetMine(char arr[ROWS][COLS], int row, int col)
{int count = EASY;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (arr[x][y] == '0'){arr[x][y] = '1';count--;}}
}

打印棋盘:创建一个DisplayBoard函数用来打印棋盘(打印的是show,你也不想让你埋的雷可以看见吧)。打印棋盘是为了方面后面输入坐标,可以先把坐标轴先打印出来。打印的棋盘是9*9的。

void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{printf("-----扫雷开始-----\n");int i = 0;//打印列for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){int j = 0;printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", arr[i][j]);}printf("\n");}
}

接下来就是排雷了。创建了一个FindMine()函数,这个函数要传递4个参数,分别是mine,show,ROW和COL。排雷的时候要注意输入坐标的有效性,要保证坐标在9*9的棋盘中有效。当这个坐标不是雷的时候,我们还要统计这个坐标周围一圈有多少个雷,并传递给show数组上显示出来。还要注意这个坐标是否被排查过了。当所有非雷坐标都被排查过了,那么你就胜利了。

void FindMine(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-EASY){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");break;}else{//找出周围有几个雷int count = GetMine(mine, x, y);//数字转字符show[x][y] = count + '0';DisplayBoard(show, ROW, COL);win++;}}else{printf("该坐标已经被排查了\n");}}else{printf("坐标非法,请重新输入坐标\n");}}if (win == row * col - EASY){printf("恭喜你,胜利了!\n");}
}

那么呈上扫雷游戏的全部代码:

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 10//初始化棋盘
void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set);//打印棋盘
void DisplayBoard(char arr[ROWS][COLS], int row, int col);//布置雷
void SetMine(char arr[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 1//游戏数据
#include "game.h"void InitBoard(char arr[ROWS][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++){arr[i][j] = set;}}
}void DisplayBoard(char arr[ROWS][COLS], int row, int col)
{printf("-----扫雷开始-----\n");int i = 0;//打印列for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){int j = 0;printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", arr[i][j]);}printf("\n");}
}void SetMine(char arr[ROWS][COLS], int row, int col)
{int count = EASY;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (arr[x][y] == '0'){arr[x][y] = '1';count--;}}
}void FindMine(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-EASY){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");break;}else{//找出周围有几个雷int count = GetMine(mine, x, y);//数字转字符show[x][y] = count + '0';DisplayBoard(show, ROW, COL);win++;}}else{printf("该坐标已经被排查了\n");}}else{printf("坐标非法,请重新输入坐标\n");}}if (win == row * col - EASY){printf("恭喜你,胜利了!\n");}
}int GetMine(char mine[ROWS][COLS], int x, int y)
{int i = 0;int count = 0;for (i = x - 1; i <= x + 1; i++){int j = 0;for (j = y - 1; j <= y + 1; j++){//字符转数字count += (mine[i][j] - '0');}}return count;
}

saolei.c:

#define _CRT_SECURE_NO_WARNINGS 1#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 };//初始化棋盘InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');//布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//打印棋盘DisplayBoard(show, ROW, COL);//排雷FindMine(mine, show, ROW, COL);}void test()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch(input){case 1:game();break;case 0:printf("游戏结束,退出游戏\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);
}int main()
{test();return 0;
}

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

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

相关文章

HFSS实战(三)——过孔via TDR仿真

文章目录 一、模型的处理二、TDR仿真2.1 修改求解模式2.2增加求解设置 三、查看仿真结果3.1 查看TDR结果3.2 查看S参数结果 四、结果分析4.1上升时间tr对仿真的影响 附&#xff1a;工程链接 在上一讲中&#xff0c;主要是通过观察S参数确定via的优化是否达到目标。但S参数只能看…

k8s 安全机制

k8s的安全机制&#xff1a; 核心&#xff1a;分布式集群管理工具&#xff0c;就是容器编排&#xff0c;安全机制的核心&#xff1a;API server 作为整个集群内部通信的中介&#xff0c;也是外控控制的入口。实验的安全机制都是围绕api server来进行设计&#xff1a; 请求api资…

利用nginx宝塔免费防火墙实现禁止国外IP访问网站

本章教程&#xff0c;主要介绍&#xff0c;如何利用nginx宝塔面板中的插件免费防火墙&#xff0c;实现一键禁止国外IP访问网站。 目录 一、安装宝塔插件 二、 开启防火墙 一、安装宝塔插件 在宝塔面板中的软件商店&#xff0c;搜索防火墙关键词&#xff0c;找到Nginx免费防火…

在线教育系统开发:构建现代化学习平台

随着科技的迅速发展&#xff0c;在线教育系统在教育领域扮演着越来越重要的角色。本文将深入探讨在线教育系统的开发过程&#xff0c;涉及关键技术和代码实现。 技术选型 在开始开发之前&#xff0c;我们首先需要选择适合在线教育系统的技术栈。以下是一些常见的技术选项&am…

代码随想录算法训练营29期|day31 任务以及具体安排

理论基础 关于贪心算法&#xff0c;你该了解这些&#xff01; 题目分类大纲如下&#xff1a; #算法公开课 《代码随想录》算法视频公开课 (opens new window)&#xff1a;贪心算法理论基础&#xff01; (opens new window),相信结合视频再看本篇题解&#xff0c;更有助于大家…

大创项目推荐 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测

文章目录 0 简介1 基于 Keras 用 LSTM 网络做时间序列预测2 长短记忆网络3 LSTM 网络结构和原理3.1 LSTM核心思想3.2 遗忘门3.3 输入门3.4 输出门 4 基于LSTM的天气预测4.1 数据集4.2 预测示例 5 基于LSTM的股票价格预测5.1 数据集5.2 实现代码 6 lstm 预测航空旅客数目数据集预…

IO多路复用-epoll

IO多路复用-epoll 1. 概述 epoll 全称 eventpoll&#xff0c;是 linux 内核实现IO多路转接/复用&#xff08;IO multiplexing&#xff09;的一个实现。 epoll是select和poll的升级版&#xff0c;相较于这两个前辈&#xff0c;epoll改进了工作方式&#xff0c;因此它更加高效…

WorkPlus AI智能客服解决方案,提升企业服务质量

在当今竞争激烈的商业环境中&#xff0c;提供卓越的客户服务成为企业赢得市场竞争的关键。而AI智能客服技术的不断发展&#xff0c;则成为了提高服务效率和满意度的利器。作为一款领先的AI助理解决方案&#xff0c;WorkPlus AI助理以其出色的性能和智能化的功能&#xff0c;助力…

c++入门学习(十八)赋值运算符

简单赋值运算符&#xff08;&#xff09;&#xff1a; 最基本的赋值运算符是“”。它表示将右侧的值赋给左侧的变量。例如&#xff0c;x 5意味着将值5赋给变量x。 增量赋值运算符&#xff1a; 这是一组在赋值的同时对变量进行递增操作的运算符。常见的有、-、*、/等。例如&…

THM学习笔记——网络工具

ping 当我们想要测试是否可以连接到远程资源时&#xff0c;会使用 ping 命令。 ping 的基本语法&#xff1a; ping <target>。 测试是否可以与百度建立网络连接&#xff1a; traceroute 互联网由许多个不同的服务器和端点组成&#xff0c;它们都相互联网。这意味着&a…

Soul CEO张璐团队布局AIGC领域,打造数智化社交新体验

作为互联网社交领域的领军企业,Soul App近日再次受到广泛关注,因其在生成式人工智能(AIGC)领域的前沿布局和创新。随着数据积累、算力提升和算法不断迭代,AIGC技术正逐渐成为推动产业创新的重要工具之一。2023年被誉为AIGC元年,而Soul App在CEO张璐的带领下,在这个领域的不懈努…

计算CNN卷积层和全连接层的参数量

计算CNN卷积层和全连接层的参数量 先前阅读 CNN ExplainerA Comprehensive Guide to Convolutional Neural Networks — the ELI5 way 本文主旨意在搞明白2个问题&#xff1a; 第一个问题 一个卷积操作&#xff0c;他的参数&#xff0c;也就是我们要训练的参数&#xff0c;也…

Navigation 2 学习01 介绍及安装及运行示例

Navigation 2 是什么 Nav2 是 ROS 导航 的综合控制服务&#xff0c;类似人类的小脑控制人类的行走及身体平衡&#xff0c;Nav2 针对移动和地面机器人提供支持的自动驾驶车辆的相同类型的技术&#xff0c;经过优化和改造。该项目旨在找到一种安全的方法&#xff0c;使移动机器人…

nginx离线部署-aarch64架构

nginx离线部署-aarch64架构 服务器环境: 架构&#xff1a;aarch64&#xff0c; 系统&#xff1a;Red Hat &#xff08;CentOS 7&#xff09; nginx 1.24 需要准备这些&#xff1a; 可以先尝试安装 Nginx 安装NGINX 内网是没有网络的需要使用 RPM 包安装 gcc&#xff0c; g…

绘制太极图 - 使用 PyQt

大家好&#xff01;今天我们将一起来探讨一下如何使用PyQt&#xff0c;这是一个强大的Python库&#xff0c;来绘制一个传统的太极图。这个图案代表着古老的阴阳哲学&#xff0c;而我们的代码将以大白话的方式向你揭示它的奥秘。 PyQt&#xff1a;是什么鬼&#xff1f; 首先&a…

架构师之路(十六)计算机网络(传输层)

前置知识&#xff08;了解&#xff09;&#xff1a;计算机基础。 作为架构师&#xff0c;我们所设计的系统很少为单机系统&#xff0c;因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 既然网络层已经…

.net访问oracle数据库性能问题

问题&#xff1a; 生产环境相同的inser语句在别的非.NET程序相应明显快于.NET程序&#xff0c;执行时间相差比较大&#xff0c;影响正常业务运行&#xff0c;测试环境反而正常。 问题详细诊断过程 问题初步判断诊断过程&#xff1a; 查询插入慢的sql_id 检查对应的执行计划…

直播间流程解析基础

通过用户心理需求引导用户行为 贯穿内容和产品牵引想要和需要 直播间内流程解析 分为播前准备、开播暖场、产品介绍、穿插活动、结尾预告 &#xff08;1&#xff09;直播间内流程解析----播前准备 &#xff08;2&#xff09;直播间内流程解析----开播暖场 &#xff08;3&…

互联网加竞赛 基于机器视觉的银行卡识别系统 - opencv python

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的银行卡识别算法设计 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng…

电涌保护器(SPD)、后备保护器(SCB)、断路器(CB)的区别与应用

随着现代电力系统的不断发展&#xff0c;电力设备的保护显得愈发重要。其中&#xff0c;电涌保护器&#xff08;SPD&#xff09;、后备保护器&#xff08;SCB&#xff09;和断路器&#xff08;CB&#xff09;是三种常见的保护设备&#xff0c;但它们各自具有不同的功能和特点。…