Java 检查玩家的移动是否在Tictaoe游戏中有效

Java 检查玩家的移动是否在Tictaoe游戏中有效,java,tic-tac-toe,Java,Tic Tac Toe,我正在用java做一个人机交互的井字游戏。 我需要一个检查,以确保玩家做出了有效的移动,例如,玩家没有试图在一个已经被占用的广场上移动 我试图编写一个方法并从chick()方法调用它,或者在win()中设置if station,但没有成功 import javax.swing.*; 导入java.awt.event.*; 导入java.awt.*; 公共类XOGAMEMAIN扩展JFrame实现ActionListener{ 私有JButton[][]按钮=新JButton[3][3]; 私有J

我正在用java做一个人机交互的井字游戏。 我需要一个检查,以确保玩家做出了有效的移动,例如,玩家没有试图在一个已经被占用的广场上移动

我试图编写一个方法并从chick()方法调用它,或者在win()中设置if station,但没有成功

import javax.swing.*;
导入java.awt.event.*;
导入java.awt.*;
公共类XOGAMEMAIN扩展JFrame实现ActionListener{
私有JButton[][]按钮=新JButton[3][3];
私有JButton XButton=新JButton(“玩X”);
私有JButton OButton=新JButton(“玩O”);
私有JButton CButton=新JButton(“让计算机从X开始”);
私有JButton C1Button=新JButton(“让计算机从O开始”);
私有JLabel statusLabel=新JLabel(“”);
私有XOGAMEAI game=null;
个人智力=0;
专用计算机=0;
私有布尔值isPlay=false;
私有字符串[]字符=新字符串[]{“,”X“,”O“};
私有void setStatus(字符串s){
statusLabel.setText;
}
私有void setButtonsEnabled(布尔值启用){
for(int i=0;i此方法在前面声明)
如果(event.getSource()==C1Button){///event.getsourse mean==>人类制造的点击在C1按钮上?
play4();///如果是,则转到方法play4()==>这意味着计算机将首先以O字符启动
}
如果(event.getSource()==CButton){///计算机首先以X开头
play3();
}
如果(event.getSource()==OButton){/////human单击以首先使用O=>start play1方法开始
播放1();}
否则{
对于(int i=0;我的意思是这将检查人类的第2轮,例如,不放第一个1
对于(int j=0;jchar O
计算机=XOGAMEAI.TWO;///
setButtonsEnabled(真)///
isPlay=true;
computerTurn1();
/// 
}  
专用void play3(){///用于计算机以X开头
游戏=新XOGAMEAI();
人=XOGAMEAI.2//
计算机=XOGAMEAI.ONE;///
setButtonsEnabled(真)///
isPlay=true;
computerTurn1();
/// 
}  
专用void play1(){///用于O
游戏=新XOGAMEAI();
人=XOGAMEAI.2//
计算机=XOGAMEAI.1//
设置状态(“轮到你了”);//
setButtonsEnabled(真)///
isPlay=true;///
}                                  ////
专用void play(){///X
游戏=新XOGAMEAI();
人类=XOGAMEAI.1;
计算机=XOGAMEAI.2;
轮到你了;
setButtonsEnabled(真);
isPlay=true;
}
公共静态类XOGAMEAI{
/*董事会*/
私人国际董事会[][];
/*空的*/
公共静态final int EMPTY=0;
/*一号玩家*/
公共静态最终整数=1;
/*球员二*/
公共静态最终int 2=2;
公营机构{
board=新整数[3][3];
}
/*获取位置(i,j)的板值*/
公共整型getBoardValue(整型i,整型j){
如果(i<0 | | i>=3)返回空;
如果(j<0 | | j>=3)返回空;
返回板[i][j];
}
/*设置位置(i,j)的板值*/
公共无效setBoardValue(int i、int j、int令牌){////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
如果(i<0 | | i>=3)返回;
如果(j<0 | | j>=3)返回;
董事会[i][j]=代币;
}
/*计算当前令牌的获胜移动*/
public int[]nextWinningMove(int令牌){

对于(inti=0;i在
方法中单击(inti,intj)
检查条件
如果(game.getBoardValue(i,j)=XOGAMEAI.EMPTY)
-这不是你想要的吗?

好的,我发现了错误,它在ActionPerformed方法中。问题是,你写道

if(xbutton pressed){...}
else{click()}
if(ybutton pressed){...}
else{click()}
两个
else
语句都已执行。下面是固定代码:

public void actionPerformed(ActionEvent event) { //// this is action event
                                                    //// that is senseing
                                                    //// any click from the
                                                    //// human(every button
                                                    //// click ==> go for a
                                                    //// method==> this
                                                    //// methods are
                                                    //// declared before )

    if (event.getSource() == C1Button) { /// event.getsourse mean ==> the
                                            /// click that human make is on
                                            /// C1 button ?
        play4(); /// if yes go to method play4() ==> thats mean the computer
                    /// will start first with O char
    } else if (event.getSource() == CButton) { /// for computer to start
                                                /// first with
        /// X
        play3();
    }

    else if (event.getSource() == OButton) { ////////// human click to start
        ////////// first with O==> start
        ////////// play1 method
        play1();
    } else if (event.getSource() == XButton) { // the same here but the
                                                // human has
        // chose Xbutton to start first
        play();
    } else {
        for (int i = 0; i < 3; i++) //// if this is not the first click ==>
                                    //// thats mean this will check in turn
                                    //// 2 for human for example , put not
                                    //// the first 1
            for (int j = 0; j < 3; j++) //// it will go for method click()
                                        //// directly for any of the 9
                                        //// buttons choices
                if (event.getSource() == buttons[i][j]) ///
                    click(i, j);
    }
}
public void actionPerformed(ActionEvent事件){///这是操作事件
////这就是感觉
////从
////人(每个按钮)
////单击==>开始一段时间
////方法==>
////方法是
////(之前声明)
如果(event.getSource()==C1Button){///event.getsourse mean==>
///单击打开的“人造”按钮
///C1按钮?
play4();///如果是,则转到方法play4()==>这表示计算机
///将首先以O字符开始
}else如果(event.getSource()==CButton){///计算机启动
///首先是
///X
play3();
}
否则,如果(event.getSource()==OButton){/////human单击开始
//////////首先使用O==>start
//////////play1方法
play1();
}else if(event.getSource()==XButton){//此处相同,但
//人类有
//首先选择Xbutton启动
play();
}否则{
对于(int i=0;i<3;i++)///如果这不是第一次单击==>
////这意味着这将依次检查
////2以人为例,不放
////第一个1
对于(int j=0;j<3;j++)///它将用于方法click()
////直接用于9个选项中的任何一个