Problem:
In a game of TicTacToe, two players take turns marking an available cell in a 3 3 grid with their respective tokens (either X or O). When one player has placed three tokens in a horizontal, vertical, or diagonal row on the grid, the game is over and that player has won. A draw (no winner) occurs when all the cells on the grid have been filled with tokens and neither player has achieved a win. Create a program for playing TicTacToe. The program prompts two players to enter X token and O token alternately. Whenever a token is entered, the program redisplays the board on the console and determines the status of the game (win, draw, or continue).
Output:
-------------
| | | |
-------------
| | | |
-------------
| | | |
-------------
Enter a row (1, 2, or 3) for player X: 2
Enter a column (1, 2, or 3) for player X: 2
-------------
| | | |
-------------
| | X | |
-------------
| | | |
-------------
Enter a row (1, 2, or 3) for player O: 1
Enter a column (1, 2, or 3) for player O: 1
-------------
| O | | |
-------------
| | X | |
-------------
| | | |
-------------
Enter a row (1, 2, or 3) for player X: 1
Enter a column (1, 2, or 3) for player X: 3
-------------
| O | | X |
-------------
| | X | |
-------------
| | | |
-------------
Enter a row (1, 2, or 3) for player O: 3
Enter a column (1, 2, or 3) for player O: 1
-------------
| O | | X |
-------------
| | X | |
-------------
| O | | |
-------------
Enter a row (1, 2, or 3) for player X: 2
Enter a column (1, 2, or 3) for player X: 1
-------------
| O | | X |
-------------
| X | X | |
-------------
| O | | |
-------------
Enter a row (1, 2, or 3) for player O: 2
Enter a column (1, 2, or 3) for player O: 3
-------------
| O | | X |
-------------
| X | X | O |
-------------
| O | | |
-------------
Enter a row (1, 2, or 3) for player X: 1
Enter a column (1, 2, or 3) for player X: 2
-------------
| O | X | X |
-------------
| X | X | O |
-------------
| O | | |
-------------
Enter a row (1, 2, or 3) for player O: 3
Enter a column (1, 2, or 3) for player O: 2
-------------
| O | X | X |
-------------
| X | X | O |
-------------
| O | O | |
-------------
Enter a row (1, 2, or 3) for player X: 3
Enter a column (1, 2, or 3) for player X: 3
-------------
| O | X | X |
-------------
| X | X | O |
-------------
| O | O | X |
-------------
No one has won!
| | | |
-------------
| | | |
-------------
| | | |
-------------
Enter a row (1, 2, or 3) for player X: 2
Enter a column (1, 2, or 3) for player X: 2
-------------
| | | |
-------------
| | X | |
-------------
| | | |
-------------
Enter a row (1, 2, or 3) for player O: 1
Enter a column (1, 2, or 3) for player O: 1
-------------
| O | | |
-------------
| | X | |
-------------
| | | |
-------------
Enter a row (1, 2, or 3) for player X: 1
Enter a column (1, 2, or 3) for player X: 3
-------------
| O | | X |
-------------
| | X | |
-------------
| | | |
-------------
Enter a row (1, 2, or 3) for player O: 3
Enter a column (1, 2, or 3) for player O: 1
-------------
| O | | X |
-------------
| | X | |
-------------
| O | | |
-------------
Enter a row (1, 2, or 3) for player X: 2
Enter a column (1, 2, or 3) for player X: 1
-------------
| O | | X |
-------------
| X | X | |
-------------
| O | | |
-------------
Enter a row (1, 2, or 3) for player O: 2
Enter a column (1, 2, or 3) for player O: 3
-------------
| O | | X |
-------------
| X | X | O |
-------------
| O | | |
-------------
Enter a row (1, 2, or 3) for player X: 1
Enter a column (1, 2, or 3) for player X: 2
-------------
| O | X | X |
-------------
| X | X | O |
-------------
| O | | |
-------------
Enter a row (1, 2, or 3) for player O: 3
Enter a column (1, 2, or 3) for player O: 2
-------------
| O | X | X |
-------------
| X | X | O |
-------------
| O | O | |
-------------
Enter a row (1, 2, or 3) for player X: 3
Enter a column (1, 2, or 3) for player X: 3
-------------
| O | X | X |
-------------
| X | X | O |
-------------
| O | O | X |
-------------
No one has won!
Solution:
import java.util.Scanner; public class TicTacToe { /** Before you begin with reading the solution, note this is how the tic tac toe board is going to look: ------------- | | | | ------------- | | | | ------------- | | | | ------------- */ public static String[][] fillEmptyArray() { String[][] str = new String[7][13]; //Why 13? Because count the characters between //the parentheses, you'll get 13: ("| | | |") for (int i = 0; i< str.length; i++) { for (int j =0; j <str[i].length;j++) { if (i % 2 == 0) str[i][j]= "-"; else if (i % 2 != 0 && (j==0 || j == 4 || j == 8 || j ==12)) //The indexes of "|" in the array are: 0,4,8 and 12 str[i][j]="|"; else str[i][j]=" "; } } return str; } public static String[][] playGameX (String[][] str) { String[][] str1 = str; Scanner scan = new Scanner (System.in); boolean doItAgain = true; while (doItAgain) { System.out.print("Enter a row (1, 2, or 3) for player X: "); //We add -1 to deal with the index of the two-dimensional array int row = 2*(scan.nextInt() - 1) +1 ; //Don't freak out! We used 2n + 1, and we'll tell why: //1, 3 and 5 are the real row indexes of where X will be placed, //they are distinct from the user input, reason of adding formula. //If the user enters 1: 2(1-1) + 1 = 1 //If the user enters 2: 2(2-1) + 1 = 3 //If the user enters 3: 2(3-1) + 1 = 5 //The program we make will insert the number of //column in the corresponding //array, this is why we used the formula. System.out.print("Enter a column (1, 2, or 3) for player X: "); int column = ( 4*(scan.nextInt()-1) + 2 ); //Again! Don't freak out! We used 4n + 2, and we'll tell why: //("| 2 | 6 | 10 |"), those are the column indexes of where // X will be placed //If the user enters 1: 4(1-1) + 2 = 2 //If the user enters 2: 4(2-1) + 2 = 6 //If the user enters 2: 4(3-1) + 2 = 10 //The program we make will insert the number of column //in the corresponding //array, this is why we used the formula. if ( str1[row][column] == " ") { str1[row][column] = "X"; doItAgain = false; } else System.out.println("An X/O is already there, try again!"); } return str1; } //playGameO is 100% identical to playGameX, instead replace X with O; public static String[][] playGameO (String[][] str) { String[][] str1 = str; Scanner scan = new Scanner (System.in); System.out.print("Enter a row (1, 2, or 3) for player O: "); //We add -1 to deal with the index of the two-dimensional array int row = 2*(scan.nextInt() - 1) +1 ; //Don't freak out! We used 2n + 1, and we'll tell why: //1, 3 and 5 are the real row indexes of where O will be placed, //they are distinct from the user input, this is why we add //the formula //If the user enters 1: 2(1-1) + 1 = 1 //If the user enters 2: 2(2-1) + 1 = 3 //If the user enters 3: 2(3-1) + 1 = 5 //The program we make will insert the number of column in the //corresponding array, this is why we used the formula. System.out.print("Enter a column (1, 2, or 3) for player O: "); int column = ( 4*(scan.nextInt()-1) + 2 ); //Again! Don't freak out! We used 4n + 2, and we'll tell why: //("| 2 | 6 | 10 |"), those are the column indexes of O: //If the user enters 1: 4(1-1) + 2 = 2 //If the user enters 2: 4(2-1) + 2 = 6 //If the user enters 2: 4(3-1) + 2 = 10 //The program we make will insert the number of column in the //array, this is why we used the formula. if ( str1[row][column] == " ") str1[row][column] = "O"; else System.out.println("Invalid input! An X/O is already there."); return str1; } public static String checkForWinner(String[][] str) { for (int i =1;i<str.length; i+= 2) { if ( ( str[i][2] == str[i][6]) && ( str[i][6] == str[i][10]) && str[i][2] != " " && str[i][6] != " " && str[i][10] != " ") return str[i][2]; } for (int j =2;j<str[1].length; j+=4) { if ( ( str[1][j] == str[3][j]) && ( str[3][j] == str[5][j]) && str[1][j] != " " && str[3][j] != " " && str[5][j] != " ") return str[1][j]; } if ( (str[1][2] == str[3][6]) && (str[3][6] == str[5][10]) && str[1][2] != " " && str[3][6] != " " && str[5][10] != " " ) return str[1][2]; if ( (str[1][10] == str[3][6]) && (str[3][6] == str[5][2]) && str[1][10] != " " && str[3][6] != " " && str[5][2] != " " ) return str[1][10]; return "zero"; } public static void printArray(String[][] str) { //I guess this is the easiest method for (int i =0;i < str.length;i++) { for (int j =0;j < str[i].length;j++) { System.out.print(str[i][j]); } System.out.println(); } } public static void main (String[] args) { boolean play = true; String[][] original = fillEmptyArray(); printArray(original); int XorY = 0; String[][] updated; while (play) { if (XorY % 2 == 0) updated = playGameX(original); else updated = playGameO(original); XorY++; printArray(updated); if (checkForWinner(updated) != "zero") { System.out.print(checkForWinner(updated) + " have won"); play = false; } if (XorY > 8 ) { play = false; System.out.println("No one has won!"); } } } }
No comments:
Post a Comment