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.pswp.cn/web/38556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38556.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安徽大學學報-哲學社會科學版

《安徽大學學報》&#xff08;哲學社會科學版&#xff09;簡介 安徽大學學報&#xff08;哲學社會科學版&#xff09;簡要信息 刊 號 CN 34—1040/C ISSN 1001—5019 主 編 張治棟 地 址 安徽省合肥市肥西路3號 郵 編 230039 電 話 &#xff08;0551&#xff09;6…

Spring MVC的高級功能——異常處理(三)異常處理注解

一、ControllerAdvice注解的作用 從Spring 3.2開始&#xff0c;Spring 提供了一個新注解ControllerAdvice&#xff0c; ControllerAdvice有以下兩個作用。 ? 注解作用在類上時可以增強Controller&#xff0c;對Controller中被RequestMapping注解標注的方法加一些邏輯處理。…

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…

C語言 輸出所有的水仙花數

輸出所有的“水仙花數”&#xff08;水仙花數指一個三位數&#xff0c;其各位數字立方和等于該數本身。例如153是水仙花數&#xff0c;因為1^35^33^3153&#xff09; 這個程序找出所有的三位水仙花數&#xff0c;并輸出它們。 &#xff08;如果每各數字立方和等于原數字&…

Java SE入門及基礎(62) 線程池 執行器

線程池 1. 執行器 In all of the previous examples, theres a close connection between the task being done by a new thread, as defined by its Runnable object, and the thread itself, as defined by a Thread object. This works well for small applications, but…

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…

Oracle PL / SQL 插入insert 第二部分

DUAL表 dual是由具有一列和一行的oracle數據庫&#xff08;所有者SYS&#xff09;擁有的表。 要評估1 1的添加&#xff0c;請執行以下SQl SELECT語句&#xff1a; SELECT 1 1 FROM dual; 快速找出oracle如何評估你對內置函數length&#xff08;&#xff09;的使用。 SELE…

vlan基礎相關

7.2以太網交換基礎 數據鏈路層也叫2層網絡&#xff0c;用的是Mac地址&#xff0c;想到Mac地址就要想到交換機。 以太網協議&#xff08;LAN&#xff09;以太網是建立在CSMA/CD載波監聽多路訪問/沖突檢測&#xff0c;機制上的廣播型網絡。CSMA工作原理是先監聽&#xff0c;在介…

110kV以下變電所電力監控-安科瑞電力監控解決方案

一、系統介紹 變電站電力監控系統為110kV及以下用戶變電站提供了完整的SCADA功能。 二、系統硬件 AM5SE系列微機保護裝置 全電參量測量 諧波制動獨立操作回路 可編程出口矩陣&#xff1b;定制化的邏輯設計&#xff1b;故障錄波&#xff1b;事件記錄、故障 錄波數據&#x…

在UniApp中使用Three.js渲染3D模型

在移動應用開發中,3D渲染正變得越來越普遍。本文將介紹如何在UniApp框架中集成Three.js庫來渲染3D模型,為您的應用增添引人注目的視覺效果。 1. 簡介 UniApp是一個跨平臺開發框架,允許開發者使用Vue.js開發一次,就能發布到iOS、Android、Web等多個平臺。Three.js則是一個強大…

3099. 哈沙德數 Easy

如果一個整數能夠被其各個數位上的數字之和整除&#xff0c;則稱之為 哈沙德數&#xff08;Harshad number&#xff09;。給你一個整數 x 。如果 x 是 哈沙德數 &#xff0c;則返回 x 各個數位上的數字之和&#xff0c;否則&#xff0c;返回 -1 。 示例 1&#xff1a; 輸入&a…

高內聚低耦合舉個例子詳細介紹

學習目標&#xff1a; 高內聚低耦合舉個例子詳細介紹 學習內容&#xff1a; 高內聚和低耦合是軟件設計中的兩個重要原則&#xff0c;旨在提高系統的可維護性、可擴展性和靈活性。下面我們通過一個例子詳細介紹高內聚和低耦合的概念及其實現方法。 例子&#xff1a;在線購物系…

聊天交友系統開發專業語聊交友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 虛擬機…

知識見聞 - 什么是SAT求解器

SAT求解器&#xff08;SAT solver&#xff0c;布爾可滿足性問題求解器&#xff09;是一種計算工具&#xff0c;用于確定是否存在一個變量賦值&#xff0c;使給定的布爾公式為真。布爾可滿足性問題是計算理論中的一個重要問題&#xff0c;通常用來解決邏輯推理、驗證和優化問題。…

Java面試八股文

一、Redis 1. 使用場景 &#xff08;1&#xff09;Redis的數據持久化策略有哪些 RDB&#xff1a;全稱Redis Database Backup file&#xff08;Redis數據備份文件&#xff09;&#xff0c;也被叫作Redis數據快照。簡單來說就是把內存中的所有數據都記錄到磁盤中。當Redis實例故…