/**
* Java 1. Lesson 4. Tic-tac-toe in console
*
* @author Sergey Iryupin
* @version dated Jun 12, 2019
*/
import java.util.Random;
import java.util.Scanner;
class TicTacToe {
final int SIZE = 3;
final char DOT_X = 'x';
final char DOT_O = 'o';
final char DOT_EMPTY = '.';
char[][] map;
Random random;
Scanner scanner;
public static void main(String[] args) {
new TicTacToe().game();
}
TicTacToe() {
random = new Random();
scanner = new Scanner(System.in);
map = new char[SIZE][SIZE];
}
void game() {
initMap();
while (true) {
humanTurn();
if (checkWin(DOT_X)) {
System.out.println("YOU WON!");
break;
}
if (isMapFull()) {
System.out.println("Sorry, DRAW!");
break;
}
aiTurn();
printMap();
if (checkWin(DOT_O)) {
System.out.println("AI WON!");
break;
}
if (isMapFull()) {
System.out.println("Sorry, DRAW!");
break;
}
}
System.out.println("GAME OVER.");
printMap();
}
void initMap() {
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
map[i][j] = DOT_EMPTY;
}
void printMap() {
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++)
System.out.print(map[i][j] + " ");
System.out.println();
}
System.out.println();
}
void humanTurn() {
int x, y;
do {
System.out.println("Enter X and Y (1..3):");
x = scanner.nextInt() - 1;
y = scanner.nextInt() - 1;
} while (!isCellValid(x, y));
map[y][x] = DOT_X;
}
void aiTurn() {
int x, y;
do {
x = random.nextInt(SIZE);
y = random.nextInt(SIZE);
} while (!isCellValid(x, y));
map[y][x] = DOT_O;
}
boolean checkWin(char dot) {
// check horizontals
if (map[0][0] == dot && map[0][1] == dot && map[0][2] == dot) return true;
if (map[1][0] == dot && map[1][1] == dot && map[1][2] == dot) return true;
if (map[2][0] == dot && map[2][1] == dot && map[2][2] == dot) return true;
// check verticals
if (map[0][0] == dot && map[1][0] == dot && map[2][0] == dot) return true;
if (map[0][1] == dot && map[1][1] == dot && map[2][1] == dot) return true;
if (map[0][2] == dot && map[1][2] == dot && map[2][2] == dot) return true;
// check diagonals
if (map[0][0] == dot && map[1][1] == dot && map[2][2] == dot) return true;
if (map[2][0] == dot && map[1][1] == dot && map[0][2] == dot) return true;
return false;
}
boolean isMapFull() {
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
if (map[i][j] == DOT_EMPTY)
return false;
return true;
}
boolean isCellValid(int x, int y) {
if (x < 0 || y < 0 || x >= SIZE || y >= SIZE)
return false;
return map[y][x] == DOT_EMPTY; // by DSerov
}
}