ayuda con ajedrez y movimiento de la reina (c++)

Hola a todos,

vereis estoy haciendo un programa en el cual necesito calcular los posibles movimientos de la reina de ajedrez desde una posicion inicial

estoy considerando que el tablero es una matriz de 8x8 pero el problema esta en q no soy capaz de encontrar alguna regla que me determine que una casilla es valida para que la reina se mueva ahi

no se si me explico

sino lo entendeis os dejo un pdf, es el ultimo ejercicio

a ver si a alguien se le ocurre como pq a mi no cawento

salu2

Adjuntos

Podrías hacer una manera... digamos con "ángulos", 0+Pi/4*n. Si la coordenada cumple eso, entonces es una solución posible.
//Borrada otra solución porque creo que era erronea.
uff con angulos no se plantearlo y respecto a la otra solucion yo tengo ya tengo un procedimiento para comprobar las que las coordenadas sean coherentes al tablero

pero lo que falta es por ejemplo, la poscion inicial es h5 y que el algoritmo recorra la matriz y me diga esbriendo en la casilla una p
que me puedo mover a esa casilla

pero no encuentro la manera de diferenciar las casillas validas de las no validas
Yo hice algo parecido en Java y con alfiles; para comprobar si una casilla es valida supongo q sera conforme a los movimientos de la reina:
- Q este en la misma fila
- Q este en la misma columna
- Q se mueva en diagonal, para ello te copio la explicacion q puse en mi ejercicio:
/*los alfiles mueven en diagonal con lo que el valor absoluto de la resta de las coordenadas del origen y de la nueva posicion deben ser iguales*/

Y ahora lo pienso xq no se q coño queria decir cuando lo hice :Ð
Hay la manera chapucera, que sería coger las 8 casillas colindantes y llamar a la funcion para cada una hasta que se terminara el tablero.

P.ej.
AAA
AXA
AAA

X=Reina
La primera A está situada en la posición Xx-1, Xy-1, coges el (-1,-1) como desplazamiento.
desplaza(x,y,-1,-1)
y luego las otras 7 igual XD


funcion desplaza(int x,int y,int x_desp,int y_desp) {
x+=x_desp;
y+=y_desp;
if (dentroTablero(x,y)) {
escribir P en (x,y)
desplaza(x,y,x_desp,y_desp);
}
}

Si tienes que recorrer, ahora mismo no se me ocurre nada diferente de los ángulos.
A mi se me ocurre otra forma, si lo que quieres es moverte 3 casillas en diagonal a la derecha, pues eso no es otra cosa que 3 casillas arriba + 3 casillas a la derecha, y vas a parar al mismo punto. Tambien es un poco chapuza, pero el destino es el mismo xD
Lo de los ángulos... XDXDXD
Si Xx-Ax o Xy-Ay son cero, válidas
Si no, miras si los valores que te han dado, el valor absoluto de su tangente es uno, si lo es son validos.
Si no, no son válidos XD
Esto está tirao XD . Dame un ratito y te hago hasta la parte voluntaria.
Juer, ¿he llegado a leer ángulos?
Si que os gusta a algunos complicaros la vida :P :P

A ver, ¿conoces la posición inicial de la reina no? Supongamos que está en la posición [i,j]
Pues a partir de ahí, todas las casillas [i+1 ... 7, j] [0...i-1,j] son posiciones válidas. Ese es el movimiento horizontal. Ídem para el movimiento vertical para la j.

Por supuesto estoy suponiendo un tablero de 8x8, pero todo esto es aplicable a un tablero de cualquier tamaño.

Para las diagonales la cosa está en unir los dos movimientos con todas sus combinaciones, las casillas válidas serán
[i+1 ...7, j+1 ... 7]
[0...i-1, 0... j-1]
[i+1...7, 0 ... j-1]
[0 ... i-1, j+1 ... 7]

para hacer las 4 diagonales.

Lo único que has de hacer es una matriz de 8x8 y marcar esas casillas válidas, para luego imprimir cada casilla del tablero de forma correcta, o bien puedes calcularlo "on the fly" cuando pulses la opción de imprimir. Lo primero ocupa más memoria pero es más cómodo a la hora de imprimir (sólo tienes que recorrer la matriz e imprimir '-' o '?' según la casilla esté marcada o no) Pero tienes que acordarte de borrar la matriz de nuevo al mover la reina.

Y si quieres hacer la mayor burrada de tu vida, busca sobre algoritmos de búsqueda en espacios de estados, que es una rama de la intelligencia artificial, pero te aconsejo que NO te molestes tanto para una práctica así ;)
De hecho una BEE es la otra cosa que te recomendaba eTc_84,(lo de recorrer las casillas colindantes y todo eso) lo que pasa que sin seguir ninguna optimización (poda o heurística)
zheo escribió:Juer, ¿he llegado a leer ángulos?
Si que os gusta a algunos complicaros la vida :P :P

Fui yo [carcajad], era para el caso de las diagonales... ahora que lo pienso.. hay una forma más fácil.. si la resta Xx-Ax y Xy-Ay son iguales, y así eliminas ángulos y leches XD
De todas formas lo que yo explicaba sobre los ángulos era para saber si una posición [x,y] pertenecía a las posibles de la Reina, no para encontrarlas todas [oki]
Puede que diga una barbaridad pero estoy sobao y practicamente no he dormido nada...

Imaginemos que tenemos la ficha en 2,2

Pues en una diagonal podrian ser
1,1
3,3
4,4
5,5
6,6
7,7

por lo que sumanos o restamos el mismo número a "i" y a "j"

y para la otra diagonal bastaria con restas a "i" y sumar a "j" el mismo número y restar a "i" y sumar a "j" el mismo numero.

Y para arriba, abajo, izq y dch bastaria con restar o sumar un numero o a "i" o a "j".

¿¿¿no??

¿Se nota que hace un año sólo estudié c++ durante unos pocos meses?
[angelito]
wow, otro de la univerisidad de alicante [666]

Aunque me he visto por encima tu practica la verdad es que no parece muy complicado, me recuerda bastante a la que tuve que hacer el año pasado por estas fechas (contar en una matriz el numero de diagonales derechas y diagonales izquierda que tenia). Aunque este tuyo me parece un poquitillo mas sencillo.

Por cierto: la reina se puede mover en todas las direcciones un total de n pasos (es decir, puede moverse tantas casillas como le dé la gana) hacia:

  • arriba
  • abajo
  • izquieda
  • derecha
  • diagonal derecha (tanto para arriba para abajo)
  • diagonal izquierda (ídem que el anterior)


Para los curiosos aqui pongo tambien el pdf de mi practica del año pasado

Adjuntos

Lo prometido es deuda, aquí os dejo mi propuesta de solución ;) .

Joer, qué recuerdos he tenido al desempolvar el TurboC XD . Uno ya anda tan acostumbradito al Web Sphere o al JBuilder que se le hace muy pesado tener que echar mano de un programita de los antiguos, sin poder usar el ratón, sin copy & paste... [mad] XD .

Adjuntos

gracias a todos por vuestra ayuda [fies]


os pongo como lo estoy haciendo, lo que son las paralelas me salen

pero unica diagonal que consigo poner me sale torcida, no veo el error llevo mucho tiempo delante del pc xD

X es una constante y las coordenadas son x,y fila,columna


for(i=x;i<=X;i++){
                     
         tablero[y][i]='?';
         
         }
         
     for(j=y;j<=Y;j++){
                     
          tablero[j][x]='?';}
         
         
     for(k=1;k<=y;k++){
                     
          tablero[k][x]='?';}   
         
     for(l=1;l<x;l++){
                     
         tablero[y][l]='?';
         
         }



alguien me puede mostrar como hacer una diagonal, aunque no sea con mis datos
Teniente Dan escribió:alguien me puede mostrar como hacer una diagonal, aunque no sea con mis datos


En la solución que he propuesto uso la siguiente idea: una casilla accesible por la reina que esté en diagonal cumple una propiedad: la distancia de esa casilla a cada una de los ejes que atraviesan la casilla donde está la dama es la misma.

Por ejemplo: si la dama está en 3,3 , podría ir a 5,1 , que está a 2 unidades de cada una de las coordenadas de la casilla de la dama.

Eso en mi programa lo modelo con la condición if (abs(casillaInicial[0]-64 - j)==abs(casillaInicial[1]-48 - i)) , que es la que cumplen las casillas visitables por la dama y que estén en diagonal con respecto a ella.
14 respuestas