Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查是否有人在tic-tac-toe gui游戏中获胜?(爪哇)_Java_User Interface_Tic Tac Toe - Fatal编程技术网

Java 如何检查是否有人在tic-tac-toe gui游戏中获胜?(爪哇)

Java 如何检查是否有人在tic-tac-toe gui游戏中获胜?(爪哇),java,user-interface,tic-tac-toe,Java,User Interface,Tic Tac Toe,我基本上已经准备好了所有的东西来完成我一直在做的井字游戏,但是我很难确定谁赢了这场游戏。本质上,我是想看看是否有人赢了这场比赛,如果他们赢了,然后显示一条消息,说明哪个玩家赢了 我试过用蛮力检查每个JButton行/列/对角线,但它似乎不起作用。我有一个3乘3的网格布局的JButton顺便说一句 if((gameButton[0].getText().equals("X") && gameButton[1].getText().equals("X") && gam

我基本上已经准备好了所有的东西来完成我一直在做的井字游戏,但是我很难确定谁赢了这场游戏。本质上,我是想看看是否有人赢了这场比赛,如果他们赢了,然后显示一条消息,说明哪个玩家赢了

我试过用蛮力检查每个JButton行/列/对角线,但它似乎不起作用。我有一个3乘3的网格布局的JButton顺便说一句

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”时,什么也没有发生。欢迎提供任何反馈/建议以提高效率。

我是否可以建议这样做,将文本存储为布尔数组。每次按下按钮后,将数组中的点设置为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;
               }
          }
     }
}
public void actionPerformed(ActionEvent e){
对象源=e.getSource();
对于(int i=0;i<3;i++){
对于(int j=0;j<3;j++){
如果(源==板[i][j],则turn==真){
检查[i][j]=正确;
}
否则{
检查[i][j]=假;
}
}
}
}
在此之后,您可能只需要使用此方法,该方法在每次转弯后运行,或者以您认为合适的方式运行

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;
               }
            }
        }
    }
}
private void win(){
对于(int i=0;i<2;i++)
{
对于(int j=0;j<2;j++)
{
int-winO=0;
int-winX=0;
对于(int x=0;x<2;x++)
{
如果(检查[i][j]==false)
{
winO++;
如果(检查[i+x][j+x]==false)
{
winO++;
System.out.println(winO);
}
}
否则如果(检查[i][j]==true)
{
winX++;
如果(勾选[i+x][j+x]==true)
{
winX++;
System.out.println(winX);
}
}
if(winO==4)
{
setText(“玩家O赢了!”);
打破
}
else if(winX==4)
{
setText(“玩家X赢了!”);
打破
}
}
}
}
}
公平的警告。这只检查对角线!如果要检查水平/垂直,必须将
x
值分别添加到
i
和/或
j


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

您应该将其存储在3×3矩阵中,然后检查对角线。像这样的可读性建议:这里有一些重复的代码(
“X”
块和
“O”
块)。编写一个
私有
方法来封装这个逻辑,这样就不必重复了。