繁体   English   中英

检查二维数组中的特定索引以宣布获胜者

[英]checking for specific indexes in a 2D array to announce winner

我有一个宾果游戏,我正在尝试编写代码,但遇到了一些逻辑问题,我也在寻找整理以下代码的方法。 (宾果游戏是通过在一条直线上划掉数字来获胜的(对角直线也算。))

我当前的 5x5 网格代码用于检查直的“XX”。 检查所有 5 条直线和 2 条对角直线。

    public static void bingoCheck(String[][] card1, String[][] card2) {
    
    //check for player 1 bingo.
    if ((card1[0][0] == "XX") && (card1[0][1] == "XX") && (card1[0][2] == "XX") && (card1[0][3] == "XX") && (card1[0][4] == "XX")) {
        System.out.print("Bingo! Player 1 wins!");
    } else if ((card1[1][0] == "XX") && (card1[1][1] == "XX") && (card1[1][2] == "XX")  && (card1[1][3] == "XX") && (card1[1][4] == "XX")){
        System.out.print("Bingo! Player 1 wins!");
    } else if ((card1[2][0] == "XX") && (card1[2][1] == "XX") && (card1[2][2] == "XX")  && (card1[2][3] == "XX") && (card1[2][4] == "XX")){
        System.out.print("Bingo! Player 1 wins!");
    } else if ((card1[3][0] == "XX") && (card1[3][1] == "XX") && (card1[3][2] == "XX")  && (card1[3][3] == "XX") && (card1[3][4] == "XX")){
        System.out.print("Bingo! Player 1 wins!");
    } else if ((card1[4][0] == "XX") && (card1[4][1] == "XX") && (card1[4][2] == "XX")  && (card1[4][3] == "XX") && (card1[4][4] == "XX")){
        System.out.print("Bingo! Player 1 wins!");
    } else if ((card1[0][4] == "XX") && (card1[1][3] == "XX") && (card1[2][2] == "XX")  && (card1[3][1] == "XX") && (card1[4][0] == "XX")){
        System.out.print("Bingo! Player 1 wins!");
    } else if ((card1[4][4] == "XX") && (card1[3][3] == "XX") && (card1[2][2] == "XX")  && (card1[1][1] == "XX") && (card1[0][0] == "XX")){
        System.out.print("Bingo! Player 1 wins!");
    }
    // player 2 check 
    else if ((card2[0][0] == "XX") && (card2[0][1] == "XX") && (card2[0][2] == "XX")    && (card2[0][3] == "XX") && (card2[0][4] == "XX")) {
        System.out.print("Bingo! Player 2 wins!");
    } else if ((card2[1][0] == "XX") && (card2[1][1] == "XX") && (card2[1][2] == "XX")  && (card2[1][3] == "XX") && (card2[1][4] == "XX")){
        System.out.print("Bingo! Player 2 wins!");
    } else if ((card2[2][0] == "XX") && (card2[2][1] == "XX") && (card2[2][2] == "XX")  && (card2[2][3] == "XX") && (card2[2][4] == "XX")){
        System.out.print("Bingo! Player 2 wins!");
    } else if ((card2[3][0] == "XX") && (card2[3][1] == "XX") && (card2[3][2] == "XX")  && (card2[3][3] == "XX") && (card2[3][4] == "XX")){
        System.out.print("Bingo! Player 2 wins!");
    } else if ((card2[4][0] == "XX") && (card2[4][1] == "XX") && (card2[4][2] == "XX")  && (card2[4][3] == "XX") && (card2[4][4] == "XX")){
        System.out.print("Bingo! Player 2 wins!");
    } else if ((card2[0][4] == "XX") && (card2[1][3] == "XX") && (card2[2][2] == "XX")  && (card2[3][1] == "XX") && (card2[4][0] == "XX")){
        System.out.print("Bingo! Player 2 wins!");
    } else if ((card2[4][4] == "XX") && (card2[3][3] == "XX") && (card2[2][2] == "XX")  && (card2[1][1] == "XX") && (card2[0][0] == "XX")){
        System.out.print("Bingo! Player 2 wins!");
    } else {
        //back to getting user input
        userIn(card1, card2);
    }   
}

逻辑问题。 如果两个发车位都走直线,我希望能够同时宣布 2 位获胜者。

这就是现在的输出方式,两张牌同时得到直线,但代码仅宣布玩家 2 为赢家。

Player 1's card:
 24  XX   8   1  25 
 12  XX   7  17  15 
  5  XX  20  19  13 
 14  XX  XX   4   3 
 10  XX  11  21   9 

Player 2's card:
 24  21  17  15  XX 
 10   3   8  XX  20 
 14   7  XX  12   5 
 25  XX  13  19  11 
 XX   4   9   1  XX 
Bingo! Player 2 wins!

期待输出:

Player 1's card:
 24  XX   8   1  25 
 12  XX   7  17  15 
  5  XX  20  19  13 
 14  XX  XX   4   3 
 10  XX  11  21   9 

Player 2's card:
 24  21  17  15  XX 
 10   3   8  XX  20 
 14   7  XX  12   5 
 25  XX  13  19  11 
 XX   4   9   1  XX 
Bingo! Player 1 wins!
Bingo! Player 2 wins!

如果有任何方法可以整理/更容易编写代码,那也很棒。

这将完成工作

public static void bingoCheck(String[][] card1, String[][] card2) {
        if (checkWinner(card1)) {
            System.out.println("Bingo! Player 1 wins!");
        } else if (checkWinner(card2)) {
            System.out.println("Bingo! Player 2 wins!");
        } else {
            userIn(card1, card2);
        }
    }
    
    private static boolean checkWinner(String[][] cards) {
        boolean isAllCrossed = true;
        int row = 0, col = 0;
        
        // check horizontals
        for (row = 0; row < cards.length; row++) {
            isAllCrossed = true;
            // check if whole row have XX
            for (col = 0; col < cards[0].length; col++) {
                if (!card[row][col].equals("XX")) {
                    isAllCrossed = false;
                    break;
                }
            }
            if (isAllCrossed) return true;
        }
        
        // check digonal from top left to bottom right
        isAllCrossed = true;
        row = col = 0;
        while (row < cards.length) {
            if (!card[row][col].equals("XX")) {
                    isAllCrossed = false;
                    break;
                }
            }
            row++;
            col++;
        }
        if (isAllCrossed) return true;
        
        // check digonal from top right to bottom left
        isAllCrossed = true;
        row = 0;
        col = cards[0].length - 1;
        while (row < cards.length) {
            if (!card[row][col].equals("XX")) {
                isAllCrossed = false;
                break;
            }
            row++;
            col--;
        }
        
        return isAllCrossed;
    }

编写代码的一般规则是,您应该将重复的代码提取到单独的函数中并使用它,而不是多次重复其主体。

在你的情况下,很多事情都会重复。

  1. 请注意,您有完全相同的代码来检查每个玩家的棋盘。 这是你应该提取到一个单独的方法的第一件事,并用每个用户的 board 调用它。

  2. 您正在重复检查每一行的逻辑。 您还在重复检查每一列的代码。 您应该提取两个方法,即checkRowcheckColumn并在 for 循环中为每一行/列调用它。 对角线的情况可以作为第三种方法处理。

  3. 检查一行/一列中的所有元素应该使用 for 循环来完成,而不是手动单独检查每个位置。

总结一下:您应该在这里应用的核心规则是:不要重复自己(DRY)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM