【问题标题】:How to check if somebody won in a tic tac toe gui game? (java)如何检查某人是否在井字游戏 gui 游戏中获胜? (爪哇)
【发布时间】:2019-09-03 19:38:05
【问题描述】:

我基本上已经准备好完成我一直在开发的井字游戏,但无法查看谁赢得了比赛。本质上,我是想看看是否有人赢了比赛,如果赢了,然后显示一条消息,说明哪个玩家赢了。

我尝试过暴力检查每个 JButton 行/列/对角线,但它似乎不起作用。顺便说一句,我将 JButtons 布置在 3 x 3 网格中。

if((gameButton[0].getText().equals("X") && gameButton[1].getText().equals("X") && gameButton[2].getText().equals("X"))||
    (gameButton[3].getText().equals("X") && gameButton[4].getText().equals("X") && gameButton[5].getText().equals("X"))||
    (gameButton[6].getText().equals("X") && gameButton[7].getText().equals("X") && gameButton[8].getText().equals("X"))||
    (gameButton[0].getText().equals("X") && gameButton[3].getText().equals("X") && gameButton[6].getText().equals("X"))||
    (gameButton[1].getText().equals("X") && gameButton[4].getText().equals("X") && gameButton[7].getText().equals("X"))||
    (gameButton[2].getText().equals("X") && gameButton[5].getText().equals("X") && gameButton[8].getText().equals("X"))||
    (gameButton[0].getText().equals("X") && gameButton[4].getText().equals("X") && gameButton[8].getText().equals("X"))||
    (gameButton[2].getText().equals("X") && gameButton[4].getText().equals("X") && gameButton[6].getText().equals("X"))) {
        wonLabel.setText("Player X has won!");
    }

else if((gameButton[0].getText().equals("O") && gameButton[1].getText().equals("O") && gameButton[2].getText().equals("O"))||
    (gameButton[3].getText().equals("O") && gameButton[4].getText().equals("O") && gameButton[5].getText().equals("O"))||
    (gameButton[6].getText().equals("O") && gameButton[7].getText().equals("O") && gameButton[8].getText().equals("O"))||
    (gameButton[0].getText().equals("O") && gameButton[3].getText().equals("O") && gameButton[6].getText().equals("O"))||
    (gameButton[1].getText().equals("O") && gameButton[4].getText().equals("O") && gameButton[7].getText().equals("O"))||
    (gameButton[2].getText().equals("O") && gameButton[5].getText().equals("O") && gameButton[8].getText().equals("O"))||
    (gameButton[0].getText().equals("O") && gameButton[4].getText().equals("O") && gameButton[8].getText().equals("O"))||
    (gameButton[2].getText().equals("O") && gameButton[4].getText().equals("O") && gameButton[6].getText().equals("O"))) {
        wonLabel.setText("Player O has won!");
    }

我希望这会输出关于哪个玩家获胜的消息,但是当我与 GUI 交互并故意将某个行/列/对角线全部设为“X”或“O”时,什么也没有发生。欢迎任何反馈/建议以提高效率。

【问题讨论】:

  • 您应该将其存储在 3 x 3 矩阵中,然后检查对角线。像这样stackoverflow.com/questions/33352418/…
  • 可读性建议:这里有一些重复的代码("X" 块和"O" 块。)编写一个 private 方法来封装这个逻辑,这样你就不必重复了它。

标签: java user-interface tic-tac-toe


【解决方案1】:

我可以建议做这样的事情,将文本存储为布尔数组。每次按下按钮后,将数组中的点设置为真(如果 X)或假(如果 O)。我假设你已经有了一个带布尔值的回合计数器,稍后会引用它。

确保这个布尔数组是全局的!!!

boolean[3][3] check = new boolean[3][3];

在你的 actionEventListener 中运行,

public void actionPerformed (ActionEvent e){
     Object source = e.getSource();
     for (int i = 0; i < 3; i++){
          for (int j = 0; j < 3; j++){
               if (source == board[i][j], turn == true){
                     check[i][j] = true;
               }
               else{
                     check[i][j] = false;
               }
          }
     }
}

在此之后,您可能只需要这个方法,它在每个回合之后运行,或者您认为合适。

private void win (){
    for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                int winO = 0;
                int winX = 0;
                for (int x = 0; x < 2; x++) 
                {
                    if (check[i][j] == false)
                    {
                        winO++;
                        if (check[i+x][j+x] == false)
                        {
                            winO++;
                            System.out.println(winO);
                        }
                    }
                    else if (check[i][j] == true)
                    {
                        winX++;
                        if (check[i+x][j+x] == true)
                        {
                            winX++;
                            System.out.println(winX);
                        }
                    }
               if (winO == 4)
               {
                  wonLabel.setText("Player O has won!");
                  break;
               }
               else if (winX == 4)
               {
                  wonLabel.setText("Player X has won!");
                  break;
               }
            }
        }
    }
}

公平警告。这只检查对角线!如果要检查水平/垂直,则必须将 x 值分别添加到 i 和/或 j

可能有更有效的方法来做到这一点,但这是我能做的最好的,希望它有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多