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
相关产品推荐
相关产品推荐

