Java中的Bingo卡游戏

4

我在Java中为我的Bingo游戏创建了两种方法。第一种方法创建一个新的面板,根据Bingo规则(1-75)用整数填充Bingo面板。第二种方法生成范围为1-75的随机数字。

public static int drawNum(){
    Random rand = new Random();
    int num = rand.nextInt(75)+1;
    return num;
}

public static void bingoCard(){


    int [][]card=new int [5][5];
    ArrayList<Integer> alreadyUsed = new ArrayList<Integer>();
    boolean valid = false;
    int tmp = 0;

    for(int i = 0; i <= 4; i++){
        for(int row = 0; row < card.length; row++){
            while(!valid){
                tmp = (int)(Math.random() * 15) + 1 + 15 * i;
                if(!alreadyUsed.contains(tmp)){
                    valid = true;
                    alreadyUsed.add(tmp);
                }
            }
            card[row][i] = tmp;
            valid = false;
        }
    }
    card[2][2] = 0;

    //create array to make title.  
    String title []={"B","I","N","G","O"};

    for(int i=0;i<title.length;i++){
        System.out.print(title[i]+ "\t");
    }

    System.out.println();

    for(int row=0;row<card.length;row++){
        for(int col=0;col<card[row].length;col++){
            System.out.print(card[row][col]+ "\t");
        }
        System.out.println();
    }
}

我需要帮助的是,如何检查drawNum()方法是否与我的bingoCard()数组中存储的任何值相对应?如果是,则打印一个新的填充整数的数组。如果满足bingo的条件,则获胜。
我希望我没有让你觉得我想让你替我完成它,但我不知道如何开始编写那一部分的代码。谢谢。

1
getNum() 方法在哪里,它被调用了吗? - Andrew_CS
1
你真的应该学习面向对象编程。它会让你的生活变得更加轻松。将代码分成逻辑部分(方法/函数)也是一个好主意。此外,这个程序可能永远不会结束(或者至少需要足够长的时间,以至于你认为它不会结束)。 - Logan Murphy
嗨@Andrew_CS,感谢您回来。我是指drawNum(),我已经在我的代码中更新了它。 - theGreenCabbage
嗯,这在我的端上运行正常。 - theGreenCabbage
看起来Logan猜到了问题所在并解决了它。 - Code-Apprentice
显示剩余2条评论
4个回答

5
这是我的建议 - 立即学习面向对象编程。
我发现您正在使用JDK提供的对象,那么为什么不学习如何制作您自己的对象呢?
创建两个具有以下方法(-)和成员(+)的类(PS.这不是正式的代码文档方式)。
BingoCard
    +list of numbers on card
    -reset() : gets new numbers for this card
    -test(BingoDrawer) : Tests to see if this card won on this drawing
    -toString() : returns a String representation of this card

BingoDrawer
    +list of numbers drawn
    -reset() : draws new numbers
    -hasNumber(int number) : tests if this number was drawn
    -toString() : returns a String representation of this drawing

再提一些建议

  • 不要追踪你已经使用的内容,而是追踪你还没有使用的内容,这会使事情变得更加容易,因为你可以随机从列表中选择物品。与你当前的做法不同,那样是从空气中(逻辑数字)选择并希望(这会引起问题)它不会冲突。

如果你遵循我的建议,你可以写出如下代码

public static void main(String[] args) {
    BingoCard bc = new BingoCard();
    BingoDrawer bd = new BingoDrawer();
    while(thePlayerWantsToPlay()) { //function to be defined by you
        bc.reset();
        bd.reset();
        System.out.println(bc);
        System.out.println(bd);
        System.out.println(bc.test(bd));
    }
}

你可以更进一步,创建一个BingoGame类,然后在main函数中进行如上操作,只需实例化BingoGame类并在对象上调用某些start方法即可。

1

为了检查您的棋盘中是否有这个数字,请按照与已使用数字相似的方式阅读棋盘,只不过是用用户刚输入的数字。

在猜测另一个数字后应检查用户获胜的条件。
有几种方法可以实现这一点,其中一种简单的方法是迭代每个可能赢得胜利的模式,检查那里是否有标记。

所有这些都将在循环中进行,大致如下:

Set up board via user entering numbers.
Start loop
    set either a timer to wait for, or wait for a keypress (so the game doesn't just play really fast)
    Get random number
    Possibly add to board
    Check if winner
    if winner, break the loop and do something else.
    Print the new board out.
(end of loop)
If they got here, that could mean they won!
Wait to exit

FYI - 在 Bingo 游戏中,用户不猜测数字。 - Andrew_CS
好的,用户必须做些什么...否则这不算是一个游戏...(而且我已经很久没玩宾果了) - Shade
通常情况下,用户会选择他们的开发板。 - Andrew_CS
在这个特定的“游戏”中,游戏是由一个随机数生成器“玩”的,它会生成1-75之间的整数。 - theGreenCabbage

0

你可以先将其写成伪代码,然后在填入具体方法。通常按自上而下的方式逐步完成会更容易实现。比如说,对于 Bingo 游戏,你可以这样写:

board = generateBoard();
while (!bingoFound(board)) {
    number = drawNumber();
    board = stampNumbers(board, number);
}

如果有意义的话,您可以更深入地定义每个方法。例如,bingoFound 可能看起来像这样:
public boolean bingoFound(int[][] board) {
    boolean wasFound = bingoRowFound(board)
                    || bingoColFound(board)
                    || bingoDiagonalFound(board);
    return wasFound;
}

再次声明,我已经用(大部分)伪代码定义了所有内容。如果这看起来没问题,你可以进一步深入一步。让我们定义bingoRowFound方法。

public boolean bingoRowFound(int[][] board) {
    for (int row = 0; row < NUM_ROWS; row++) {
        boolean rowIsABingo = true;
        for (int col = 0; col < NUM_COLS; col++) {
            // We have to check that everything up until this point has
            // been marked off. I am using -1 to indicate that a spot has
            // been marked.
            rowIsABingo = rowIsABingo && board[row][col] == -1;
        }
        if (rowIsABingo) { return rowIsABingo; }
    }
    return false; // If we didn't find a bingo, return false.
}

有些方法(比如drawNumber)将会非常容易实现。而其他的,比如寻找对角线上的 Bingo 可能会稍微困难一些。


0

2014年2月12日更新:

撤回代码,因为这是大学课程作业,我希望阻止人们抄袭代码。当另一个学生从我的Github存储库中复制我的代码并将其发送为自己的作品时,我差点因被指控分享代码而惹上麻烦。(在作业中)抄袭是不被允许的。


这里有两个类,一个是主类,另一个是用来保存我的方法和构造函数的类。

BINGOFINAL.java 是我的 main 类。

Bingo_Card.java 包含了我的 constructormethods

如果你想运行这个程序,请确保创建一个名为 BINGOFINAL 的新项目,并将 Bingo_Card.java 放入同样的 */src/ 扩展中。


这段代码有很多冗余。你应该将打印“你赢了”(并退出程序)的6行代码放入一个函数中,然后调用该函数。另一个选项是使用逻辑或||组合所有if条件。为了增加挑战(和可读性),我建议你使用循环来测试获胜情况,而不是硬编码。虽然做到了让它工作,但还可以更好。 - Logan Murphy
1
你也可以直接使用 System.out.println(" B I N G O "); 而不是循环。 - Logan Murphy
谢谢,没错。我实际上时间很有限。当你时间紧迫时,你的思维倾向于做一些傻事:P 我回家后重新写了它,我完全意识到那些冗余,哈哈。此后,我还为这段代码制作了一个图形用户界面,结果如下:http://puu.sh/4bOmS/593a78a87c.png 我确实有一个问题——条件是每列通常是从1-15的随机数字(递增)。在我的GUI中,现在已经切换到行。我可能会发布一个新帖子来修复这个错误。 - theGreenCabbage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接