I'm working on a project that has an option to playing against Al, so I started to make it in a separate class and just extended the main class which has an object of a GUI class which draws the buttons and frames.
My algorithm works as follows:
Once a button is clicked:
- Set the text to "X"
- Check if player "X"(human) wins. If yes, that's it. If not:
- Check if there's a winning move for player "O"(Computer). If yes, do it. If not:
- Check if there's a winning move for player "X"(Human). If yes, block it. If not:
- Choose a random/empty place and set its text to "O"
- Check if player "O"(Computer) wins
- Check if there's a winning move for player "X"(Human). If yes, block it. If not:
- Check if there's a winning move for player "O"(Computer). If yes, do it. If not:
I'm wondering if there's any updates/changes I should do to improve my code, either in the algorithm or the code itself.
public class Al extends main implements ActionListener{
int turn=0;
public void actionPerformed(ActionEvent e)
{
JButton temp=(JButton)e.getSource();
temp.setEnabled(false);
temp.setText(turn%2==0?"X":"O");
if(checkWin(turn%2==0?"X":"O"))
gui.banner.setText("You won!");
else{
if(isClose(turn%2==0?"O":"X",turn%2==0?"O":"X")==false && isClose(turn%2==0?"X":"O", turn%2==0?"O":"X")==false)
rand(turn%2==0?"O":"X");
if(checkWin(turn%2==0?"O":"X"))
gui.banner.setText("You Lost!");
}
}
Al()
{
gui.addbanner("Your Turn");
gui.addnewbutton();
gui.newgame.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
for(int i = 0;i < 9 ; i++){
gui.buttons[i].setEnabled(true);
gui.buttons[i].setBorder(BorderFactory.createBevelBorder(1,Color.black,Color.black));
gui.buttons[i].setText("");
}
gui.banner.setText("Your Turn");
turn++;
if(turn%2==1)
rand("O");
}
});
for(int i=0;i<9;i++){
gui.buttons[i].addActionListener(this);
gui.buttons[i].setText("");
}
}
public Boolean isClose(String me, String al)
{
for(int i=0;i<9;i++)
{
if(i%3==0)
{
if(gui.buttons[i].getText()==gui.buttons[i+1].getText()&&gui.buttons[i].getText()==me&&gui.buttons[i+2].getText()=="")
{
gui.buttons[i+2].setText(al);
gui.buttons[i+2].setEnabled(false);
return true;
}
if(gui.buttons[i+1].getText()==gui.buttons[i+2].getText()&&gui.buttons[i+1].getText()==me&&gui.buttons[i].getText()=="")
{
gui.buttons[i].setText(al);
gui.buttons[i].setEnabled(false);
return true;
}
if(gui.buttons[i].getText()==gui.buttons[i+2].getText()&&gui.buttons[i].getText()==me&&gui.buttons[i+1].getText()=="")
{
gui.buttons[i+1].setText(al);
gui.buttons[i+1].setEnabled(false);
return true;
}
}
if(i<=2)
{
if(gui.buttons[i].getText()==gui.buttons[i+3].getText()&&gui.buttons[i].getText()==me&&gui.buttons[i+6].getText()=="")
{
gui.buttons[i+6].setText(al);
gui.buttons[i+6].setEnabled(false);
return true;
}
if(gui.buttons[i+3].getText()==gui.buttons[i+6].getText()&&gui.buttons[i+3].getText()==me&&gui.buttons[i].getText()=="")
{
gui.buttons[i].setText(al);
gui.buttons[i].setEnabled(false);
return true;
}
if(gui.buttons[i].getText()==gui.buttons[i+6].getText()&&gui.buttons[i].getText()==me&&gui.buttons[i+3].getText()=="")
{
gui.buttons[i+3].setText(al);
gui.buttons[i+3].setEnabled(false);
return true;
}
}
if(i==0)
{
if(gui.buttons[i].getText()==gui.buttons[i+4].getText()&&gui.buttons[i].getText()==me&&gui.buttons[i+8].getText()=="")
{
gui.buttons[i+8].setText(al);
gui.buttons[i+8].setEnabled(false);
return true;
}
if(gui.buttons[i+4].getText()==gui.buttons[i+8].getText()&&gui.buttons[i+4].getText()==me&&gui.buttons[i].getText()=="")
{
gui.buttons[i].setText(al);
gui.buttons[i].setEnabled(false);
return true;
}
if(gui.buttons[i].getText()==gui.buttons[i+8].getText()&&gui.buttons[i].getText()==me&&gui.buttons[i+4].getText()=="")
{
gui.buttons[i+4].setText(al);
gui.buttons[i+4].setEnabled(false);
return true;
}
}
if(i==2)
{
if(gui.buttons[i].getText()==gui.buttons[i+2].getText()&&gui.buttons[i].getText()==me&&gui.buttons[i+4].getText()=="")
{
gui.buttons[i+4].setText(al);
gui.buttons[i+4].setEnabled(false);
return true;
}
if(gui.buttons[i+2].getText()==gui.buttons[i+4].getText()&&gui.buttons[i+2].getText()==me&&gui.buttons[i].getText()=="")
{
gui.buttons[i].setText(al);
gui.buttons[i].setEnabled(false);
return true;
}
if(gui.buttons[i].getText()==gui.buttons[i+4].getText()&&gui.buttons[i].getText()==me&&gui.buttons[i+2].getText()=="")
{
gui.buttons[i+2].setText(al);
gui.buttons[i+2].setEnabled(false);
return true;
}
}
}
return false;
}
public void rand(String al)
{
int x;
Random random=new Random();
do
{
x=random.nextInt(9)-0;
}
while(gui.buttons[x].getText()!="" && isFull()==false);
if(isFull()==false)
{
gui.buttons[x].setText(al);
gui.buttons[x].setEnabled(false);
}
}
public Boolean isFull()
{
for(int i=0;i<9;i++)
{
if(gui.buttons[i].getText()=="")
return false;
}
return true;
}
public boolean lineWin(String player, int i, int j, int k) {
return gui.buttons[i].getText().equals(player) && gui.buttons[j].getText().equals(player) && gui.buttons[k].getText().equals(player);
}
public void finish(int i, int j, int k)
{
gui.buttons[i].setBorder(BorderFactory.createBevelBorder(1, Color.CYAN, Color.CYAN));
gui.buttons[j].setBorder(BorderFactory.createBevelBorder(1, Color.CYAN, Color.CYAN));
gui.buttons[k].setBorder(BorderFactory.createBevelBorder(1, Color.CYAN, Color.CYAN));
for(int m=0;m<9;m++)
{
gui.buttons[m].setEnabled(false);
}
}
public Boolean checkWin(String chr){
if(lineWin(chr,0,1,2))
{
finish(0, 1, 2);
return true;
}
if(lineWin(chr,3,4,5))
{
finish(3, 4, 5);
return true;
}
if(lineWin(chr,6,7,8))
{
finish(6, 7, 8);
return true;
}
if(lineWin(chr,0,3,6))
{
finish(0,3,6);
return true;
}
if(lineWin(chr,1,4,7))
{
finish(1,4,7);
return true;
}
if(lineWin(chr,0,1,2))
{
finish(0, 1, 2);
return true;
}
if(lineWin(chr,2,5,8))
{
finish(2,5,8);
return true;
}
if(lineWin(chr,0,4,8))
{
finish(0,4,8);
return true;
}
if(lineWin(chr,2,4,6))
{
finish(2,4,6);
return true;
}
return false; }}