首页 > 解决方案 > 用Java编写宾果游戏,遇到麻烦

问题描述

我是 Java 新手,我有一个项目,我需要创建一个要在 CMD/终端中玩的宾果游戏。我在替换 2D 数组中的数字时遇到问题(如果玩家输入的数字与 2 张卡片中的任何一张匹配,它会被替换为“XX”,然后使用标记为“XX”的数字继续游戏)并检查是否用户已经获得了一行中的所有数字,然后显示“Bingo,玩家“姓名”获胜!”(只有 2 张玩家卡)。我也不知道如何阻止用户输入已经划掉/重复的数字。

import java.util.Scanner;
public class demno {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int call, r = 0, c = 0;   /* For the player to input bingo numbers. 
                            To declare row and column globally for later use. */

        // Initiate card 1 numbers
        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} };
        // Initiate card 2 numbers
        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    } };


        // Player 1's card
        System.out.println("Player 1's card:");
        for (r=0; r<card1.length; r++) {
            for(c=0;c<card1.length; c++){
                if (10 > card1[r][c] ){
                    System.out.print(" "+ card1[r][c] +" ");
                }else {
                    System.out.print(card1[r][c] + " ");
                }
            }
            System.out.println("");
        }
        // End Player 1's card
        
        System.out.print('\n');
        // Player 2's card
        System.out.println("Player 2's card:");
        for (r=0; r<card2.length; r++) {
            for(c=0;c<card2.length; c++){
                if (10 > card2[r][c]) {
                    System.out.print(" " + card2[r][c] + " ");
                }else {
                    System.out.print(card2[r][c] + " ");
                }
            }
            System.out.println("");
        }
        // End Player 2's card

        // User input for bingo number
        System.out.println();
        System.out.print("Game Host call (0 to exit): ");
            call = sc.nextInt();
            sc.close();
        // Checks user input for errors or if player want's to exit.
        if (call >25) {
            System.out.println("The number must be between 1 to 25, please call again! ");
            System.out.print("Game Host call (0 to exit): ");
            call = sc.nextInt();
            sc.close();
        }else if (call == 0) {
            System.exit(0);
        }

        }

    }

标签: java

解决方案


您可以将数组中的值替换为array[0] = "XX". 所以在你的情况下它会是card2[r][c] = "XX"

为了确保每个数字都被使用一次,一个简单的解决方案是 ArrayList。所以你可以像这样使用它

List<Integer> usedNumbers = new ArrayList<Integer>();

//  when number was used
usedNumbers.add(call);

//check if already used
boolean alreadyUsed = usedNumbers.contains(call);

另一个提示:

for (r = 0; r < card2.length; r++) {
    for(c = 0; c < card2.length; c++) {
       ...
    }
}

仅当数组的card2数量等于每个列表中的项目数时才有效。如果没有,您将获得一个OutOfBoundsException. 正确的方法是使用内部数组的长度c

for (r = 0; r < card2.length; r++) {    
    for(c = 0; c < card2[r].length; c++) {
        ...
    }
}

要实现游戏逻辑,您必须采取以下步骤:

  • 扫描数字后,检查玩家 A 是否匹配。
  • 如果有比赛给他一分(也许增加一个 int 变量?)。
  • 然后将匹配项替换为 XX。
  • 玩家 B 也一样。
  • 如果点变量之一 == 5 打印获胜者并停止应用程序

推荐阅读