package tutorialJava.capitulo4_Arrays.ejercicios.bloque07_tresEnRaya;

import tutorialJava.Utils;
import tutorialJava.UtilsArrays;

public class TresEnRaya {

	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		int t[][] = new int[3][3];
//		int t[][] = new int[][] {{2, 1, 1}, 
//								 {1, 2, 2}, 
//								 {2, 2, 0}};
		int turno = 1;
		inicializaTablero(t);
		do {
			// Muestro tablero
			imprimieTablero(t);
			// Pido jugada a jugador (turno)
			pidoJugadaAJugador(t, turno);
			// Cambiar turno
			turno = cambiaTurno(turno);
		} while (ganadorDelJuego(t) == 0 && !hayEmpate(t));
		
		// Imprimo ganador o empate
		int ganador = ganadorDelJuego(t);
		if (ganador != 0) {
			System.out.println("Ha ganado el jugador " + ganador);
		}
		else {
			System.out.println("Hay un empate");
		}
	}

	
	/**
	 * 
	 * @param t
	 */
	public static void inicializaTablero(int t[][]) {
		// Ponemos todos los valores a "0"
		for (int i = 0; i < t.length; i++) {
			for (int j = 0; j < t[i].length; j++) {
				t[i][j] = 0;
			}
		}
	}
	
	
	/**
	 * 
	 * @param t
	 */
	public static void imprimieTablero(int t[][]) {
		System.out.println("\nTablero actual: ");
		
		for (int i = 0; i < t.length; i++) {
			for (int j = 0; j < t[i].length; j++) {
				System.out.print( (t[i][j] != 0)? (t[i][j] == 1)? "X" : "O" : "-");
				System.out.print("\t");
			}
			System.out.println();
		}
	}
	
	/**
	 * 
	 * @param t
	 * @return
	 */
	public static int ganadorDelJuego(int t[][]) {
		// Compruebo cada fila
		for (int i = 0; i < t.length; i++) {
			if (t[i][0] == t[i][1] && t[i][1] == t[i][2]) {
				return t[i][0];
			}
		}

		// Compruebo cada columna
		for (int i = 0; i < t[0].length; i++) {
			if (t[0][i] == t[1][i] && t[1][i] == t[2][i]) {
				return t[0][i];
			}
		}
		
		// Compruebo las diagonales
		if (t[0][0] == t[1][1] && t[1][1] == t[2][2]) {
			return t[0][0];
		}
		
		if (t[0][2] == t[1][1] && t[1][1] == t[2][0]) {
			return t[0][2];
		}
		
		// si llego hasta aquí, sé que el juego no se ha acabado.
		return 0;
	}
	
	
	/**
	 * 
	 * @return
	 */
	public static boolean hayEmpate (int t[][]) {
		for (int i = 0; i < t.length; i++) {
			for (int j = 0; j < t[i].length; j++) {
				if (t[i][j] == 0) {
					return false;
				}
			}
		}
		return true;
	}
	
	/**
	 * 
	 * @param t
	 * @param jugador
	 */
	public static void pidoJugadaAJugador (int t[][], int jugador) {
		int filaJugada = 0, columnaJugada = 0;
		boolean casillaOcupada = false;
		
		System.out.println("Turno del jugador: " + jugador);
		
		do {
			casillaOcupada = false;
			filaJugada = Utils.obtenerEnteroEntreLimites("Introduzca la fila de su jugada: ", 0, 2);
			columnaJugada = Utils.obtenerEnteroEntreLimites("Introduzca la columna de su jugada: ", 0, 2);
			
			if (t[filaJugada][columnaJugada] != 0) {
				System.out.println("La posición que ha pedido está ocupada, vuelva a intentarlo.");
				casillaOcupada = true;
			}
		} while (casillaOcupada);
		
		// Establezco la jugada del usuario
		t[filaJugada][columnaJugada] = jugador;
	}
	
	
	/**
	 * 
	 * @param turno
	 * @return
	 */
	public static int cambiaTurno(int turno) {
		return (turno % 2) + 1;
	}
}








