package Übungen.TicTac;

import java.util.Random;
import java.util.Scanner;

public class TicTacToe {
	static String[][] spielField = new String[3][3];
	static String zufälligeZuges = "X";
	static String menschlichenZuges = "O";

	public static void Spielfelde() {

		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++)
				spielField[i][j] = " ";

	}

	public static void SpielfeldeAusgeben() {

		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++)
				System.out.print("[" + spielField[i][j] + "]");

			System.out.println();
		}
	}

	public static void zufälligKreuz() {
		Random rand = new Random();

		while (true) {
			int x = rand.nextInt(3);
			int y = rand.nextInt(3);
			if (spielField[x][y].equals(" ")) {
				spielField[x][y] = zufälligeZuges;
				break;
			} else
				continue;

		}

	}

	public static void menschlichenZuges(int x, int y) {

		while (true) {
			if (spielField[x][y].equals(" ")) {
				spielField[x][y] = menschlichenZuges;
				break;
			} else {
				System.out.println("Falsche Eingabe, Versuche bitte nochmal!");
				continue;
			}

		}

	}

	public static boolean checkGewinner() {
		// Zeilen überprüfen
		for (int i = 0; i < 3; i++) {
			if ((spielField[i][0].equals(zufälligeZuges) && spielField[i][1].equals(zufälligeZuges)
					&& spielField[i][2].equals(zufälligeZuges))
					|| (spielField[i][0].equals(menschlichenZuges) && spielField[i][1].equals(menschlichenZuges)
							&& spielField[i][2].equals(menschlichenZuges))) {
				return true;
			}
		}

		// Spalten überprüfen
		for (int i = 0; i < 3; i++) {
			if ((spielField[0][i].equals(zufälligeZuges) && spielField[1][i].equals(zufälligeZuges)
					&& spielField[2][i].equals(zufälligeZuges))
					|| (spielField[0][i].equals(menschlichenZuges) && spielField[1][i].equals(menschlichenZuges)
							&& spielField[2][i].equals(menschlichenZuges))) {
				return true;
			}
		}

		// Diagonalen überprüfen
		if ((spielField[0][0].equals(zufälligeZuges) && spielField[1][1].equals(zufälligeZuges)
				&& spielField[2][2].equals(zufälligeZuges))
				|| (spielField[0][0].equals(menschlichenZuges) && spielField[1][1].equals(menschlichenZuges)
						&& spielField[2][2].equals(menschlichenZuges))) {
			return true;
		}
		if ((spielField[0][2].equals(zufälligeZuges) && spielField[1][1].equals(zufälligeZuges)
				&& spielField[2][0].equals(zufälligeZuges))
				|| (spielField[0][2].equals(menschlichenZuges) && spielField[1][1].equals(menschlichenZuges)
						&& spielField[2][0].equals(menschlichenZuges))) {
			return true;
		}

		return false;
	}

	public static boolean istSpielfeldVoll() {
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				if (spielField[i][j].equals(" ")) {
					return false;
				}
			}
		}
		return true;
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("<< Willkommen in Tic Tac Toe >> ");
		Spielfelde();
		SpielfeldeAusgeben();

		boolean aktiv = true;
		while (aktiv) {
			System.out.println("Gib bitte Position x und Position y ein: ");
			int x = scan.nextInt();
			int y = scan.nextInt();
			menschlichenZuges(x, y);
			SpielfeldeAusgeben();

			if (checkGewinner()) {
				System.out.println("Spieler O hat gewonnen!");
				aktiv = false;
			} else if (istSpielfeldVoll()) {
				System.out.println("Unentschieden!");
				aktiv = false;
			}

			if (aktiv) {
				System.out.println("Ein Kreuz wird zufällig gesetzt");
				zufälligKreuz();
				SpielfeldeAusgeben();

				if (checkGewinner()) {
					System.out.println("Spieler X hat gewonnen!");
					aktiv = false;
				} else if (istSpielfeldVoll()) {
					System.out.println("Unentschieden!");
					aktiv = false;
				}
			}
		}
		scan.close();
	}

}
