TicTacToe.java
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class TicTacToe extends Applet implements Runnable
{
public boolean m_HumeanIsX = true;
public ANNPlayer m_ANNPlayer;
private HumenPlayer m_Hplayer;
private Panel BoardPanel;
private Button[][] Board;
private int[][] Table;
private GameButtons GButtons;
private boolean MakeMove;
private Panel infoPanel;
public boolean isPlayRun = false;
private Thread playThread = null;
public void init()
{
setSize(400,400);
setBounds(0,0,400,400);
setVisible(true);
playThread = new Thread(this);
playThread.start();
}
public void run() {
while(true)
{
if (isPlayRun)
{
PlayGame();
GButtons.Play.setEnabled(true);
GButtons.Train.setEnabled(true);
}
else
{
if (playThread== null)
{
return;
}
try
{
playThread.sleep(100);
}
catch (Exception e){}
}
}
}
public TicTacToe()
{
m_ANNPlayer = new ANNPlayer(0.1, 1.0);
m_Hplayer = new HumenPlayer(this);
Board = new Button[3][3];
GButtons = new GameButtons(this);
MakeMove = false;
Table = new int[3][3];
BoardPanel = InitBoard(this);
Label Title;
Title=new Label("Tic Tac Toe",1);
Title.setForeground(Color.black);
Font font=new Font("Times New Roman",1,18);
Title.setFont(font);
setLayout(new BorderLayout(10,10));
setBackground(Color.white);
infoPanel = new Panel(new FlowLayout(FlowLayout.CENTER));
infoPanel.add(BoardPanel);
add(GButtons,BorderLayout.SOUTH);
add(infoPanel,BorderLayout.CENTER);
add(Title,BorderLayout.NORTH);
}
private boolean tie(int[][] table)
{
for (int i=0;i<3;i++)
{
for (int j=0;j<3;j++)
{
if (table[i][j]==0)
{
return false;
}
}
}
return true;
}
public void PlayGame()
{
if (m_HumeanIsX)
{
MakeMove = false;
}
else
{
MakeMove = true;
}
Table = new int[3][3];
UpdateBoard();
int ply = 1;
boolean firstMove = true;
if (m_HumeanIsX)
{
firstMove = false;
}
boolean compWin = false;
boolean humeWin = false;
while(true)
{
if(MakeMove){
if (!firstMove)
{
m_ANNPlayer.markMove(Table,1);
}
firstMove = false;
m_ANNPlayer.getNextMove(Table);
m_ANNPlayer.markMove(Table, -1);
MakeMove=false;
UpdateBoard();
}
else
{
try
{
Thread.currentThread().sleep(100);
}
catch (Exception e){}
}
if(Win(Table,-1)){
new MessageBox("Computer wins","Game Over");
compWin = true;
break;
}
if(Win(Table,1))
{
m_ANNPlayer.markMove(Table,1);
new MessageBox("You win","Game Over");
humeWin = true;
break;
}
if (tie(Table))
{
new MessageBox("Tie","Game Over");
break;
}
}
m_ANNPlayer.finishMarkMoves(Table);
isPlayRun = false;
}
public boolean Win(int[][] Table,int kind)
{
int[] S=new int[3];
int i;
int j;
int Kind=kind;
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
{
S[j]=Table[i][j];
}
if ((S[0]==S[1]) && (S[1]==S[2]) && (S[0]!=0)
&& S[0]==kind)
{
return true;
}
}
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
{
S[j]=Table[j][i];
}
if ((S[0]==S[1]) && (S[1]==S[2]) && (S[0]!=0)
&& S[0]==kind)
{
return true;
}
}
for (i=0;i<3;i++)
{
S[i]=Table[i][i];
}
if ((S[0]==S[1]) && (S[1]==S[2]) && (S[0]!=0)
&& S[0]==kind)
{
return true;
}
for (i=0;i<3;i++)
{
S[i]=Table[i][2-i];
}
if ((S[0]==S[1]) && (S[1]==S[2]) && (S[0]!=0)
&& S[0]==kind)
{
return true;
}
return false;
}
private void HGameMove(int x, int y)
{
m_Hplayer.GameMove(Table,x,y);
MakeMove = true;
}
private Panel InitBoard(TicTacToe game)
{
Panel panel=new Panel();
panel.setLayout(new GridLayout(3,3,10,10));
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
Board[i][j] = new Button("");
Board[i][j].setBackground(Color.black);
Board[i][j].setForeground(Color.white);
Font font=new Font("Ariel",1,16);
Board[i][j].setFont(font);
Board[i][j].setEnabled(false);
Board[i][j].addActionListener(
new ActionHandler(i,j)
{
public void actionPerformed(ActionEvent
e)
{
if (isPlayRun)
{
HGameMove(x,y);
}
}
}
);
panel.add(Board[i][j]);
}
}
return panel;
}
public void UpdateBoard()
{
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(Table[i][j]==1)
{
if (m_HumeanIsX)
{
Board[i][j].setLabel("X");
}
else
{
Board[i][j].setLabel("O");
}
Board[i][j].setEnabled(false);
}
else if(Table[i][j]==-1)
{
if (!m_HumeanIsX)
{
Board[i][j].setLabel("X");
}
else
{
Board[i][j].setLabel("O");
}
Board[i][j].setEnabled(false);
}
else
{
Board[i][j].setLabel("");
Board[i][j].setEnabled(true);
}
}
}
paint(this.getGraphics());
}
class ActionHandler implements ActionListener
{
int x,y;
Button ButtonRef;
ActionHandler(int num1,int num2)
{
x=num1;
y=num2;
}
public void actionPerformed(ActionEvent e){}
}
class GameButtons extends Panel
{
TicTacToe m_game;
public Button Train;
Button Play;
TextField GameNumT;
TextField AlphaT;
TextField LambdaT;
Label GameNumL;
Label AlphaL;
Label LambdaL;
CheckboxGroup cbgPlayerType;
Checkbox XPlayerType;
Checkbox OPlayerType;
public GameButtons(TicTacToe game)
{
m_game = game;
setLayout(new GridLayout(0,4,10,10));
Train=new Button("Train");
Play=new Button("Play");
GameNumT=new TextField("10000", 5);
AlphaT=new TextField("0.1", 5);
LambdaT=new TextField("1.0", 5);
GameNumL = new Label("Games number");
AlphaL = new Label("Alpha");
LambdaL = new Label("Lambda");
cbgPlayerType = new CheckboxGroup();
XPlayerType = new Checkbox("X",cbgPlayerType,false);
OPlayerType = new Checkbox("O",cbgPlayerType,true);
Train.setForeground(Color.black);
Play.setForeground(Color.black);
GameNumT.setForeground(Color.black);
AlphaT.setForeground(Color.black);
LambdaT.setForeground(Color.black);
GameNumL.setForeground(Color.black);
AlphaL.setForeground(Color.black);
LambdaL.setForeground(Color.black);
XPlayerType.setForeground(Color.black);
OPlayerType.setForeground(Color.black);
Train.setBackground(Color.white);
Play.setBackground(Color.white);
GameNumT.setBackground(Color.white);
AlphaT.setBackground(Color.white);
LambdaT.setBackground(Color.white);
GameNumL.setBackground(Color.white);
AlphaL.setBackground(Color.white);
LambdaL.setBackground(Color.white);
XPlayerType.setBackground(Color.white);
OPlayerType.setBackground(Color.white);
Train.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Play.setEnabled(false);
Train.setEnabled(false);
m_game.m_ANNPlayer = new ANNPlayer(Double.valueOf(AlphaT.getText()).doubleValue(),
Double.valueOf(LambdaT.getText()).doubleValue());
m_game.m_ANNPlayer.setMaxGameNum(Integer.parseInt(GameNumT.getText()));
m_game.m_ANNPlayer.setGameNum(0);
int player = -1;
if (XPlayerType.getState())
{
player = 1;
}
while (m_game.m_ANNPlayer.getGameNum()<m_game.m_ANNPlayer.getMaxGameNum())
{
m_game.m_ANNPlayer.trainNet(player);
GameNumT.setText(Integer.toString(m_game.m_ANNPlayer.getGameNum()
) );
}
Play.setEnabled(true);
Train.setEnabled(true);
}
}
);
Play.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
m_HumeanIsX = XPlayerType.getState();
m_game.isPlayRun=true;
Train.setEnabled(false);
Play.setEnabled(false);
}
}
);
add(AlphaL);
add(AlphaT);
add(LambdaT);
add(LambdaL);
add(GameNumL);
add(GameNumT);
add(Train);
add(new Canvas());
add(new Canvas());
add(Play);
add(XPlayerType);
add(OPlayerType);
}
}
}
TicTacToe.java
ANNPlayer.java
NueralNet
HumenPlayer.java
MessageBox.java
TurnDialog.java
Applet1.java |