Lógica del juego 3: Función puedeMover - aigora/twIE_2021-chkr_s-l GitHub Wiki

int puedeMover(int tablero[], int pieza, int movimientosPosibles[]);

Argumentos:

La función puedeMover toma como argumentos el tablero (almacena que tipo de ficha se encuentra en cada casilla en todo momento), la pieza pulsada en este turno y el array movimientos_posibles que utilizará como salida.

Salida:

Esta función devuelve las posiciones que a las que puede mover la ficha pasada en los argumentos en el array movimientosPosibles y la posición del último movimiento posible en el array movimientosPosibles.

¿Como lo hace?

Lo primero que ocurre en la función es la compensación por el desfase; que aparece al convertir el tablero, de dos dimensiones, al array tablero, de una dimensión por culpa del movimiento diagonal de las damas. Esto hace que para mover a la casilla de abajo a la derecha en una fila par haya que sumarle 5 a la posición de la que partimos, pero para hacer lo mismo desde una fila impar hay que sumarle solo 4. Esto se ve claramente en la imagen inferior.

Desfase-puede-Mover

La manera de solucionar este desfase es sumarle siempre j y que esta cambie según la línea en la que esté la pieza

if ((int)(pieza/4)%2 == 0) //Comprueba que tipo de casilla es
{
    j = 5;
}
else
{
    j = 4;
}

Tras esto comienza la función es sí. Primero se inicializa la i a -1 para que la función devuelva este valor en caso de que no se pueda hacer ningún movimiento. Tras esto se comprueba si la pieza no es un peón morado (antes de invocar la función hay un control que descarta que la pieza sea una casilla vacía, esto nos deja con que sea un peón amarillo o una dama de cualquiera de los dos colores, es decir, las piezas que mueven hacia arriba), y si no lo es, comprueba si puede mover hacia ambos lados o no (si está en el borde izquierdo no puede mover a la izquierda, si está en el borde de arriba no puede mover...) a partir de su posición con la función _in. Si la pieza puede mover hacia la esa dirección se comprueba si la casilla a la que llega está vacía y si es así introduce esa posición como movimiento posible en el vector movimientosPosibles y sumándole 1 al valor de la variable i. De manera sinónima se hace el movimiento de las piezas que no son peones amarillos y se devuelve el valor de i.

i = -1;
if (tablero[pieza] != 1) //Si la pieza no es amarilla tiene los siguientes movimientos
{
    if (!_in(pieza, 0))
    {
        if (tablero[pieza + j - 9] == 2)
        {
            i++;
            movimientosPosibles[i] = pieza + j - 9;
        }
    }

    if (!_in(pieza, 1))
    {
        if (tablero[pieza + j - 8] == 2)
        {
            i++;
            movimientosPosibles[i] = pieza + j - 8;
        }
    }
}

if (tablero[pieza] != 0) //Si la pieza no es morada tiene los siguientes movimientos
{
    if (!_in(pieza, 2))
    {
        if (tablero[pieza + j - 1] == 2)
        {
            i++;
            movimientosPosibles[i] = pieza + j - 1;
        }
    }

    if (!_in(pieza, 3))
    {
        if (tablero[pieza + j] == 2)
        {
            i++;
            movimientosPosibles[i] = pieza + j;
        }
    }
}

return i;

Nota: Se utiliza para la función que mover hacia abajo a la derecha dos casillas siempre corresponde con sumar 9 a la posición inicial.

⚠️ **GitHub.com Fallback** ⚠️