import java.io.*; import java.util.Scanner; public class Tateti { private String matriz [][] = new String[3][3]; //tabla principal private char turno[] = {'X','O'};//el turno 0 == primer jugador(X) 1 == Segundo Jugador (O) private char numeroJugada[]={'a','b','c','d','e','f','g','h','i'};//indica la jugada actual private String jugadaGanadora[][] = {{"","",""},{"","",""}}; //colores que agregaremos a la salida de consola private static final String ANSI_RED = "\u001B[31m"; //error private static final String ANSI_RESET = "\u001B[0m";//color entrada private static final String ANSI_GREEN = "\u001B[32m";//ganador private static final String ANSI_YELLOW = "\u001B[33m";//matriz Tateti(){ for (int i = 0; i < matriz.length; i++) { for (int j = 0; j < matriz.length; j++) { matriz [i][j]=""; } } } public void jugar(){ //creamos un scanner para ingresar los datos Scanner entrada = new Scanner(System.in); int nroJugada = 0; System.out.println("Bienvenidos al TA-TE-TI de Cristhian Ortellado del Bootcamp 004 de Roshka (Filas = {A, B, C})"); do { System.out.println(numeroJugada[nroJugada] + ". "+turno[nroJugada%2]+" -> Ingrese una jugada:"); String movimiento = entrada.nextLine(); //si la entrada y jugada es valida entonces rellenamos la matriz if (comprobarEntrada(movimiento) && comprobarMovimiento(movimiento)){ int fila = casillaActual(movimiento.charAt(0)); int columna = (int)casillaActual(movimiento.charAt(1)); matriz[fila][columna] = turno[nroJugada%2]+""; //guardamos la jugada jugadaGanadora[nroJugada%2][nroJugada/2]= movimiento; imprimirMatriz(); if (ganador()) { System.out.printf("%s%s%s%s",ANSI_GREEN," GANADOR ",turno[nroJugada%2]," :"); if (jugadaGanadora[1][2].length()==0) System.out.printf("%s",jugadaGanadora[0][0]+"-" +jugadaGanadora[0][1]+"-"+jugadaGanadora[0][2]+"\n"); else System.out.printf("%s",jugadaGanadora[1][0]+"-" +jugadaGanadora[1][1]+"-"+jugadaGanadora[1][2]+"\n"); System.out.println(ANSI_GREEN +" JUEGO FINALIZADO"); return; } nroJugada++; if (nroJugada==9) { System.out.println(ANSI_GREEN +" EMPATE "+turno[nroJugada%2] +ANSI_RESET); System.out.println(ANSI_GREEN +" JUEGO FINALIZADO"); return; } } } while (true); } /** * Funcion que comprueba si la matriz posee algun ganador * @return retorna true si hubo algun ganador */ private boolean ganador(){ //comprueba si alguien gano //diagonales if (matriz[0][0].equals(matriz[1][1]) && matriz[0][0].equals(matriz[2][2]) && matriz[0][0].length()>0) return true; if (matriz[0][2].equals(matriz[1][1]) && matriz[0][2].equals(matriz[2][0]) && matriz[0][2].length()>0) return true; //columnas if (matriz[0][0].equals(matriz[1][0]) && matriz[0][0].equals(matriz[2][0]) && matriz[0][0].length()>0) return true; if (matriz[0][1].equals(matriz[1][1]) && matriz[0][1].equals(matriz[2][1]) && matriz[0][1].length()>0) return true; if (matriz[0][2].equals(matriz[1][2]) && matriz[0][2].equals(matriz[2][2]) && matriz[0][2].length()>0) return true; //filas if (matriz[0][0].equals(matriz[0][1]) && matriz[0][0].equals(matriz[0][2]) && matriz[0][0].length()>0) return true; if (matriz[1][0].equals(matriz[1][1]) && matriz[1][0].equals(matriz[1][2]) && matriz[1][0].length()>0) return true; if (matriz[2][0].equals(matriz[2][1]) && matriz[2][0].equals(matriz[2][2]) && matriz[2][0].length()>0) return true; return false; } private void imprimirMatriz(){ for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++){ if (matriz[i][j].length()==0) { System.out.printf("%s|--%s",ANSI_YELLOW, matriz[i][j]); }else{ System.out.printf("%s|%s",ANSI_YELLOW, matriz[i][j]); } } System.out.println("|"); } System.out.println(ANSI_RESET); } /** * @param entrada es el movimiento el cual el jugador desea realizar * @return retorna true si es una jugada valida */ private boolean comprobarEntrada(String entrada){ if (entrada.length()!=2 ) { System.out.println( ANSI_RED+"Error: Jugada Inválida - Solo ingrese el numero de caracteres solicitados"+ANSI_RESET); return false; } char fila = entrada.charAt(0); char columna = entrada.charAt(1); //comprobamos el primer y segundo caracter if (fila !='A' && fila != 'B' && fila != 'C' || columna != '1' && columna != '2' && columna != '3'){ System.out.println( ANSI_RED+"ERROR :Jugada Invalida - Formato Invalido"+ANSI_RESET); return false; } if (fila != 'A' & fila != 'B' && fila != 'C' && columna != '1' && columna != 'B' && columna != '3'){ System.out.println( ANSI_RED+"Error: Jugada Invalida - Fila y Columna Invalidas"+ANSI_RESET); return false; } if (fila != 'A' && fila != 'B' && fila != 'C' ){ System.out.println( ANSI_RED+"Error: Jugada Inválida - Fila Invalida"+ANSI_RESET); return false; } if (columna != '1' & columna != '2' && columna != '3' ){ System.out.println( ANSI_RED+"Error: Jugada Inválida - Columna Invalida"+ANSI_RESET); return false; } return true; } /** * * @param jugada es una entrada valida en formato y rango * @return retorna true si la jugada insertada se puede realizar */ private boolean comprobarMovimiento(String jugada){ //comprobamos la jugada con los criterios correspondientes int fila = casillaActual(jugada.charAt(0)); int columna = (int)casillaActual(jugada.charAt(1));//casteamos la columna //comprobamos si la casilla esta ocupada if (matriz[fila][columna].length()!=0) { System.out.println( ANSI_RED+"Jugada Invalida - Casilla Ocupada"+ANSI_RESET); return false; } return true; } /** * @param jugada es la columna que ingreso el jugador * @return retorna el indice de la columna */ private int casillaActual(char jugada){ switch (jugada) { case 'A': return 0; case 'B': return 1; case 'C': return 2; case '1': return 0; case '2': return 1; case '3': return 2; default: break; } return 0; } public static void main(String[] args) { Tateti tateti = new Tateti(); tateti.jugar(); } }