Here I present a simple TicTacToe Program.
You can download my code and play in your computer.
Download Source Code:
TicTacToe
Save to file: TicTacToeMain.java
import javax.swing.*; import java.awt.event.*; import java.awt.*; public class TicTacToeMain extends JFrame implements ActionListener { private JButton [][]buttons = new JButton[3][3]; private JButton playButton = new JButton("Play"); private JLabel statusLabel = new JLabel(""); private TicTacToeAI game = null; private int human = 0; private int computer = 0; private boolean isPlay = false; private String []chars=new String[]{"","X","O"}; private void setStatus(String s) { statusLabel.setText(s); } private void setButtonsEnabled(boolean enabled) { for(int i=0;i<3;i++) for(int j=0;j<3;j++) { buttons[i][j].setEnabled(enabled); if(enabled) buttons[i][j].setText(" "); } } public TicTacToeMain() { setTitle("Tic Tac Toe"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); JPanel centerPanel = new JPanel(new GridLayout(3,3)); Font font = new Font("Arial",Font.BOLD, 32); for(int i=0;i<3;i++) for(int j=0;j<3;j++) { buttons[i][j] = new JButton(" "); buttons[i][j].setFont(font); buttons[i][j].addActionListener(this); buttons[i][j].setFocusable(false); centerPanel.add(buttons[i][j]); } playButton.addActionListener(this); JPanel northPanel = new JPanel(); northPanel.add(statusLabel); JPanel southPanel = new JPanel(); southPanel.add(playButton); setStatus("Click 'Play' To Start"); setButtonsEnabled(false); add(northPanel,"North"); add(centerPanel,"Center"); add(southPanel,"South"); setSize(300,300); // I'm lazy to implement the correct way setLocationRelativeTo(null); } public static void main(String []args) { new TicTacToeMain().setVisible(true); } private void computerTurn() { if(!isPlay) return; int []pos = game.nextMove(computer); if(pos!=null) { int i = pos[0]; int j = pos[1]; buttons[i][j].setText(chars[computer]); game.setBoardValue(i,j,computer); } checkState(); } private void gameOver(String s) { setStatus(s); setButtonsEnabled(false); isPlay = false; } private void checkState() { if(game.isWin(human)) { gameOver("Congratulations, You've Won!"); } if(game.isWin(computer)) { gameOver("Sorry, You Lose!"); } if(game.nextMove(human)==null && game.nextMove(computer)==null) { gameOver("Draw, Click 'Play' For Rematch!"); } } private void click(int i,int j) { if(game.getBoardValue(i,j)==TicTacToeAI.EMPTY) { buttons[i][j].setText(chars[human]); game.setBoardValue(i,j,human); checkState(); computerTurn(); } } public void actionPerformed(ActionEvent event) { if(event.getSource()==playButton) { play(); }else { for(int i=0;i<3;i++) for(int j=0;j<3;j++) if(event.getSource()==buttons[i][j]) click(i,j); } } private void play() { game = new TicTacToeAI(); human = TicTacToeAI.ONE; computer = TicTacToeAI.TWO; setStatus("Your Turn"); setButtonsEnabled(true); isPlay = true; } }Save to file: TicTacToeAI.java
public class TicTacToeAI { /* the board */ private int board[][]; /* empty */ public static final int EMPTY = 0; /* player one */ public static final int ONE = 1; /* player two */ public static final int TWO = 2; public TicTacToeAI() { board = new int[3][3]; } /* get the board value for position (i,j) */ public int getBoardValue(int i,int j) { if(i < 0 || i >= 3) return EMPTY; if(j < 0 || j >= 3) return EMPTY; return board[i][j]; } /* set the board value for position (i,j) */ public void setBoardValue(int i,int j,int token) { if(i < 0 || i >= 3) return; if(j < 0 || j >= 3) return; board[i][j] = token; } /* calculate the winning move for current token */ public int []nextWinningMove(int token) { for(int i=0;i<3;i++) for(int j=0;j<3;j++) if(getBoardValue(i, j)==EMPTY) { board[i][j] = token; boolean win = isWin(token); board[i][j] = EMPTY; if(win) return new int[]{i,j}; } return null; } public int inverse(int token) { return token==ONE ? TWO : ONE; } /* calculate the best move for current token */ public int []nextMove(int token) { /* lucky position in the center of board*/ if(getBoardValue(1, 1)==EMPTY) return new int[]{1,1}; /* if we can move on the next turn */ int winMove[] = nextWinningMove(token); if(winMove!=null) return winMove; /* choose the move that prevent enemy to win */ for(int i=0;i<3;i++) for(int j=0;j<3;j++) if(getBoardValue(i, j)==EMPTY) { board[i][j] = token; boolean ok = nextWinningMove(inverse(token)) == null; board[i][j] = EMPTY; if(ok) return new int[]{i,j}; } /* choose available move */ for(int i=0;i<3;i++) for(int j=0;j<3;j++) if(getBoardValue(i, j)==EMPTY) return new int[]{i,j}; /* no move is available */ return null; } /* determine if current token is win or not win */ public boolean isWin(int token) { final int DI[]={-1,0,1,1}; final int DJ[]={1,1,1,0}; for(int i=0;i<3;i++) for(int j=0;j<3;j++) { /* we skip if the token in position(i,j) not equal current token */ if(getBoardValue(i, j)!=token) continue; for(int k=0;k<4;k++) { int ctr = 0; while(getBoardValue(i+DI[k]*ctr, j+DJ[k]*ctr)==token) ctr++; if(ctr==3) return true; } } return false; } }
This comment has been removed by the author.
ReplyDeletecan you help me to make this game but in console mode with java and minmax algorithm...same 3x3 but with the wall.ty :)
ReplyDeleteGood work, I have been for a simple code and yours works perfectly. Thanks
ReplyDeleteYou really gave a great idea, a small version of tic tac toe game will work perfectly and one with this size of checkers.
ReplyDeleteWould love you to submit your code to http://www.programr.com. We offer an interesting way for beginners to learn java programming
ReplyDeleteim an idiot
Delete@Ronald: Sure, thanks for introduce me programr.com
ReplyDeleteThank You :)
ReplyDeleteThanks for codes, and I want to expand AI for 5x5 TicTacToe but I couldn't find how to change isWin() for 5x5. Can you please help me?
ReplyDeletewhich artificial algorithm is used in this tic tac toe code???please reply
ReplyDeleteWhich IDE should i use for this????
ReplyDeleteYou can use simple editor like textpad / wordpad.
DeleteThis code isn't unbeatable, just click on center and last square and you have a fork!
ReplyDeleteYou should try this one:
Deletehttp://algojava.blogspot.com/p/tictactoe-7x7.html
N=3, M=3
final int DI[]={-1,0,1,1}; final int DJ[]={1,1,1,0};
ReplyDeleteWhy we need above two?can u please explain me?
what if you want to make it choose a random player at the beginning? like instead of always human going first, computer goes first.
ReplyDelete
ReplyDeletethanks for your help to get the source code that is simple
ReplyDeleteLearned a lot of new things from your post , Thaks for sharing
Java Online Training