Features - 1.This program always takes constant time for playing a move and evaluating winning condition.
2.Game can be played on board of any size ,currently I've configured it for max Board size of 10 .
3.Currently only multiplayer mode is implemented ,single player with bot will be implemented soon .
NOTE- Conventions to play Tic-Tac-Toe game are as follows...
1.When it asked for size of the board enter single digit number for e.g -if you want to play on 3*3 then just enter "3" (without quotes of course) and press "enter".
2.When you want to play a move enter the row and column index of the position separated by a space .
e.g - If you want to enter a move on first column of first row then just enter "1 1" ( without double quotes ) and then press "enter".
here is the code ...............
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.*;
public class TicTacToeProblem {
static int size;
static int mode;
static HashMap < String, ArrayList < String >> player1RowsAndDiagonals = new HashMap < String, ArrayList < String >> (); //to keep track of rows and diagonal formation for player 1
static HashMap < String, ArrayList < String >> player2RowsAndDiagonals = new HashMap < String, ArrayList < String >> (); //to keep track of rows and diagonal formation for player 2
static HashMap < String, ArrayList < String >> player1Columns = new HashMap < String, ArrayList < String >> (); //to keep track of column formation for player 1
static HashMap < String, ArrayList < String >> player2Columns = new HashMap < String, ArrayList < String >> (); //to keep track of column formation for player 2
static HashSet < String > filledPositions = new HashSet < String > ();
public static void main(String[] args) throws NumberFormatException,
IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Please enter the size of board in numeral");
size = Integer.parseInt(br.readLine());
while ((size > 10) == true) {
System.out.println("Max size allowed is 10");
System.out.println("please re enter the size");
size = Integer.parseInt(br.readLine());
}
System.out.println("please enter playing mode number");
System.out.println("1.two player");
System.out.println("2.with bot");
mode = Integer.parseInt(br.readLine());
while (mode != 1 && mode != 2) {
System.out.println("Please enter appropriate choice of mode 1 or 2");
mode = Integer.parseInt(br.readLine());
}
if (mode == 1) {
System.out.println("Initializing Setup..........");
multiplayer(size);
} else
withBot(size);
br.close();
}
public static void multiplayer(int size) throws IOException {
String[] playerMove = null;
String move = null;
int coordinateX;
int coordinateY;
int player;
int secondDiagonalSum = size + 1;
int maxMoves = size * size;
for (int i = 1; i <= size; i++) { //here just initializing arrayLists for each rows and each columns for both players
ArrayList < String > rowList1 = new ArrayList < String > ();
ArrayList < String > rowList2 = new ArrayList < String > ();
ArrayList < String > columnList1 = new ArrayList < String > ();
ArrayList < String > columnList2 = new ArrayList < String > ();
player1RowsAndDiagonals.put((new Integer(i).toString()), rowList1);
player2RowsAndDiagonals.put((new Integer(i).toString()), rowList2);
player1Columns.put((new Integer(i).toString()), columnList1);
player2Columns.put((new Integer(i).toString()), columnList2);
}
ArrayList < String > player1diag1 = new ArrayList < String > (); //here initializing arrayLists to keep track of both the diagonals for both players
ArrayList < String > player1diag2 = new ArrayList < String > ();
ArrayList < String > player2diag1 = new ArrayList < String > ();
ArrayList < String > player2diag2 = new ArrayList < String > ();
player1RowsAndDiagonals.put("diag1", player1diag1);
player1RowsAndDiagonals.put("diag2", player1diag2);
player2RowsAndDiagonals.put("diag1", player2diag1);
player2RowsAndDiagonals.put("diag2", player2diag2);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("OK,now start playing enter your choices alternatively");
for (int i = 0; i < maxMoves; i++) {
if (i % 2 == 0) {
System.out.println("player 1 turn");
player = 1;
} else {
System.out.println("player 2 turn");
player = 2;
}
move = br.readLine();
while (filledPositions.contains(move) == true) { //check for already played Move
System.out.println("this move has been already played please enter another move");
move = br.readLine();
}
filledPositions.add(move);
playerMove = move.split(" ");
coordinateX = Integer.parseInt(playerMove[0]);
coordinateY = Integer.parseInt(playerMove[1]);
switch (player) {
case 1:
if (playerMove[0].equals(playerMove[1])) { //condition for one of the position in diagonal one
player1RowsAndDiagonals.get("diag1").add(playerMove[1]);
player1RowsAndDiagonals.get(playerMove[0]).add(playerMove[1]);
player1Columns.get(playerMove[1]).add(playerMove[0]);
if ((coordinateX + coordinateY) == secondDiagonalSum) //condition for one of the position in diagonal two
player1RowsAndDiagonals.get("diag2").add(playerMove[1]);
if ((player1Columns.get(playerMove[1]).size() == size) || (player1RowsAndDiagonals.get("diag1").size() == size) || (player1RowsAndDiagonals.get(playerMove[0]).size() == size) || (player1RowsAndDiagonals.get("diag2").size() == size)) {
System.out.println("Player 1 wins game is finished");
return;
}
} else {
player1RowsAndDiagonals.get(playerMove[0]).add(playerMove[1]);
player1Columns.get(playerMove[1]).add(playerMove[0]);
if ((coordinateX + coordinateY) == secondDiagonalSum)
player1RowsAndDiagonals.get("diag2").add(playerMove[1]);
if ((player1Columns.get(playerMove[1]).size() == size) || (player1RowsAndDiagonals.get("diag1").size() == size) || (player1RowsAndDiagonals.get(playerMove[0]).size() == size) || (player1RowsAndDiagonals.get("diag2").size() == size)) {
System.out.println("Player 1 wins game is finished");
return;
}
}
break;
case 2:
if (playerMove[0].equals(playerMove[1])) {
player2RowsAndDiagonals.get("diag1").add(playerMove[1]);
player2RowsAndDiagonals.get(playerMove[0]).add(playerMove[1]);
player2Columns.get(playerMove[1]).add(playerMove[0]);
if ((coordinateX + coordinateY) == secondDiagonalSum)
player2RowsAndDiagonals.get("diag2").add(playerMove[1]);
if ((player2Columns.get(playerMove[1]).size() == size) || (player2RowsAndDiagonals.get("diag1").size() == size) || (player2RowsAndDiagonals.get(playerMove[0]).size() == size) || (player2RowsAndDiagonals.get("diag2").size() == size)) {
System.out.println("Player 1 wins game is finished");
return;
}
} else {
player2RowsAndDiagonals.get(playerMove[0]).add(playerMove[1]);
player2Columns.get(playerMove[1]).add(playerMove[0]);
if ((coordinateX + coordinateY) == secondDiagonalSum)
player2RowsAndDiagonals.get("diag2").add(playerMove[1]);
if ((player2Columns.get(playerMove[1]).size() == size) || (player2RowsAndDiagonals.get("diag1").size() == size) || (player2RowsAndDiagonals.get(playerMove[0]).size() == size) || (player2RowsAndDiagonals.get("diag2").size() == size)) {
System.out.println("Player 2 wins game is finished");
return;
}
}
break;
default:
break;
}
} //end of loop
System.out.println("Match Tie NO one Wins");
}
public static void withBot(int size) {
System.out.println("Working on it, this mode will be added soon till then keep playing multiplayer mode");
return;
}
}