Java中的宾果纸牌游戏

Java中的宾果纸牌游戏,java,Java,我用Java为我的宾果游戏创建了两个方法。一种方法是创建一个新的棋盘,根据宾果规则(1-75)用整数填充宾果棋盘。我的第二种方法生成范围为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

我用Java为我的宾果游戏创建了两个方法。一种方法是创建一个新的棋盘,根据宾果规则(1-75)用整数填充宾果棋盘。我的第二种方法生成范围为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();
    }
}
public static int drawNum(){
Random rand=新的Random();
int num=rand.nextInt(75)+1;
返回num;
}
公共静态无效bingoCard(){
int[][]卡=新int[5][5];
ArrayList alreadyUsed=新的ArrayList();
布尔有效=假;
int-tmp=0;

对于(int i=0;i要检查您的电路板中是否有数字,请以与您对已使用的数字所做的类似的方式阅读电路板,但用户刚刚输入的数字除外

在猜到另一个号码后,应检查用户获胜的条件。
有几种方法可以做到这一点,一种简单的方法是迭代所有可能获胜的模式,检查是否有令牌

所有这些都是一个循环,有点像这样:

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

这是我的建议-立即学习面向对象编程

我看到您正在使用JDK中提供的对象,那么为什么不学习创建自己的对象呢

使用以下方法(-)和成员(+)创建两个类(注:这不是记录代码的正式方式)

还有一个建议

  • 与其跟踪你用过的东西,不如跟踪你没用过的东西,这会让事情变得更容易,因为你可以从列表中随机选择一些东西。与你当前的行动不同,你现在的行动是凭空选择(一个逻辑数字),希望(这会导致问题),而不是冲突
如果遵循我的建议,您可以编写如下代码

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
方法。

您可以将其作为伪代码写出,然后填写方法。处理这些方法通常会有所帮助以自上而下的方式使用gs。因此,对于宾果游戏,您可能会:

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;
}
同样,我已经在(大部分)伪代码中定义了所有内容。如果这看起来还可以,您可以更进一步。让我们定义
bingorowfind
方法

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.
}
public boolean bingoRowFound(int[]board){
对于(int row=0;row
一些方法(如
drawNumber
)将非常容易实现。其他方法,如寻找对角线宾果游戏可能会有点困难。

2014年2月12日更新:

收回代码,因为这是一个大学课程作业,我想防止人们只是复制代码。当另一个学生从我的Github repo中取出我的代码并将其作为自己的代码发送进来时,我差点因为被指控共享代码(这在作业中是不允许的)而陷入麻烦


有两个类,一个主类和一个类来存放我的方法和构造函数

BINGOFINAL.java
是我的
main

Bingo\u Card.java
持有我的
构造函数
方法


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

这个getNum()方法在哪里,它在哪里被调用?你应该真正学习面向对象编程。它会让你的生活更轻松。将代码分成逻辑部分(方法/函数)这也是一个好主意。而且这个程序可能永远不会结束(或者至少需要足够长的时间才能到达你认为不会结束的地方)。嗨@Andrew_CS,谢谢你回来。我是说drawNum(),我在我的代码中更新了它。嗯。这对我来说很有效。看起来洛根猜到了问题所在并解决了它。仅供参考-在宾果游戏中,用户不会猜数字。嗯,用户必须做些什么……否则它就不算什么游戏了……(而且我很久没有玩宾果游戏了)一般来说,用户会选择他们的棋盘。在这个特殊情况下“游戏”,游戏是由一个随机数生成器“玩”的,该生成器生成1-75之间的整数。这段代码中有很多冗余。你应该使用打印“你赢了”的6行代码(并退出程序)另一种选择是使用逻辑or
| |
组合所有if条件。对于额外的挑战(和可读性),我建议您使用循环来测试是否获胜,而不是硬编码。不过,让它工作起来很好。您也可以只使用
System.out.println(“B I N G O”)
而不是循环。谢谢,没错。实际上我的时间非常有限。当你忙得不可开交时,你的大脑往往会做一些愚蠢的事情:P我回家后重新编写了它,我完全意识到这些冗余,哈哈。之后,我还为这段代码制作了一个图形用户界面,结果是:我不过,确实有一个问题。宾果游戏的条件通常是每列1-15个随机数字(递增)。在我的GUI中,现在它切换到了行。我可能会发表一篇新文章来修复这个错误。
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.
}