Java开发Bingo程序时如何保存二维数组bingoCard保持数据固定
问题根源
你每次调用生成方法都拿到新卡片,核心问题出在两处:
- 方法内部每次执行都会跑
bingoCard = new int[numRows][numCols];,直接把全局静态数组的引用指向刚创建的空数组,之前生成的卡片内容直接被覆盖丢弃 - 没有做生成状态判断,不管之前有没有生成过可用卡片,每次调用都会从头走一遍随机数生成逻辑,自然每次结果都不一样。
修复方法
核心逻辑是仅在卡片从未生成过时执行一次随机生成流程,后续所有调用直接返回已经生成好的固定卡片,不要重复创建数组、重复跑随机逻辑。
修改后的可直接用的代码如下:
import java.util.Arrays; import java.util.Random; // 全局静态数组保留原定义即可 private static int[][] bingoCard = new int[3][9]; public static int[][] bingoCard(){ int numRows = 3; int numCols = 9; int randomNumbersPerRow = 5; int randomNumberBound = 90; // 检查卡片是否已经生成过:第一行存在非0值就证明已经生成完成,直接返回现有数据 boolean hasGenerated = false; for (int num : bingoCard[0]) { if (num != 0) { hasGenerated = true; break; } } if (hasGenerated) { // 若需要每次调用都打印卡片,保留打印逻辑即可,直接输出已有的固定卡片 for (int row = 0; row < numRows; row++) { for (int col = 0; col < numCols; col++) { System.out.printf("%2d ", bingoCard[row][col]); } System.out.println(); } return bingoCard; } Random random = new Random(); // 删掉原来方法里重新new bingoCard的代码!全局数组已经初始化,直接给元素赋值即可 for (int row = 0; row < numRows; row++) { // 先把当前行所有位置初始化为0 for (int col = 0; col < numCols; col++) { bingoCard[row][col] = 0; } // 每行随机选5个空位填入1-90的随机数 for (int i = 0; i < randomNumbersPerRow; i++) { int indexToAssign = random.nextInt(numCols); while (bingoCard[row][indexToAssign] != 0) { indexToAssign = random.nextInt(numCols); } int numToAssign = random.nextInt(randomNumberBound)+1; bingoCard[row][indexToAssign] = numToAssign; } } // 打印首次生成的卡片 for (int row = 0; row < numRows; row++) { for (int col = 0; col < numCols; col++) { System.out.printf("%2d ", bingoCard[row][col]); } System.out.println(); } return bingoCard; }
可选扩展
如果后续需要支持重开游戏、生成新的固定卡片,可以单独加一个重置方法,把数组所有元素重置为0,下次调用生成方法时就会自动生成新的固定卡片:
public static void resetBingoCard() { for (int[] row : bingoCard) { Arrays.fill(row, 0); } }
内容的提问来源于stack exchange,提问作者Daniel Requena
相关产品推荐
相关产品推荐

