Lógica del juego 2: Función puedeComer - aigora/twIE_2021-chkr_s-l GitHub Wiki
int puedeComer(int tablero[], int turno, int comidasPosibles[][3]);
La función toma como argumentos el tablero, donde se almacena el tipo de ficha que hay en cada casilla; el turno, es decir, que color está jugando, y el array comidasPosibles, que servirá para devolver una respuesta.
La función puedeComer devuelve la última primera coordenada rellenada en la matriz comidasPosibles y en esta devuelve, por cada avance de la primera coordenada, en la posición 0 de la segunda la pieza que puede comer, con un 1 la que pieza come, y con un 2 la posición en la que cae tras comer.
Como el movimiento de comer avanza la ficha que come dos casillas en cualquiera de las diagonales, todas las fichas que pueden ser comidas en un turno se encuentran en un cuadrado de 6x6 en el centro del tablero. La forma de encontrar las todas fichas que pueden comer en un determinado turno es buscar las fichas del color contrario en ese cuadrado de 6x6 y mirar a los alrededores de estas fichas a ver si puede ser comida.
Lo primero que se hace es hacer un bucle de 0 a 22, que son el número casillas que hay en el rectángulo superior de 8x6, y restringir estas casillas a que sean las del cuadrado de 6x6 de las esquina superior derecha usando la función _in.
for (i = 0; i <= 22; i++) //Para el cuadrado de 8x8
{
if (_in(i, -1))
{
//Si están en el cuadrado de 6x6 de arriba a la derecha
}
} |
Después de esto, se compensa por el desfase entre líneas. Como se ve en la imagen inferior para mover a la casilla de abajo a la derecha desde una fila par hay que sumar 5 a la posición actual, pero desde una fila impar solo hay que sumar 4.
En ambos casos sumaremos k pero esta cambiará su valor dependiendo de la fila. Como se aprecia en la imagen, para mover dos veces en la misma dirección siempre hay que sumar 9, independientemente de la fila de la que se parta. Al sumarle este k el cuadrado pasa a ser el central, donde podemos empezar a mirar si las piezas pueden ser comidas.
Para saber si una pieza se come debemos ver que a un lado haya una pieza del color del turno y en el lado opuesto la casilla esté vacía. Si estas condiciones se dan se rellena la fila correspondiente de la matriz comidasPosibles.
if (turno % 2 == 0 && (tablero[i + k] == 1 || tablero[i + k] == 4)) //Si es turno de amarillas y la pieza es morada
{
if ((tablero[i + 8] == 0 || tablero[i + 8] == 3) && tablero[i + 1] == 2) //Si la pueden comer de desde el suroeste
{
j++;
comidasPosibles[j][0] = i + 8;
comidasPosibles[j][1] = i + k;
comidasPosibles[j][2] = i + 1;
}
if ((tablero[i + 9] == 0 || tablero[i + 9] == 3) && tablero[i] == 2) //Si la pueden comer de desde el sureste
{
j++;
comidasPosibles[j][0] = i + 9;
comidasPosibles[j][1] = i + k;
comidasPosibles[j][2] = i;
}
if (tablero[i] == 3 && tablero[i + 9] == 2) //Si la pueden comer de desde el noroeste
{
j++;
comidasPosibles[j][0] = i;
comidasPosibles[j][1] = i + k;
comidasPosibles[j][2] = i + 9;
}
if (tablero[i + 1] == 3 && tablero[i + 8] == 2) //Si la pueden comer de desde el noreste
{
j++;
comidasPosibles[j][0] = i + 1;
comidasPosibles[j][1] = i + k;
comidasPosibles[j][2] = i + 8;
}
}
else if (turno % 2 == 1 && (tablero[i + k] == 0 || tablero[i + k] == 3)) //Si es turno de moradas y la pieza es amarilla
{
if ((tablero[i] == 1 || tablero[i] == 4) && tablero[i + 9] == 2) //Si la pueden comer de desde el noroeste
{
j++;
comidasPosibles[j][0] = i;
comidasPosibles[j][1] = i + k;
comidasPosibles[j][2] = i + 9;
}
if ((tablero[i + 1] == 1 || tablero[i + 1] == 4) && tablero[i + 8] == 2) //Si la pueden comer de desde el noreste
{
j++;
comidasPosibles[j][0] = i + 1;
comidasPosibles[j][1] = i + k;
comidasPosibles[j][2] = i + 8;
}
if (tablero[i + 8] == 4 && tablero[i + 1] == 2) //Si la pueden comer de desde el suroeste
{
j++;
comidasPosibles[j][0] = i + 8;
comidasPosibles[j][1] = i + k;
comidasPosibles[j][2] = i + 1;
}
if (tablero[i + 9] == 4 && tablero[i] == 2) //Si la pueden comer de desde el sureste
{
j++;
comidasPosibles[j][0] = i + 9;
comidasPosibles[j][1] = i + k;
comidasPosibles[j][2] = i;
}
}
Tras comprobar todas las direcciones de cada pieza se devuelve le valor de j, el último índice donde se ha introducido un valor en comidasPosibles.
return j;