#include<stdio.h>
#include<stdlib.h> 

/*
    TRES EN RAYA
*/

#define TAM 3

int main(){
    // Variables
    int tablero[TAM][TAM]={0};
    int i,j,final, fila, columna, tirada=0;
    char estado[1]="-";

    // Variables de comprobación
    int ganador1=3;
    int ganador2=15;



    do{
        
        //Muestra el estado del tablero
        printf("\n     |\t0\t1\t2\t<< Columna\n");
        printf("_____|____________________________________\n");
        printf("     |\n");
        for(i=0; i<TAM; i++){
            printf("  %d  |\t",i);
            for(j=0; j<TAM; j++){
                if(tablero[i][j]==0){
                    fflush(stdin);
                    estado[0] = '-';
                }else if(tablero[i][j]==1){
                    fflush(stdin);
                    estado[0] = 'X';
                }else{
                    fflush(stdin);
                    estado[0] = 'O';
                }


                printf("%s\t", estado);
            }
            printf("\n");
        }
        printf("     |\n  ^  |\nFila |\n\n");        


        // TURNO JUGADOR 1

        printf("\n ---------------");
        printf("\n Turno jugador 1");
        printf("\n ---------------");

        do{
            printf("\n Elige una fila: ");
            // Pedir Fila y control de nº fila correcto
            do{
                scanf("%d", &fila);
                if(fila<0||fila>2){
                    printf("\nSolo hay filas del 0 al 2.");
                    printf("\nVuelve a intentarlo: ");
                }
            }while (fila<-1||fila>2);


            printf(" Elige una columna: ");

            // Pedir Columna y control de nº columna correcto
            do{
                scanf("%d", &columna);
                if(columna<0||columna>2){
                    printf("\nSolo hay columnas del 0 al 3.");
                    printf("\nVuelve a intentarlo: ");
                }
            }while (columna<-1||columna>2);

            // Control si la posición está ocupada (error) o es una posición correcta
            if(tablero[fila][columna]!=0){ 
                printf("\nCasilla ocupada.");
                printf("\nVuelve a intentarlo:\n");
            }else{
                tablero[fila][columna]=1;
                tirada=1;
            }

        }while(tirada!=1);

        tirada=0;

        //Comprobar si hay ganador o empate
        if(ganador1==tablero[0][0]+tablero[0][1]+tablero[0][2]||
            ganador1==tablero[1][0]+tablero[1][1]+tablero[1][2]||
            ganador1==tablero[2][0]+tablero[2][1]+tablero[2][2]||
            ganador1==tablero[0][0]+tablero[1][0]+tablero[2][0]||
            ganador1==tablero[0][1]+tablero[1][1]+tablero[2][1]||
            ganador1==tablero[0][2]+tablero[1][2]+tablero[2][2]||
            ganador1==tablero[0][0]+tablero[1][1]+tablero[2][2]||
            ganador1==tablero[0][2]+tablero[1][1]+tablero[2][0]){
            printf("\n#########################");
            printf("\n#   GANADOR JUGADOR 1   #");
            printf("\n#########################\n");
            final=1;
        }
        
        if(ganador2==tablero[0][0]+tablero[0][1]+tablero[0][2]||
            ganador2==tablero[1][0]+tablero[1][1]+tablero[1][2]||
            ganador2==tablero[2][0]+tablero[2][1]+tablero[2][2]||
            ganador2==tablero[0][0]+tablero[1][0]+tablero[2][0]||
            ganador2==tablero[0][1]+tablero[1][1]+tablero[2][1]||
            ganador2==tablero[0][2]+tablero[1][2]+tablero[2][2]||
            ganador2==tablero[0][0]+tablero[1][1]+tablero[2][2]||
            ganador2==tablero[0][2]+tablero[1][1]+tablero[2][0]){
            printf("\n#########################");
            printf("\n#   GANADOR JUGADOR 2   #");
            printf("\n#########################\n");
            final=1;
        }
        
        if(tablero[0][0]!=0&&tablero[1][0]!=0&&tablero[2][0]!=0&&
                tablero[0][1]!=0&&tablero[1][1]!=0&&tablero[2][1]!=0&&
                tablero[0][2]!=0&&tablero[1][2]!=0&&tablero[2][2]!=0){
            printf("\n##############");
            printf("\n#   EMPATE   #");
            printf("\n##############\n");
            final=1;
        }


        //Muestra el estado del tablero
        printf("\n     |\t0\t1\t2\t<< Columna\n");
        printf("_____|____________________________________\n");
        printf("     |\n");
        for(i=0; i<TAM; i++){
            printf("  %d  |\t",i);
            for(j=0; j<TAM; j++){
                if(tablero[i][j]==0){
                    fflush(stdin);
                    estado[0] = '-';
                }else if(tablero[i][j]==1){
                    fflush(stdin);
                    estado[0] = 'X';
                }else{
                    fflush(stdin);
                    estado[0] = 'O';
                }


                printf("%s\t", estado);
            }
            printf("\n");
        }
        printf("     |\n  ^  |\nFila |\n\n");  


        // TURNO JUGADOR 2

        printf("\n ---------------");
        printf("\n Turno jugador 2");
        printf("\n ---------------");

        do{
            printf("\n Elige una fila: ");
            // Pedir Fila y control de nº fila correcto
            do{
                scanf("%d", &fila);
                if(fila<0||fila>2){
                    printf("\nSolo hay filas del 0 al 2.");
                    printf("\nVuelve a intentarlo: ");
                }
            }while (fila<-1||fila>2);


            printf(" Elige una columna: ");

            // Pedir Columna y control de nº columna correcto
            do{
                scanf("%d", &columna);
                if(columna<0||columna>2){
                    printf("\nSolo hay columnas del 0 al 3.");
                    printf("\nVuelve a intentarlo: ");
                }
            }while (columna<-1||columna>2);

            // Control si la posición está ocupada (error) o es una posición correcta
            if(tablero[fila][columna]!=0){ 
                printf("\nCasilla ocupada.");
                printf("\nVuelve a intentarlo:\n");
            }else{
                tablero[fila][columna]=5;
                tirada=1;
            }

        }while(tirada!=1);

        tirada=0;
        

        

        //Comprobar si hay ganador o empate
        if(ganador1==tablero[0][0]+tablero[0][1]+tablero[0][2]||
            ganador1==tablero[1][0]+tablero[1][1]+tablero[1][2]||
            ganador1==tablero[2][0]+tablero[2][1]+tablero[2][2]||
            ganador1==tablero[0][0]+tablero[1][0]+tablero[2][0]||
            ganador1==tablero[0][1]+tablero[1][1]+tablero[2][1]||
            ganador1==tablero[0][2]+tablero[1][2]+tablero[2][2]||
            ganador1==tablero[0][0]+tablero[1][1]+tablero[2][2]||
            ganador1==tablero[0][2]+tablero[1][1]+tablero[2][0]){
            printf("\n#########################");
            printf("\n#   GANADOR JUGADOR 1   #");
            printf("\n#########################\n");
            final=1;
        }
        
        if(ganador2==tablero[0][0]+tablero[0][1]+tablero[0][2]||
            ganador2==tablero[1][0]+tablero[1][1]+tablero[1][2]||
            ganador2==tablero[2][0]+tablero[2][1]+tablero[2][2]||
            ganador2==tablero[0][0]+tablero[1][0]+tablero[2][0]||
            ganador2==tablero[0][1]+tablero[1][1]+tablero[2][1]||
            ganador2==tablero[0][2]+tablero[1][2]+tablero[2][2]||
            ganador2==tablero[0][0]+tablero[1][1]+tablero[2][2]||
            ganador2==tablero[0][2]+tablero[1][1]+tablero[2][0]){
            printf("\n#########################");
            printf("\n#   GANADOR JUGADOR 2   #");
            printf("\n#########################\n");
            final=1;
        }
        
        if(tablero[0][0]!=0&&tablero[1][0]!=0&&tablero[2][0]!=0&&
                tablero[0][1]!=0&&tablero[1][1]!=0&&tablero[2][1]!=0&&
                tablero[0][2]!=0&&tablero[1][2]!=0&&tablero[2][2]!=0){
            printf("\n##############");
            printf("\n#   EMPATE   #");
            printf("\n##############\n");
            final=1;
        }




    }while(final!=1);

    return 0;
}