Java 检查玩家的移动是否在Tictaoe游戏中有效
我正在用java做一个人机交互的井字游戏。 我需要一个检查,以确保玩家做出了有效的移动,例如,玩家没有试图在一个已经被占用的广场上移动 我试图编写一个方法并从chick()方法调用它,或者在win()中设置if station,但没有成功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
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个选项中的任何一个