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

Java中打印char数组到控制台时能否隐藏指定索引位置的元素?

Java 战舰(Battleship)小游戏隐藏字符实现方案

你可以通过数据层和展示层分离的逻辑实现需求,这种方式逻辑清晰,新手也容易调试,不会出现真实值意外泄露的问题。

核心实现思路

  • 维护两个独立的char数组:
    • 第一个是后台真实数据数组:存储你生成的随机战舰字符、空白位字符,所有命中/未命中的逻辑判断完全基于这个数组操作
    • 第二个是前端展示数组:初始化时全部填充统一的掩码字符合,比如~或者*,打印到控制台的内容完全从这个数组取,用户永远看不到真实数组的内容
  • 当用户输入坐标发起攻击时,先校验坐标合法性,再去真实数组对应索引取值判定:
    • 如果命中战舰:把展示数组对应索引位置替换为X这类表示命中的标识
    • 如果未命中:把展示数组对应索引位置替换为O这类表示 miss 的标识

示例代码片段

public class BattleshipGame {
    // 示例用10*10的棋盘,可根据需求调整尺寸
    private static final int BOARD_SIZE = 10;
    // 存储真实数据的数组,不对外展示
    private char[][] realBoard = new char[BOARD_SIZE][BOARD_SIZE];
    // 对外展示的数组,打印给用户看
    private char[][] displayBoard = new char[BOARD_SIZE][BOARD_SIZE];

    // 初始化棋盘
    public void initBoard() {
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                // 展示数组默认全部填充掩码
                displayBoard[i][j] = '~';
                // 真实数组默认填充空白标识
                realBoard[i][j] = ' ';
            }
        }
        // 给真实数组指定位置填充随机战舰字符,示例直接写死坐标,可自行替换为随机生成逻辑
        realBoard[2][3] = 'S';
        realBoard[5][7] = 'S';
        realBoard[7][1] = 'S';
    }

    // 打印展示棋盘给用户
    public void printDisplayBoard() {
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                System.out.print(displayBoard[i][j] + " ");
            }
            System.out.println();
        }
    }

    // 攻击判定逻辑
    public boolean attack(int x, int y) {
        if (x < 0 || x >= BOARD_SIZE || y <0 || y >= BOARD_SIZE) {
            System.out.println("坐标非法,请输入棋盘范围内的坐标");
            return false;
        }
        if (realBoard[x][y] == 'S') {
            System.out.println("命中!");
            displayBoard[x][y] = 'X';
            return true;
        } else {
            System.out.println("未命中");
            displayBoard[x][y] = 'O';
            return false;
        }
    }
}

补充说明

如果不想维护两个数组,也可以给真实数组的字符加状态标记,比如用ASCII码高位做隐藏标记,打印的时候判断标记位决定输出掩码还是真实字符,但这种方案可读性和可维护性都比较差,新手优先推荐双数组的实现方式。

内容的提问来源于stack exchange,提问作者abdulla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:57:05