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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:27:03