JavaSE简易版扫雷小游戏

描述:用户输入二维雷区的高和宽,输入确定地雷数,随机在地雷区生成地雷。用户输入横竖坐标进行挖雷,挖到地雷游戏以失败结束,并让用户选择是否再次游戏;没挖到雷,显示该区域8个方向地雷数。如果8个方向都没有地雷,即地雷数为0,自动挖开周围区域,如果周围区域挖开后地雷数任为0继续自动挖开周围区域直到地雷数不为0为止。当剩下未挖开区域为地雷即游戏成功结束。

最终实现效果:

 思路

1.用二维数组表示扫雷的区域,其中长宽我们可以自己定义,埋雷的数量也可以自定义,但是为了游戏的可玩性,设计雷数量小于扫雷整个区域格子的34%。

2.因为挖开的格子要显示周围埋雷的数量,所以整个扫雷区域的数组用int类型,并且定义当某个格子为-1时,则为雷。

3.游戏结束的条件---》成功或者失败就会结束游戏。成功的条件为挖开所有安全的格子并且不踩雷,失败的条件为踩雷。踩雷很好判断,即判断选中的格子在二维数组中的值为不为-1,-1则为踩雷。要判断成功的条件,还得定义一个变量表示未挖的格子数,当它为0时即为成功。

4.需要一个布尔型的二维数组表示每个格子是否挖开与否。

具体实现

变量定义:

 private static int[][] mineField;  // 雷区二维数组private static boolean[][] revealed; // 表示每个位置是否被挖开,true表示挖开,false表示未挖开private static int rows;  // 表示行private static int cols; // 表示列private static int mineCount; // 表示雷区总数private static int cellsLeft; // 表示未挖开的安全的格子数

游戏菜单:

 public static void menu(){Scanner scanner = new Scanner(System.in);System.out.println("**************挖地雷游戏开始**************");System.out.print("请输入雷区的高度:");rows = scanner.nextInt();System.out.print("请输入雷区的宽度:");cols = scanner.nextInt();// 计算最大允许的地雷数量int maxMines = (int) (rows * cols * 0.34);System.out.print("请输入地雷数(小于" + maxMines + "个):");mineCount = scanner.nextInt();// 检查地雷数量是否超过限制while (mineCount >= maxMines || mineCount <= 0) {System.out.print("地雷数不能超过最大限制且必须大于0,请重新输入地雷数(小于" + maxMines + "个):");mineCount = scanner.nextInt();}cellsLeft = rows * cols - mineCount;  // 初始化为挖开的安全的格子数System.out.println("地雷已经埋好,挖雷开始!");}

main:

public static void main(String[] args) {Scanner scanner = new Scanner(System.in);boolean playAgain; // 是否再次游戏do {menu();initializeGame();  // 初始化游戏boolean gameLost = false;  // 标识是否踩雷的状态  默认为没有踩雷while (cellsLeft > 0 && !gameLost) {  // 当未挖开的安全格子数大于0 或者 没有踩雷printField(); // 打印图形int x, y;do {System.out.print("请输入挖雷的x坐标(0-" + (rows - 1) + "):");x = scanner.nextInt();System.out.print("请输入挖雷的y坐标(0-" + (cols - 1) + "):");y = scanner.nextInt();if (x < 0 || x >= rows || y < 0 || y >= cols) {System.out.println("输入超出范围,请重新输入!");} else if (revealed[x][y]) {System.out.println("这个位置已经挖过了,请重新输入!");}} while (x < 0 || x >= rows || y < 0 || y >= cols || revealed[x][y]);System.out.println("你挖雷的坐标是("+ x + "," + y + ")!");if (mineField[x][y] == -1) {revealed[x][y] = true;printField();System.out.println("你踩到地雷了!游戏失败!");gameLost = true;} else {revealCell(x, y);  // 递归挖格子}}if (!gameLost) {System.out.println("恭喜你,游戏成功!");}System.out.print("你想再玩一次吗?(输入true继续,输入false结束):");playAgain = scanner.nextBoolean();} while (playAgain);scanner.close();}

初始化游戏:initializeGame(); 方法中包括初始化了扫雷区域二维数组的长宽,以及记录是否被挖开的布尔型数组的长宽。调用placeMines()方法随机设置了地雷。调用calculateNumbers()方法计算每个非地雷格子周围的地雷数。

具体如下:

  private static void initializeGame() {mineField = new int[rows][cols];revealed = new boolean[rows][cols];placeMines();  // 放地雷calculateNumbers(); // 计算每个非地雷格子周围的地雷数}private static void placeMines() {Random random = new Random();int minesPlaced = 0;while (minesPlaced < mineCount) {int x = random.nextInt(rows);int y = random.nextInt(cols);if (mineField[x][y] != -1) {  // 必须要当前格子没有放雷才行,否则重复放入了mineField[x][y] = -1;minesPlaced++;}}}private static void calculateNumbers() {// 遍历整个雷区,对于每个非地雷格子,检查其周围八个方向的格子 --> 如果周围有地雷,则计数并更新该格子的值。for (int x = 0; x < rows; x++) {for (int y = 0; y < cols; y++) {if (mineField[x][y] == -1) continue;int mineCount = 0;for (int dx = -1; dx <= 1; dx++) {for (int dy = -1; dy <= 1; dy++) {int nx = x + dx;int ny = y + dy;if (nx >= 0 && nx < rows && ny >= 0 && ny < cols && mineField[nx][ny] == -1) {mineCount++;}}}mineField[x][y] = mineCount;}}}

其中dx和dy都表示偏移量,表示该格子周围的八个格子。这八个格子中有埋雷的格子就让mineCount++,最终得到该格子的值。

初始化游戏完毕后开始选择要挖的格子,格子的x坐标和y坐标不能超过整个扫雷区域的宽和长,并且不能是挖过的格子,否则重新输入有效的x和y:

 do {System.out.print("请输入挖雷的x坐标(0-" + (rows - 1) + "):");x = scanner.nextInt();System.out.print("请输入挖雷的y坐标(0-" + (cols - 1) + "):");y = scanner.nextInt();if (x < 0 || x >= rows || y < 0 || y >= cols) {System.out.println("输入超出范围,请重新输入!");} else if (revealed[x][y]) {System.out.println("这个位置已经挖过了,请重新输入!");}} while (x < 0 || x >= rows || y < 0 || y >= cols || revealed[x][y]);

输入有效的x和y后,判断当前挖开的格子是否埋雷,即判断 mineField[x][y] == -1,如果为true则游戏失败,如果不为true则递归挖开格子,直到格子周围埋雷数量大于0。

递归挖开格子的方法为:

    private static void revealCell(int x, int y) {if (x < 0 || x >= rows || y < 0 || y >= cols || revealed[x][y]) { // 结束条件return;}revealed[x][y] = true;cellsLeft--;if (mineField[x][y] == 0) {for (int dx = -1; dx <= 1; dx++) {for (int dy = -1; dy <= 1; dy++) {revealCell(x + dx, y + dy);}}}}

打印图形的方法printField():

    private static void printField() {for (int x = 0; x < rows; x++) {for (int y = 0; y < cols; y++) {if (revealed[x][y]) {if (mineField[x][y] == -1) {System.out.print("* ");} else {System.out.print(mineField[x][y] + " ");}} else {System.out.print("\u25A0 ");}}System.out.println();}}

整体代码

import java.util.Random;
import java.util.Scanner;public class Game {private static int[][] mineField;  // 雷区二维数组private static boolean[][] revealed; // 表示每个位置是否被挖开,true表示挖开,false表示未挖开private static int rows;  // 表示行private static int cols; // 表示列private static int mineCount; // 表示雷区总数private static int cellsLeft; // 表示未挖开的安全的格子数public static void main(String[] args) {Scanner scanner = new Scanner(System.in);boolean playAgain; // 是否再次游戏do {menu();initializeGame();  // 初始化游戏boolean gameLost = false;  // 标识是否踩雷的状态  默认为没有踩雷while (cellsLeft > 0 && !gameLost) {  // 当未挖开的安全格子数大于0 或者 没有踩雷printField(); // 打印图形int x, y;do {System.out.print("请输入挖雷的x坐标(0-" + (rows - 1) + "):");x = scanner.nextInt();System.out.print("请输入挖雷的y坐标(0-" + (cols - 1) + "):");y = scanner.nextInt();if (x < 0 || x >= rows || y < 0 || y >= cols) {System.out.println("输入超出范围,请重新输入!");} else if (revealed[x][y]) {System.out.println("这个位置已经挖过了,请重新输入!");}} while (x < 0 || x >= rows || y < 0 || y >= cols || revealed[x][y]);System.out.println("你挖雷的坐标是("+ x + "," + y + ")!");if (mineField[x][y] == -1) {revealed[x][y] = true;printField();System.out.println("你踩到地雷了!游戏失败!");gameLost = true;} else {revealCell(x, y);  // 递归挖格子}}if (!gameLost) {System.out.println("恭喜你,游戏成功!");}System.out.print("你想再玩一次吗?(输入true继续,输入false结束):");playAgain = scanner.nextBoolean();} while (playAgain);scanner.close();}public static void menu(){Scanner scanner = new Scanner(System.in);System.out.println("**************挖地雷游戏开始**************");System.out.print("请输入雷区的高度:");rows = scanner.nextInt();System.out.print("请输入雷区的宽度:");cols = scanner.nextInt();// 计算最大允许的地雷数量int maxMines = (int) (rows * cols * 0.34);System.out.print("请输入地雷数(小于" + maxMines + "个):");mineCount = scanner.nextInt();// 检查地雷数量是否超过限制while (mineCount >= maxMines || mineCount <= 0) {System.out.print("地雷数不能超过最大限制且必须大于0,请重新输入地雷数(小于" + maxMines + "个):");mineCount = scanner.nextInt();}cellsLeft = rows * cols - mineCount;  // 初始化为挖开的安全的格子数System.out.println("地雷已经埋好,挖雷开始!");}// 初始化游戏的方法private static void initializeGame() {mineField = new int[rows][cols];revealed = new boolean[rows][cols];placeMines();  // 放地雷calculateNumbers(); // 计算每个非地雷格子周围的地雷数}private static void placeMines() {Random random = new Random();int minesPlaced = 0;while (minesPlaced < mineCount) {int x = random.nextInt(rows);int y = random.nextInt(cols);if (mineField[x][y] != -1) {  // 必须要当前格子没有放雷才行,否则重复放入了mineField[x][y] = -1;minesPlaced++;}}}private static void calculateNumbers() {// 遍历整个雷区,对于每个非地雷格子,检查其周围八个方向的格子 --> 如果周围有地雷,则计数并更新该格子的值。for (int x = 0; x < rows; x++) {for (int y = 0; y < cols; y++) {if (mineField[x][y] == -1) continue;int mineCount = 0;for (int dx = -1; dx <= 1; dx++) {for (int dy = -1; dy <= 1; dy++) {int nx = x + dx;int ny = y + dy;if (nx >= 0 && nx < rows && ny >= 0 && ny < cols && mineField[nx][ny] == -1) {mineCount++;}}}mineField[x][y] = mineCount;}}}private static void revealCell(int x, int y) {if (x < 0 || x >= rows || y < 0 || y >= cols || revealed[x][y]) { // 结束条件return;}revealed[x][y] = true;cellsLeft--;if (mineField[x][y] == 0) {for (int dx = -1; dx <= 1; dx++) {for (int dy = -1; dy <= 1; dy++) {revealCell(x + dx, y + dy);}}}}private static void printField() {for (int x = 0; x < rows; x++) {for (int y = 0; y < cols; y++) {if (revealed[x][y]) {if (mineField[x][y] == -1) {System.out.print("* ");} else {System.out.print(mineField[x][y] + " ");}} else {System.out.print("\u25A0 ");}}System.out.println();}}
}

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

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

相关文章

uniapp + vue3 + Script Setup 写法变动 (持续更新)

一、uniapp 应用生命周期&#xff1a; https://uniapp.dcloud.net.cn/tutorial/vue3-composition-api.html 注意&#xff1a; 应用生命周期仅可在App.vue中监听&#xff0c;在其它页面监听无效。 二 、uniapp页面生命周期&#xff1a; https://uniapp.dcloud.net.cn/tutori…

Golang | Leetcode Golang题解之第212题单词搜索II

题目&#xff1a; 题解&#xff1a; type Trie struct {children map[byte]*Trieword string }func (t *Trie) Insert(word string) {node : tfor i : range word {ch : word[i]if node.children[ch] nil {node.children[ch] &Trie{children: map[byte]*Trie{}}}nod…

Zynq系列FPGA实现SDI视频编解码,基于GTX高速接口,提供5套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案在Xilinx--Kintex系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGB图像缓存视频读取控制HDMI输出RGB转BT1120Gv8500 驱…

vuepress使用简介及个人博客搭建

目录 一、介绍二、环境准备三、安装运行vuepress四、目录结构五、配置文件六、导航栏配置七、导航栏logo八、浏览器图标九、侧边栏配置十、添加 Git 仓库和编辑链接十一、部署到GitHub十二、搭建成功 一、介绍 VuePress 是 Vuejs 官方提供的一个是Vue驱动的静态网站生成器&…

Qt 配置ASan

Qt 配置ASan 文章目录 Qt 配置ASan摘要关于ASan&#xff08;AddressSanitizer&#xff09;在Qt中配置 ASan1. 安装必要的工具2. 修改项目的 .pro 文件3. 重新构建项目4. 运行应用程序5. 分析错误报告示例注意事项 关键字&#xff1a; Qt、 ASan、 AddressSanitizer 、 GCC …

CTFHUB-SSRF-Redis协议

本题需要用到&#xff1a; 在线编码网址&#xff1a;https://icyberchef.com/ gopherus工具&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/139440201 开启题目&#xff0c;页面空白 和上一个题FastCGI协议一样&#xff0c;还是使用gopherus攻击redis ./gopheru…

vlan基础相关

7.2以太网交换基础 数据链路层也叫2层网络&#xff0c;用的是Mac地址&#xff0c;想到Mac地址就要想到交换机。 以太网协议&#xff08;LAN&#xff09;以太网是建立在CSMA/CD载波监听多路访问/冲突检测&#xff0c;机制上的广播型网络。CSMA工作原理是先监听&#xff0c;在介…

110kV以下变电所电力监控-安科瑞电力监控解决方案

一、系统介绍 变电站电力监控系统为110kV及以下用户变电站提供了完整的SCADA功能。 二、系统硬件 AM5SE系列微机保护装置 全电参量测量 谐波制动独立操作回路 可编程出口矩阵&#xff1b;定制化的逻辑设计&#xff1b;故障录波&#xff1b;事件记录、故障 录波数据&#x…

聊天交友系统开发专业语聊交友app开发搭建同城交友开发婚恋交友系统相亲app开发

1、上麦相亲互动:直播间内除了红娘外&#xff0c;还有男女用户两个视频麦位&#xff0c;直播间符合要求的用户可以申请上麦 2、公屏聊天:为上麦用户可以通过在公屏发言的方式参与直播间内的话题互动。 3、私信,异性用户之间可以发送私信消息&#xff0c;通过付费或开通会员可解…

法国工程师IMT联盟 密码学及其应用 2023年期末考试补考题

1 JAVA 安全 1.1 问题1 1.1.1 问题 用 2 或 3 句话解释 Java 执行模型&#xff08;Java 虚拟机machine virtuelle Java)&#xff09;中引入introduit沙箱bac sable机制 mcanisme d’excution par isolation的目的。 1.1.2 问题解释 在 Java 执行模型&#xff08;Java 虚拟机…

Java面试八股文

一、Redis 1. 使用场景 &#xff08;1&#xff09;Redis的数据持久化策略有哪些 RDB&#xff1a;全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫作Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故…

【信息系统项目管理师】18年~23年案例概念型知识

文章目录 18上18下19上19下20上20下21上21下22年上22年下23年上 18上 请简述 ISO 9000 质量管理的原则 领导作用、 过程方法、 管理的系统方法、 与供方互利的关系、 基于事实的决策方法、 持续改进、 全员参与、 以顾客为关注焦点 概念 国家标准(GB/T 1 9000 2008)对质量的定…

嵌入式c语言2——预处理

在c语言中&#xff0c;头部内容&#xff0c;如include与define是不参与编译而直接预先处理的 如include相当于把头文件扩展&#xff0c;define相当于做了替换 c语言大型工程创建时&#xff0c;会有调试版本与发行版本&#xff0c;发行时不希望看到调试部分内容&#xff0c;此时…

基于多视点编码光场的全景三维重建方法

欢迎关注GZH《光场视觉》 摘要&#xff1a;在基于光场的一系列应用中&#xff0c;目标的三维重建是基础且关键的任务。普通光场只能重建单一视角而无法重建全景&#xff0c;并且在纹理特征匮乏的区域也无法生成准确的三维信息。针对以上问题&#xff0c;提出一种基于多视点编码…

存算一体架构或成为AI处理器技术发展关键

©作者|坚果 来源|神州问学 引言 马斯克巨资60亿美元打造的“超级算力工场”&#xff0c;通过串联10万块顶级NVIDIA H100 GPU&#xff0c;不仅震撼了AI和半导体行业&#xff0c;促使英伟达股价应声上涨6%&#xff0c;还强烈暗示了AI大模型及芯片需求的急剧膨胀。这一行动…

数字化精益生产系统--RD研发管理系统

R&D研发管理系统是一种用于管理和监督科学研究和技术开发的软件系统&#xff0c;其设计和应用旨在提高企业研发活动的效率、质量和速度。以下是对R&D研发管理系统的功能设计&#xff1a;

电力授时设备常用:低功耗定位授时模块ATGM332D-5T

ATGM332D有5N微星定位模块系列和5T授时模块&#xff0c;其中我们今天要解读的是一款拥有高性能、低功耗、低成本优势且适用于各类授时设备并支持BDS/GNSS的定位授时模块ATGM332D-5T。 该系列模块产品是基于中科微第四代低功耗GNSS SOC单芯片—AT6558&#xff0c;支持多种微星导…

PyCharm远程开发

PyCharm远程开发 1- 远程环境说明 每个人的本地电脑环境差别很大。各自在自己电脑上开发功能&#xff0c;测试/运行正常。但是将多个人的代码功能合并&#xff0c;运行服务器上&#xff0c;会出现各种版本兼容性问题。 在实际企业中&#xff0c;一般会有两套环境。第一套是测…

中小企业如何防止被查盗

在当前的商业环境中&#xff0c;小企业面临诸多挑战&#xff0c;其中之一便是如何在有限的预算内满足日常运营的技术需求。由于正版软件的高昂成本&#xff0c;一些小企业可能会选择使用盗版软件来降低成本。 我们联网之后存在很多风险&#xff0c;你可以打开自己的可以联网的电…

Spring boot 更改启动LOGO

在resources目录下创建banner.txt文件&#xff0c;然后编辑对应的图案即可 注释工具 Spring Boot Version: ${spring-boot.version},-.___,---.__ /|\ __,---,___,- \ -.____,- | -.____,- // -., | ~\ /~ | …