扫雷游戏踩雷后如何实现最后一次地图渲染循环
扫雷游戏踩雷后如何实现最后一次地图渲染循环
嘿,我懂你的烦恼——现在你把地图渲染的代码写了两遍(循环里一次,踩雷后又一次),不仅冗余,以后要是想修改地图的显示样式(比如换个符号、调整格式),还得改两处,太麻烦了。咱们可以把地图渲染的逻辑抽成一个独立的方法,这样不管是正常循环里的渲染,还是踩雷后的最终渲染,都直接调用这个方法就行,彻底解决重复代码的问题!
具体修改步骤:
- 提取渲染方法:把原来的地图渲染代码抽成一个名为
printMap的方法,需要传入地图数组、字母数组和地图尺寸这几个必要参数。 - 替换重复代码:把do-while循环里的渲染代码,以及踩雷后的渲染代码,都替换成调用这个
printMap方法。 - 可选优化:还可以把百分比计算和状态提示的部分也抽成方法,让代码结构更清晰。
修改后的完整代码示例:
import java.util.Random; import java.util.Scanner; public class Minesweeper { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Random r = new Random(); int mapSize = 10; int[][] map = new int[mapSize][mapSize]; char[] ABC = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}; boolean boom = false; boolean validInput; int fields = 0; int mineCount = 0; // 初始化地图和地雷数量 for (int i = 0; i < mapSize; i++) { for (int j = 0; j < mapSize; j++) { map[i][j] = r.nextInt(-3, 1); if (map[i][j] == 0) { mineCount++; } } } int totalFields = (mapSize * mapSize) - mineCount; do { // 调用渲染方法 printMap(map, ABC, mapSize); // 计算并显示进度 printProgress(fields, totalFields, mineCount); // 处理用户输入 validInput = false; int x = -1, y = -1; while (!validInput) { System.out.println("Wo willst du nach Minen suchen? (z.B. A1 bis J9)"); String inputUser = sc.next().toUpperCase(); if (inputUser.length() == 2 && inputUser.charAt(0) >= 'A' && inputUser.charAt(0) <= 'J' && inputUser.charAt(1) >= '0' && inputUser.charAt(1) <= '9') { x = inputUser.charAt(0) - 'A'; y = inputUser.charAt(1) - '0'; validInput = true; } else { System.out.println("Ungültige Eingabe! Bitte in der Form 'A1' bis 'J9' eingeben."); } } // 处理用户选择的格子 if (map[y][x] == 0) { map[y][x] = 5; mineCount--; boom = true; } else if (map[y][x] < 0) { map[y][x] = 2; fields++; } else { System.out.println("Dieses Feld wurde bereits überprüft. Wähle ein anderes."); } // 踩雷后的处理 if (boom) { // 再次调用渲染方法显示最终地图 printMap(map, ABC, mapSize); System.out.println("\nDas... war eine Mine. Du hast leider verloren."); } } while (!boom); sc.close(); } // 提取的地图渲染方法 private static void printMap(int[][] map, char[] ABC, int mapSize) { System.out.print("\t"); for (char letter : ABC) { System.out.printf("%2c\t", letter); } System.out.println(); for (int i = 0; i < mapSize; i++) { System.out.printf("%d\t", i); for (int j = 0; j < mapSize; j++) { if (map[i][j] == 5) { System.out.print("[*]\t"); } else if (map[i][j] == 2) { System.out.print("[-]\t"); } else { System.out.print("[ ]\t"); } } System.out.println(); } } // 提取的进度显示方法(可选优化) private static void printProgress(int fields, int totalFields, int mineCount) { double percentChecked; if (totalFields > 0) { percentChecked = ((fields / (double) totalFields) * 100); } else { percentChecked = 100; } String result = String.format("%.2f", percentChecked); System.out.println("\nDu hast " + fields + "/" + totalFields + " (" + result + "%) der sicheren Felder überprüft."); System.out.println("Es bleiben noch " + mineCount + " Minen versteckt."); } }
这样修改的好处:
- 代码复用:渲染逻辑只写一次,避免重复冗余
- 易于维护:以后要修改地图的显示样式(比如把
[*]改成💣),只需要修改printMap方法里的代码就行 - 结构清晰:把不同功能的代码拆分到不同方法里,主逻辑更易读
备注:内容来源于stack exchange,提问作者steph_mng
相关产品推荐
相关产品推荐

