Java开发CMD终端宾果游戏,遇2D数组替换、Bingo判定等问题求助
Java宾果游戏开发问题解决方案
核心问题修复方案
- 2D数组内容替换:不直接修改原int类型号码数组,新增两个布尔标记数组
boolean[][] marked1、boolean[][] marked2,尺寸与玩家卡一致,默认值为false。当用户输入的号码匹配卡片对应位置时,将标记数组对应位置改为true,打印卡片时若标记为true则输出XX,否则输出原始号码,既保留原始数据也能持久化标记状态。 - 中奖判定:每次完成号码标记后,分别校验两张卡的标记数组,校验维度包含:5行全标记、5列全标记、两条对角线全标记,任意维度满足则判定对应玩家中奖,输出提示后结束游戏。
- 重复输入拦截:新增长度为26的布尔数组
boolean[] calledNum(适配1-25的号码范围),用户输入有效号码后先校验calledNum[call]是否为true,为true则提示号码已使用、要求重新输入,校验通过后将calledNum[call]设为true即可拦截重复输入。
完整可运行代码
import java.util.Scanner; public class demno { // 中奖校验通用方法 private static boolean checkWin(boolean[][] marked) { // 校验行 for (int i = 0; i < 5; i++) { boolean rowWin = true; for (int j = 0; j < 5; j++) { if (!marked[i][j]) { rowWin = false; break; } } if (rowWin) return true; } // 校验列 for (int j = 0; j < 5; j++) { boolean colWin = true; for (int i = 0; i < 5; i++) { if (!marked[i][j]) { colWin = false; break; } } if (colWin) return true; } // 校验正对角线 boolean diag1Win = true; for (int i = 0; i < 5; i++) { if (!marked[i][i]) { diag1Win = false; break; } } if (diag1Win) return true; // 校验反对角线 boolean diag2Win = true; for (int i = 0; i < 5; i++) { if (!marked[i][4 - i]) { diag2Win = false; break; } } return diag2Win; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int call; // 记录已喊过的号码,下标对应号码值,1-25有效 boolean[] calledNum = new boolean[26]; // 初始化两张玩家卡 int[][] card1 = { {24, 2, 8, 1, 25}, {12, 16, 7, 17, 15}, {5, 6, 20, 19, 13 }, {14, 23, 22, 4, 3 }, {10, 18, 11, 21, 9} }; int[][] card2 = { {24, 21, 17, 15, 6}, {10, 3, 8, 18, 20 }, {14, 7, 16, 12, 5 }, {25, 23, 13, 19, 11}, {22, 4, 9, 1, 2 } }; // 初始化两张卡的标记数组 boolean[][] marked1 = new boolean[5][5]; boolean[][] marked2 = new boolean[5][5]; // 游戏主循环 while (true) { // 打印玩家1卡片 System.out.println("\nPlayer 1's card:"); for (int r = 0; r < 5; r++) { for (int c = 0; c < 5; c++) { if (marked1[r][c]) { System.out.print("XX "); } else if (card1[r][c] < 10) { System.out.print(" " + card1[r][c] + " "); } else { System.out.print(card1[r][c] + " "); } } System.out.println(); } // 打印玩家2卡片 System.out.println("\nPlayer 2's card:"); for (int r = 0; r < 5; r++) { for (int c = 0; c < 5; c++) { if (marked2[r][c]) { System.out.print("XX "); } else if (card2[r][c] < 10) { System.out.print(" " + card2[r][c] + " "); } else { System.out.print(card2[r][c] + " "); } } System.out.println(); } // 输入号码校验 System.out.println("\nGame Host call (0 to exit): "); call = sc.nextInt(); if (call == 0) { System.out.println("游戏结束"); break; } if (call < 1 || call > 25) { System.out.println("The number must be between 1 to 25, please call again!"); continue; } if (calledNum[call]) { System.out.println("该号码已被使用,请输入其他号码!"); continue; } calledNum[call] = true; // 标记玩家1卡片 for (int r = 0; r < 5; r++) { for (int c = 0; c < 5; c++) { if (card1[r][c] == call) { marked1[r][c] = true; } } } // 标记玩家2卡片 for (int r = 0; r < 5; r++) { for (int c = 0; c < 5; c++) { if (card2[r][c] == call) { marked2[r][c] = true; } } } // 中奖校验 if (checkWin(marked1)) { System.out.println("Bingo, Player \"1\" wins!"); break; } if (checkWin(marked2)) { System.out.println("Bingo, Player \"2\" wins!"); break; } } sc.close(); } }
内容的提问来源于stack exchange,提问作者Anas
相关产品推荐
相关产品推荐

