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

扫雷游戏的功能说明

  • 使⽤控制台实现经典的扫雷游戏
  •  游戏可以通过菜单实现继续玩或者退出游戏
  • 扫雷的棋盘是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,一经查实,立即删除!

相关文章

CSS--样式穿透

样式穿透具体可分为css、less以及scss&#xff0c;语法不同&#xff0c;具体语法如下所示。 css样式穿透&#xff1a; <style scoped>父元素 >>> 子元素 {color: red;} </style> less样式穿透&#xff1a; <style lang"less" scoped>父…

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免费防火…

myql入门

目录 安装修改密码学习资料个人git仓库文章视频官网 安装 #移除以前的mysql相关 sudo apt remove --purge mysql-\* #安装mysql sudo apt install mysql-server mysql-client #查看是否启动 systemctl status mysql #手动启动 systemctl start mysql #查看mysql版本 mysql --v…

(Unity)C#的预处理器指令和条件编译符号

C#的预处理器指令 预处理指令主要用于控制编译器的编译过程。它们在编译时被处理&#xff0c;而不是在运行时。这意味着预处理指令可以用来使编译器只编译满足特定条件的代码&#xff0c;或者在编译时输出特定的警告或错误。 #define&#xff1a;定义一个符号。#undef&#xff…

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

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

常见的持久层框架包括

常见的持久层框架包括&#xff1a; Hibernate&#xff1a;Hibernate是Java的关系数据库持久化框架&#xff0c;通过对象关系映射&#xff08;ORM&#xff09;将对象和关系数据库进行映射。Hibernate提供了丰富的功能和灵活的查询语言&#xff0c;适用于复杂的数据模型和关系查询…

一些常用的数据备份脚本

Elasticsearch备份 #!/bin/shtodaydate %Y%m%dcurl --location --request PUT http://localhost:22063/_snapshot/es_bak --header Content-Type: application/json --data-raw {"type": "fs","settings":{"compress": true,"lo…

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

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

tdesign的使用记录

1、复杂表单校验 复杂类型的数据&#xff08;两级数组&#xff09; const dataForm ref({configTalkTemplateProblemCoList: [{"id":"1744302859557920769","templateId":"1744302859511783426","parentId":null,"l…

大创项目推荐 题目:基于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;因此它更加高效…

P9389 [THUPC 2023 决赛] 烂柯杯 题解

目录 题目背景题目描述输入格式输出格式提示提示题目来源 题目思路AC 代码 题目背景 却说庞统迤逦前进&#xff0c;抬头见两山逼窄&#xff0c;树木丛杂&#xff1b;又值夏末秋初&#xff0c;枝叶茂盛。庞统心下甚疑&#xff0c;勒住马问&#xff1a;“此处是何地&#xff1f;…

问题解决:使用el-upload组件获取File文件,不需要文件上传,action为空会请求本地路径报404

可以自定义上传方法、覆盖默认的上传行为 主要是这个属性 :http-request"uploadFn" <template><span><el-uploadaction"#":on-preview"handlePreview":on-remove"handleRemove":before-remove"beforeRemove"…

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

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

代码随想录算法训练营打卡day1 |704. 二分查找,27. 移除元素

一、LeetCode 704 二分查找 题目链接&#xff1a;704.二分查找 解法一&#xff1a;左闭右闭 class Solution {public int search(int[] nums, int target) {int left 0, right nums.length-1;while(left < right){ //边界处理&#xff0c;左闭右闭int mid left (right-l…

使用bat批量修改文件名

批处理脚本的目的是将指定文件夹中的所有 .mp3 文件的文件名中的数字部分补零成四位&#xff0c;并将文件重命名为新的文件名。以下是脚本的详细解释&#xff1a; echo off: 这个命令用于关闭命令回显&#xff0c;即在脚本运行时不在命令提示符窗口上显示执行的命令。 setloca…

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

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

THM学习笔记——网络工具

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