Tic Tac Toe Project

You are currently viewing a revision titled "TicTacToe.Java", saved on April 28, 2015 at 7:59 pm by Narendra Dangol
Title
TicTacToe.Java
Content
/* Title: Tic-Tac-Toe Game Created: April 25, 2015 Last Edited: April 27, 2015 Author: Dangol Changes: See Below... */ import javax.swing.*; import java.awt.*; import java.awt.event.*; public class TicTacToe implements ActionListener { final String Group = "Group XO"; //Setting up ALL the variables JFrame window = new JFrame("Tic-Tac-Toe " + Group); JMenuBar menuMain = new JMenuBar(); JMenuItem menuNewGame = new JMenuItem("New Game"), menuInstruction = new JMenuItem("Instructions"), menuExit = new JMenuItem("Exit"), menuAbout = new JMenuItem("About"); JButton btn1v1 = new JButton("Player vs Player"), btn1vCPU = new JButton("Player vs Computer"), btnQuit = new JButton("Quit"), btnSetName = new JButton("Set Player Names"), btnContinue = new JButton("Continue..."), btnTryAgain = new JButton("Try Again?"); JButton btnEmpty[] = new JButton[10]; JPanel pnlNewGame = new JPanel(), pnlMenu = new JPanel(), pnlMain = new JPanel(), pnlTop = new JPanel(), pnlBottom = new JPanel(), pnlQuitNTryAgain = new JPanel(), pnlPlayingField = new JPanel(); JLabel lblTitle = new JLabel("Tic-Tac-Toe"), lblTurn = new JLabel(), lblStatus = new JLabel("", JLabel.CENTER), lblMode = new JLabel("", JLabel.LEFT); JTextArea txtMessage = new JTextArea(); final int winCombo[][] = new int[][] { {1, 2, 3}, {1, 4, 7}, {1, 5, 9}, {4, 5, 6}, {2, 5, 8}, {3, 5, 7}, {7, 8, 9}, {3, 6, 9} /*Horizontal Wins*/ /*Vertical Wins*/ /*Diagonal Wins*/ }; final int X = 800, Y = 500, mainColorR = 190, mainColorG = 200, mainColorB = 250, btnColorR = 30, btnColorG = 30, btnColorB = 30; Color clrBtnWonColor = new Color(0, 0, 205); int turn = 1, player1Won = 0, player2Won = 0, wonNumber1 = 1, wonNumber2 = 1, wonNumber3 = 1, option; boolean inGame = false, CPUGame = false, win = false; String message, Player1 = "Player 1", Player2 = "Player 2", tempPlayer2 = "Player 2"; public TicTacToe() { //Setting game properties and layout and sytle... //Setting window properties: window.setSize(X, Y); window.setLocation(400, 300); //window.setResizable(false); window.setLayout(new BorderLayout()); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Setting Menu, Main, Top, Bottom Panel Layout/Backgrounds pnlMenu.setLayout(new FlowLayout(FlowLayout.CENTER)); pnlTop.setLayout(new FlowLayout(FlowLayout.CENTER)); pnlBottom.setLayout(new FlowLayout(FlowLayout.CENTER)); pnlNewGame.setBackground(new Color(mainColorR - 50, mainColorG , mainColorB- 50)); pnlMenu.setBackground(new Color((mainColorR -50), (mainColorG ), (mainColorB- 50))); pnlMain.setBackground(new Color(mainColorR, mainColorG, mainColorB)); pnlTop.setBackground(new Color(mainColorR, mainColorG, mainColorB)); pnlBottom.setBackground(new Color(mainColorR, mainColorG, mainColorB)); //Setting up Panel QuitNTryAgain pnlQuitNTryAgain.setLayout(new GridLayout(1, 2, 2, 2)); pnlQuitNTryAgain.add(btnTryAgain); pnlQuitNTryAgain.add(btnQuit); //Adding menu items to menu bar menuMain.add(menuNewGame); menuMain.add(menuInstruction); menuMain.add(menuAbout); menuMain.add(menuExit);// Menu Bar is Complete //Adding buttons to NewGame panel pnlNewGame.setLayout(new GridLayout(4, 1, 2, 10)); pnlNewGame.add(btnContinue); pnlNewGame.add(btn1v1); pnlNewGame.add(btn1vCPU); pnlNewGame.add(btnSetName); //Setting Button propertied btnTryAgain.setEnabled(false); btnContinue.setEnabled(false); //Setting txtMessage Properties txtMessage.setBackground(new Color(mainColorR-30, mainColorG-30, mainColorB-30)); txtMessage.setForeground(Color.red); txtMessage.setEditable(false); //Adding Action Listener to all the Buttons and Menu Items menuNewGame.addActionListener(this); menuExit.addActionListener(this); menuInstruction.addActionListener(this); menuAbout.addActionListener(this); btn1v1.addActionListener(this); btn1vCPU.addActionListener(this); btnQuit.addActionListener(this); btnSetName.addActionListener(this); btnContinue.addActionListener(this); btnTryAgain.addActionListener(this); //Setting up the playing field pnlPlayingField.setLayout(new GridLayout(3, 3, 2, 2)); pnlPlayingField.setBackground(Color.black); for(int i=1; i<=9; i++) { btnEmpty[i] = new JButton(); btnEmpty[i].setBackground(new Color(btnColorR, btnColorG, btnColorB)); btnEmpty[i].addActionListener(this); pnlPlayingField.add(btnEmpty[i]);// Playing Field is Compelte } //Adding everything needed to pnlMenu and pnlMain lblMode.setForeground(Color.white); pnlMenu.add(lblMode); pnlMenu.add(menuMain); pnlMain.add(lblTitle); //Adding to window and Showing window window.add(pnlMenu, BorderLayout.NORTH); window.add(pnlMain, BorderLayout.CENTER); window.setVisible(true); } public static void main(String[] args) { new TicTacToe();// Calling the class construtor. // PROGRAM STARTS HERE! }   /* ------------------------- Start of all METHODS. | ------------------------- */ public void showGame() { // Shows the Playing Field // *IMPORTANT*- Does not start out brand new (meaning just shows what it had before) clearPanelSouth(); pnlMain.setLayout(new BorderLayout()); pnlTop.setLayout(new BorderLayout()); pnlBottom.setLayout(new BorderLayout()); pnlTop.add(pnlPlayingField); pnlBottom.add(lblTurn, BorderLayout.WEST); pnlBottom.add(lblStatus, BorderLayout.CENTER); pnlBottom.add(pnlQuitNTryAgain, BorderLayout.EAST); pnlMain.add(pnlTop, BorderLayout.CENTER); pnlMain.add(pnlBottom, BorderLayout.SOUTH); pnlPlayingField.requestFocus(); inGame = true; checkTurn(); checkWinStatus(); } //----------------------------------------------------------------------------------------------------------------------------------- public void newGame() { // Sets all the game required variables to default // and then shows the playing field. // (Basically: Starts a new 1v1 Game) btnEmpty[wonNumber1].setBackground(new Color(btnColorR, btnColorG, btnColorB)); btnEmpty[wonNumber2].setBackground(new Color(btnColorR, btnColorG, btnColorB)); btnEmpty[wonNumber3].setBackground(new Color(btnColorR, btnColorG, btnColorB)); for(int i=1; i<10; i++) { btnEmpty[i].setText(""); btnEmpty[i].setEnabled(true); } turn = 1; win = false; showGame(); } //----------------------------------------------------------------------------------------------------------------------------------- public void quit() { inGame = false; lblMode.setText(""); btnContinue.setEnabled(false); clearPanelSouth(); setDefaultLayout(); pnlTop.add(pnlNewGame); pnlMain.add(pnlTop); } //----------------------------------------------------------------------------------------------------------------------------------- public void checkWin() { // checks if there are 3 symbols in a row vertically, diagonally, or horizontally. // then shows a message and disables buttons. If the game is over then it asks // if you want to play again. for(int i=0; i<8; i++) { if( !btnEmpty[winCombo[i][0]].getText().equals("") && btnEmpty[winCombo[i][0]].getText().equals(btnEmpty[winCombo[i][1]].getText()) && // if {1 == 2 && 2 == 3} btnEmpty[winCombo[i][1]].getText().equals(btnEmpty[winCombo[i][2]].getText())) { /* The way this checks the if someone won is: First: it checks if the btnEmpty[x] is not equal to an empty string- x being the array number inside the multi-dementional array winCombo[checks inside each of the 7 sets][the first number] Secong: it checks if btnEmpty[x] is equal to btnEmpty[y]- x being winCombo[each set][the first number] y being winCombo[each set the same as x][the second number] (So basically checks if the first and second number in each set is equal to each other) Third: it checks if btnEmtpy[y] is eual to btnEmpty[z]- y being the same y as last time and z being winCombo[each set as y][the third number] Conclusion: So basically it checks if it is equal to the btnEmpty is equal to each set of numbers */ win = true; wonNumber1 = winCombo[i][0]; wonNumber2 = winCombo[i][1]; wonNumber3 = winCombo[i][2]; btnEmpty[wonNumber1].setBackground(clrBtnWonColor); btnEmpty[wonNumber2].setBackground(clrBtnWonColor); btnEmpty[wonNumber3].setBackground(clrBtnWonColor); break; } } if(win || (!win && turn>9)) { if(win) { if(btnEmpty[wonNumber1].getText().equals("X")) { message = Player1 + " has won"; player1Won++; } else { message = Player2 + " has won"; player2Won++; } } else if(!win && turn>9) message = "Both players have tied!nBetter luck next time."; showMessage(message); for(int i=1; i<=9; i++) { btnEmpty[i].setEnabled(false); } btnTryAgain.setEnabled(true); checkWinStatus(); } else checkTurn(); } //----------------------------------------------------------------------------------------------------------------------------------- public void AI() { int computerButton; if(turn <= 9) { turn++; computerButton = CPU.doMove( btnEmpty[1], btnEmpty[2], btnEmpty[3], btnEmpty[4], btnEmpty[5], btnEmpty[6], btnEmpty[7], btnEmpty[8], btnEmpty[9]); if(computerButton == 0) Random(); else { btnEmpty[computerButton].setText("O"); btnEmpty[computerButton].setEnabled(false); } checkWin(); } } //----------------------------------------------------------------------------------------------------------------------------------- public void Random() { int random; if(turn <= 9) { random = 0; while(random == 0) { random = (int)(Math.random() * 10); } if(CPU.doRandomMove(btnEmpty[random])) { btnEmpty[random].setText("O"); btnEmpty[random].setEnabled(false); } else { Random(); } } } //----------------------------------------------------------------------------------------------------------------------------------- public void checkTurn() { String whoTurn; if(!(turn % 2 == 0)) { whoTurn = Player1 + " [X]"; } else { whoTurn = Player2 + " [O]"; } lblTurn.setText("Turn: " + whoTurn); } //----------------------------------------------------------------------------------------------------------------------------------- public void askUserForPlayerNames() { String temp; boolean tempIsValid = false; temp = getInput("Enter player 1 name:", Player1); if(temp == null) {/*Do Nothing*/} else if(temp.equals("")) showMessage("Invalid Name!"); else if(temp.equals(Player2)) { option = askMessage("Player 1 name matches Player 2'snDo you want to continue?", "Name Match", JOptionPane.YES_NO_OPTION); if(option == JOptionPane.YES_OPTION) tempIsValid = true; } else if(temp != null) { tempIsValid = true; } if(tempIsValid) { Player1 = temp; tempIsValid = false; } temp = getInput("Enter player 2 name:", Player2); if(temp == null) {/*Do Nothing*/} else if(temp.equals("")) showMessage("Invalid Name!"); else if(temp.equals(Player1)) { option = askMessage("Player 2 name matches Player 1'snDo you want to continue?", "Name Match", JOptionPane.YES_NO_OPTION); if(option == JOptionPane.YES_OPTION) tempIsValid = true; } else if(temp != null) { tempIsValid = true; } if(tempIsValid) { Player2 = temp; tempPlayer2 = temp; tempIsValid = false; } } //----------------------------------------------------------------------------------------------------------------------------------- public void setDefaultLayout() { pnlMain.setLayout(new GridLayout(2, 1, 2, 5)); pnlTop.setLayout(new FlowLayout(FlowLayout.CENTER)); pnlBottom.setLayout(new FlowLayout(FlowLayout.CENTER)); } //----------------------------------------------------------------------------------------------------------------------------------- public void checkWinStatus() { lblStatus.setText(Player1 + ": " + player1Won + " | " + Player2 + ": " + player2Won); } //----------------------------------------------------------------------------------------------------------------------------------- public int askMessage(String msg, String tle, int op) { return JOptionPane.showConfirmDialog(null, msg, tle, op); } //----------------------------------------------------------------------------------------------------------------------------------- public String getInput(String msg, String setText) { return JOptionPane.showInputDialog(null, msg, setText); } //----------------------------------------------------------------------------------------------------------------------------------- public void showMessage(String msg) { JOptionPane.showMessageDialog(null, msg); } //----------------------------------------------------------------------------------------------------------------------------------- public void clearPanelSouth() { //Removes all the possible panels //that pnlMain, pnlTop, pnlBottom //could have. pnlMain.remove(lblTitle); pnlMain.remove(pnlTop); pnlMain.remove(pnlBottom); pnlTop.remove(pnlNewGame); pnlTop.remove(txtMessage); pnlTop.remove(pnlPlayingField); pnlBottom.remove(lblTurn); pnlBottom.remove(pnlQuitNTryAgain); } /* ------------------------------------- End of all non-Abstract METHODS. | ------------------------------------- */ //-------------------ACTION PERFORMED METHOD (Button Click --> Action?)-------------------------// public void actionPerformed(ActionEvent click) { Object source = click.getSource(); for(int i=1; i<=9; i++) { if(source == btnEmpty[i] && turn < 10) { if(!(turn % 2 == 0)) btnEmpty[i].setText("X"); else btnEmpty[i].setText("O"); btnEmpty[i].setEnabled(false); pnlPlayingField.requestFocus(); turn++; checkWin(); if(CPUGame && win == false) AI(); } } if(source == menuNewGame || source == menuInstruction || source == menuAbout) { clearPanelSouth(); setDefaultLayout(); if(source == menuNewGame) {//NewGame pnlTop.add(pnlNewGame); } else if(source == menuInstruction || source == menuAbout) { if(source == menuInstruction) {// Instructions message = "Instructions:nn" + "Your goal is to be the first player to get 3 X's or O's in an" + "row. (horizontally, diagonally, or vertically)n" + Player1 + ": Xn" + Player2 + ": On"; } else {//About message = "About:nn" + "Title: Tic-Tac-Toen" + "Creator: Dangoln" + "Group: " + Group + "n"; } txtMessage.setText(message); pnlTop.add(txtMessage); } pnlMain.add(pnlTop); } else if(source == btn1v1 || source == btn1vCPU) { if(inGame) { option = askMessage("If you start a new game," + "your current game will be lost..." + "n" + "Are you sure you want to continue?", "Quit Game?" ,JOptionPane.YES_NO_OPTION ); if(option == JOptionPane.YES_OPTION) inGame = false; } if(!inGame) { btnContinue.setEnabled(true); if(source == btn1v1) {// 1 v 1 Game Player2 = tempPlayer2; player1Won = 0; player2Won = 0; lblMode.setText("1 v 1"); CPUGame = false; newGame(); } else {// 1 v CPU Game Player2 = "Computer"; player1Won = 0; player2Won = 0; lblMode.setText("1 v CPU"); CPUGame = true; newGame(); } } } else if(source == btnContinue) { checkTurn(); showGame(); } else if(source == btnSetName) { askUserForPlayerNames(); } else if(source == menuExit) { option = askMessage("Are you sure you want to exit?", "Exit Game", JOptionPane.YES_NO_OPTION); if(option == JOptionPane.YES_OPTION) System.exit(0); } else if(source == btnTryAgain) { newGame(); btnTryAgain.setEnabled(false); } else if(source == btnQuit) { quit(); } pnlMain.setVisible(false); pnlMain.setVisible(true); } //-------------------END OF ACTION PERFORMED METHOD-------------------------// }   /* LAYOUT OF THE GAME: THE WINDOW: (pnlMenu/pnlMain) pnlMenu: (THE MENU) pnlMain: (pnlTop/pnlBottom) pnlTop: (pnlPlayingField/INSTRUCTIONS/ABOUT/NEW GAME) pnlBottom:(STATUS BAR/BACK BUTTON) /////////////////////////////////////////////////--------------| / pnlMenu / | / / | /////////////////////////////////////////////////-----| | / / | | / / | | / / | | / pnlTop / | | / / | |- MAIN WINDOW / / |- | / / |pnlMain | / / | | / / | | / / | | / / | | / / | | ///////////////////////////////////////////////// | | / pnlBottom / | | /////////////////////////////////////////////////-----|--------| */
Excerpt
Footnotes


Old New Date Created Author Actions
April 28, 2015 at 11:59 pm Narendra Dangol