You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

扫雷游戏踩雷后如何实现最后一次地图渲染循环

扫雷游戏踩雷后如何实现最后一次地图渲染循环

嘿,我懂你的烦恼——现在你把地图渲染的代码写了两遍(循环里一次,踩雷后又一次),不仅冗余,以后要是想修改地图的显示样式(比如换个符号、调整格式),还得改两处,太麻烦了。咱们可以把地图渲染的逻辑抽成一个独立的方法,这样不管是正常循环里的渲染,还是踩雷后的最终渲染,都直接调用这个方法就行,彻底解决重复代码的问题!

具体修改步骤:

  1. 提取渲染方法:把原来的地图渲染代码抽成一个名为printMap的方法,需要传入地图数组、字母数组和地图尺寸这几个必要参数。
  2. 替换重复代码:把do-while循环里的渲染代码,以及踩雷后的渲染代码,都替换成调用这个printMap方法。
  3. 可选优化:还可以把百分比计算和状态提示的部分也抽成方法,让代码结构更清晰。

修改后的完整代码示例:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:09:34