Problem 3 in line in java

0

I'm doing a tic-tac-toe in java, but when in a line there are 3 equal figures, it does not tell you that you won, as if it did not fit the condition, for now just check in horizontal line to try, but do not why not check the winner

public TresEnRaya() {
    this.tablero = new String[3][3];

    //Y rellenamos el array con corchetes
    for (int i = 0; i < tablero.length; i++) {
        for (int j = 0; j < tablero[i].length; j++) {
            tablero[i][j] = "[]";
        }
    }

}

//Metodo que muestra el tablero
public void muestraTablero(TresEnRaya juego) {
    for (int i = 0; i < juego.tablero.length; i++) {
        for (int j = 0; j < juego.tablero[i].length; j++) {
            System.out.print(juego.tablero[i][j]);
            System.out.print("\t");
        }
        System.out.println("");
    }
}

//Metodo que realiza un movimiento del jugador 1
public void realizaMovimiento1() {
    Scanner teclado = new Scanner(System.in);
    int x;
    int y;

    //Automatizamos el nombre del jugador que le toca
    System.out.println("Turno de " + Jugador.lista_jugadores.get(0).getNombre_jugador().toString());
    //Pedimos los dastos de la coordenada que va a tachar
    System.out.println("Indique la posicion X: ");
    x = teclado.nextInt();
    System.out.println("Indique la posicion Y: ");
    y = teclado.nextInt();

    //comprobamos si esa casilla ya esta ocupada
    compruebaCasillaTachada(x, y, 0);

}

//metodo que realiza un movimiento del jugador 2
public void realizaMovimiento2() {

    Scanner teclado = new Scanner(System.in);
    int x;
    int y;
    //Repetimos el proceso del primer metodo, pero en este caso comprobaremos si es la maquina
    System.out.println("Turno de " + Jugador.lista_jugadores.get(1).getNombre_jugador().toString());
    //Si el jugador 2 es la maquina, automatizará sus movimientos, si no le pedira por teclado los dastos al segundo jugador
    if (Jugador.lista_jugadores.get(1).getNombre_jugador().equals("Maquina")) {

        //booleano que controlara cuando sale del bucle la jugada de la maquina
        boolean jugada_maquina = false;
        Random r = new Random();
        //nos devolvera un numero aleatorio entre 0 y 2
        x = r.nextInt(3);
        y = r.nextInt(3);
        do {
            if (tablero[x][y].equals(Jugador.lista_jugadores.get(0).getSimbolo_jugador().toString())
                    || tablero[x][y].equals(Jugador.lista_jugadores.get(1).getSimbolo_jugador().toString())) {
                x = r.nextInt(3);
                y = r.nextInt(3);
            } else {
                jugada_maquina = true;
            }
        } while (jugada_maquina = false);

    } else {
        System.out.println("Indique la posicion X: ");
        x = teclado.nextInt();
        System.out.println("Indique la posicion Y: ");
        y = teclado.nextInt();
    }

    compruebaCasillaTachada(x, y, 1);

}

//Metodo que muestra el menu de juego
public int muestraMenu() {

    int opcion;
    do {
        System.out.println("------- Menu -------");
        System.out.println("1 - Contra otro Jugador");
        System.out.println("2 - Contra la maquina");
        opcion = teclado.nextInt();

        if (opcion < 1 || opcion > 2) {
            System.out.println("Error: la opcion debe ser 1 o 2.");
        }

    } while (opcion < 1 || opcion > 2);

    return opcion;
}

//Metodo que comprueba si hay o no hay un ganador
public void compruebaGanador() {


    /*El for controla la primera posicion de la matriz[esta][] 
    y va cambiando de linea hacia abajo, primero la linea 0, luego la linea 1 y para acabar la linea 2*/
    /*El segundo for, controla la segunda posicion de la matriz[][esta], iterando sobre la posicion de la linea
     empezará en la posicion[0][0], luego [0][1] y para acabar [0][2]*/
    /*Y comenzara el primer for, para pasar de la linea 0 a la linea 1, y pasará al segundo for, y mirara las posiciones de esa linea(0,1 y 2) 
    y repetira el proceso hasta a acabar con la tercera linea*/
    /*Y repetiremos el mismo bucle 2 veces para que compruebe ambos jugadores*/
    int jugador = 0;
    do {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (tablero[i][j].toString().equals(Jugador.lista_jugadores.get(jugador).getSimbolo_jugador().toString())
                        && tablero[i][j].toString().equals(Jugador.lista_jugadores.get(jugador).getSimbolo_jugador().toString())
                        && tablero[i][j].toString().equals(Jugador.lista_jugadores.get(jugador).getSimbolo_jugador().toString())) {
                    System.out.println("Fin del Juego. El ganador es " + Jugador.lista_jugadores.get(jugador).getNombre_jugador().toString());
                }
            }
        }
        jugador++;
    } while (jugador < 2);

}

public void compruebaCasillaTachada(int x, int y, int jugador) {
    //comprobamos si esa casilla ya esta ocupada
    if (tablero[x][y].toString().equals(Jugador.lista_jugadores.get(0).getSimbolo_jugador().toString())
            || tablero[x][y].toString().equals(Jugador.lista_jugadores.get(1).getSimbolo_jugador().toString())) {
        System.out.println("ya esta tachada");
    } else {
        //Y la tachamos con el simbolo del jugador
        tablero[x][y] = "[" + Jugador.lista_jugadores.get(jugador).getSimbolo_jugador() + "]";
    }
}
    
asked by alvaro guerrero vallejo 06.08.2017 в 19:36
source

1 answer

0

Do not check the winner because you always ask for the same box in the if of the double for in the method void compruebaGanador() , you have to bear in mind that for a winner to be presented there are four possibilities Per row, per column or one of the two diagonals. Therefore the validation should be for cases with that eveitas go through the matrix

public boolean compruebaGanador(int x, int y, int jugador) {

    boolean ganador = false;
    String simbolo = "["+Jugador.lista_jugadores.get(jugador).getSimbolo_jugador().toString()+"]";

    //valida por fila
    if(tablero[x][0].equals(simbolo) && tablero[x][1].equals(simbolo) && tablero[x][2].equals(simbolo)){
       ganador = true;
       return ganador;
    }

    //validacion por columna
    if(tablero[0][y].equals(simbolo) && tablero[1][y].equals(simbolo) && tablero[2][y].equals(simbolo)){
       ganador = true;
       return ganador;
    }

    //validación diagonal principal
    if(tablero[0][0].equals(simbolo) && tablero[1][1].equals(simbolo) && tablero[2][2].equals(simbolo)){
        ganador = true;
       return ganador;
    }

    //validación diagonal secundaria
    if(tablero[0][2].equals(simbolo) && tablero[1][1].equals(simbolo) && tablero[2][0].equals(simbolo)){
        ganador = true;
       return ganador;
    }

    return ganador;
}

This method should be executed for each play that is made or at least from the fifth play (the first four do not give a winner) and not wait for the board to be full.

    
answered by 07.08.2017 в 23:30