如何检查某人是否在井字游戏中获胜? (java)

时间:2019-09-03 19:38:05

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

基本上,我已经完成了我一直在做的井字游戏的所有工作,但是在检查谁赢得了比赛方面遇到了麻烦。本质上,我试图查看是否有人赢得了比赛,如果有人赢得了比赛,则显示一条消息,指出哪个玩家赢得了比赛。

我已经尝试过用力检查每个JButton行/列/对角线,但是它似乎不起作用。我将JButton布置在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”时,什么也没发生。欢迎提出任何反馈/建议以提高效率。

1 个答案:

答案 0 :(得分:0)

可能我建议这样做,将文本存储为布尔数组。每次按下按钮后,将数组中的点设置为true(如果为X)或false(如果为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

可能会有更有效的方法来执行此操作,但这是我能做的最好的,希望对您有所帮助