[ Foro de Pascal ]

Reversi

17-May-2013 22:15
Invitado (Antonio Velez)
10 Respuestas

Hola a todos, quisiera pedir su ayuda, soy de honduras y estoy intentando realizar el juego del reverse y tengo muchas dudas de como llegar a poder jugarlo,y buscando y buscando encontre esta magnifica pagina y bueno ojala cualquiera pudiera ayudarme, lo hago mas por hobby por que me gusta el tema de la programacion, mas no por que este estudiando informatica.
quisiera pedir la ayuda inicialmente en lo mas importante para mi en estos momentos:

La colocación de una ficha sólo se puede efectuar si provoca el volteo de una o más de las fichas contrarias: una ficha o una línea continua de fichas del mismo color es volteada cuando se ve flanqueada en lados opuestos por dos fichas contrarias, una de las cuales debe ser una ficha ya colocada en el tablero y la otra la recién colocada. La capturas pueden hacerse en filas, columnas o diagonales.

por favor cualquier ayuda u orientacion me sera de muchisima ayuda agradezco a cualquier compañero y en especial al profesor si puede ayudarme, todo sera importante para mi, gracias


18-May-2013 11:57
Nacho Cabanes (+30)

Sí, el juego de Reversi u Othello es conocido:

http://es.wikipedia.org/wiki/Reversi

Pero para saber qué ayuda necesitas, habría que saber lo que ya has conseguido hacer. Por ejemplo:

- ¿Has hecho ya un pseudocódigo de cómo será la lógica del juego?
- ¿Lo vas a hacer en modo texto o en modo gráfico?
- ¿Sabes manejar arrays de dos dimensiones?
- ¿Sabes cómo dibujar en pantalla el contenido de ese array para imitar la apariencia del tablero?
- ¿Sabes crear funciones?
- ¿Has creado ya una función que compruebe si un movimiento es válido, mirando en las 8 direcciones a ver si hay alguna casilla de tu propio color?
- ...


18-May-2013 17:13
Invitado (Antonio velez)

gracias por responder profesor.
tienes toda la razon en los interrogantes que me planteas, paso a responderte:
la idea es hacerlo en modo texto, pues la parte grafica no la he estudiado y lo hare de este magnifico curso que tienes pero mas adelante iniciare con ello.

si se manejar arrays de dos dimensiones -matrices al igual que funciones.
respecto a:
- ¿Sabes cómo dibujar en pantalla el contenido de ese array para imitar la apariencia del tablero?
te refieres en modo grafico?, si es asi no lo se hacer, y en modo texto no se como podria hacerlo quiza con simbolos - algo asi podria ser?

y respecto a:
¿Has creado ya una función que compruebe si un movimiento es válido, mirando en las 8 direcciones a ver si hay alguna casilla de tu propio color?

la verdad es que me gustaria me ayudaras o orientaras en la parte del seudocodigo para quiza comenzar por partes, me sera muy valiosa tu ayuda,solo intento aprender. mil graacias por lo que puedas ayudarme.


19-May-2013 01:29
Nacho Cabanes (+30)

Pues vamos con ello poco a poco...

Primero sugiere un pseudocódigo de cómo lo plantearías. Algo como

- Repetir:
- Pedir posición al jugador 1
- Revisar tablero desde esa posición
- Si ganado, felicitar
- Si no, si empate, avisar
- Si no:
- Pedir posición al jugador 2
(...)

y a partir de ahí vamos afinando detalles y convirtiéndolo en funciones y procedimientos.


02-Jun-2013 21:01
oscar gomez

cordial saludo profesor y compañero Antonio velez, este es uno de los programas que quiero hacer en modo grafico que es un tema que he iniciado hace pocas semanas en este espacio a traves de tu manual profesor Nacho, sin embargo realmente me intereso al ver este post pues seria bueno pudieramos resolverlo entre todos por ahora en modo texto, sin embargo queria preguntar a Uds y pedir su ayuda respecto a como podria ser un seudocodigo para la parte central de este interesante juego, y me refiero a:


La colocación de una ficha sólo se puede efectuar si provoca el volteo de una o más de las fichas contrarias: una ficha o una línea continua de fichas del mismo color es volteada cuando se ve flanqueada en lados opuestos por dos fichas contrarias, una de las cuales debe ser una ficha ya colocada en el tablero y la otra la recién colocada.

COMO PODRIA EN MODO TEXTO HACER DICHO VOLTEO DE FICHA(S) Y SI ES CONVENIENTE UTILIZAR UN ENUMERADO PARA LOS COLORES Y COMO ASOCIAR DICHOS COLORES ,NEGRO Y BLANCO A CADA JUGADOR?, Y SI ESTOY BIEN EN LO SIGUIENTE:




             X O
             O X

SUPONIENDO QUE LAS X SON PARA JUG1 Y 0 PARA JUGADOR2
ENTONCES SI EL TURNO ES EL DE LAS X EN ESTE MOMENTO SI LA PONGO EN:
           
             X O X
             O X

O SI TUVIERA POREJEMPLO EL CASO EN UN MOMENTO DEL JUEGO COMO ESTE:

       
             X O O O
             O X
Y VA EL TURNO DE LA x y la pongo en:

             X O O O X
             O X
COMO DEBO HACER EL RECORRIDO O LA BUSQUEDA PARA PODER VOLTEAR LAS FICHAS OOO QUE ESTAN DENTRO DE LAS DOS FICHAS X, OSEA, QUEDANDO LA SITUACION ACTUAL:
   
             X x x x X
             O X

por tu explicacio profesor o cualquier compañero que quiera colaborarnos mil y mil gracias, todo sera muy importante en su apoyo y ayuda.
                 
           


EN ESA POSICION NUEVA APARTIR DE AHI DEBO HACER LA BUSQUEDA


03-Jun-2013 19:56
Nacho Cabanes (+30)

Como sabes qué posición ha escogido el usuario, deberías mirar a partir de esa posición, en las 8 direcciones posibles, a ver en cual de ellas encuentras varias fichas del color contrario, seguidas de una ficha tuya (y sin espacios intermedios).

En cada posición que encuentres y que sea válida, haces una segunda pasada cambiando las fichas de color.

Por ejemplo, podrías usar una función que te devuelva un "booleano" y que mire a partir de esa posición, según un cierto incremento de X y un cierto incremento de Y. Si quieres mirar hacia la derecha, "incrX" sería 1 e "incrY" sería 0. Si quieres mirar en la diagonal hacia la izquierda y hacia abajo "incrX" sería -1 e "incrY" sería 1.

Así, harías cosas como

 
if EsPosibleMover(3, 4, 1, 0) then
  InvertirColor(3,4,1,0);
 



(donde (3,4) sería el punto donde colocas y (1,0) sería una de las 8 direcciones: hacia la derecha).


05-Jun-2013 18:33
Invitado (Antonio velez)

Gracias, al profesor nacho y al compañero, por interesarsen por mi objetivo de juego, profesor la verdad perdoname no se si lo que le explicas al compañero sea ya a un nivel muy tecnico es que la verdad podo entendi lo que mencionas, si puedieras explicarme a mi un poco mas acerca de lo que mencionas del incremento en especial en la funcion
if EsPosibleMover(3, 4, 1, 0) then
 InvertirColor(3,4,1,0);
ese 1, 0 dices que seria un incremento en x a la derecha pero no entiendo pues en este caso estarias haciendolo solo para que verifique un solo movimiento a la derecha del punto donde se colocara el jugador (3,4), pero y si son mas casillas a la derecha en que vaya encontrando fichas contrarias como podria pasar esa situacion como parametro ala funcion que planteas, pedoname mi ignorancia un poco profesor al respecto si pudieras darnos mas pistas seria importante por lo menos para mi, agradezco tu atencion y en espera de tu inmenso aporte.


06-Jun-2013 23:59
Nacho Cabanes (+30)

La idea es que en el juego del Reversi, una vez colocas una ficha, debes comprobar si eso hace que se voltee alguna pieza del contrario (porque si no es así, no es una jugada válida, y si es correcto, deberás voltear esas piezas a continuación).

Eso debes hacer en las ocho direcciones: arriba, abajo, izquierda, derecha y las cuatro diagonales.

Una forma "automatizable" y "no demasiado repetitiva" de hacer eso es pensando en un sistema de coordenadas (X,Y), donde X sería la posición horizontal e Y sería la posición vertical.

Si lo haces así, moverte hacia la derecha sería aumentar la X de 1 en 1 y no cambiar la Y. Por eso, se podría plantear como:

 
if EsPosibleMover(xPieza, yPieza, 1, 0) then ...
 


y moverte en diagonal hacia la izquierda y hacia abajo sería disminuir la X de 1 en 1 aumentar la Y de 1 en 1, así:

 
if EsPosibleMover(xPieza, yPieza, -1, 1) then ...
 



10-Jun-2013 15:02
Invitado (antonio velez)

cordial saludo profesor. disculpa en mi caso que aun este con esto, no se el compañro oscar, pero aun estoy con dos dudas importantes,una de ellas es que en lo que explicas dices:

y moverte en diagonal hacia la izquierda y hacia abajo sería disminuir la X de 1 en 1 aumentar la Y de 1 en 1, así:


if EsPosibleMover(xPieza, yPieza, -1, 1) then ...
y ahi me primra duda, y es qu no s comprnder entonces el movimiento como tal pues para mi seria en ste caso aumentar la X pues iria hacia abajo con lo cual aumentaria la fila en 1 de la matriz, y disminuiria la Y pusto qu iria a la izquierda con lo que entiendo yo disminuiria en columnas dentro d la matriz, por favor ayudam a aclararme en esto pues seguro el que sta quivocado soy yo y no tu en tu explicacion eso seguro.

la segunda gran duda que tengo es que cuando se pone la ficha tu mencionas correctamente que se deben analizar en las 8 direcciones eso lo comprendo, pero no entiendo si en tu ejemplo solo tomas que existiera un solo moviminto porejemplo hacia la derecha y ya se encontrara una ficha adversaria y poder voltear la que esta entre las dos mias, pero y si hubiera mas de un movimiento hacia la derecha hasta encontrar una ficha adversaria, como cambiaria la estructura de tu funcion, en cuanto a los paramtros de movimiento 1,0:
if EsPosibleMover(xPieza, yPieza, 1, 0) then ...
es que esa parte me lleva sin entenderla , como podria ser profesor ayudam a aclararme, acaso se haria con dos for i y j pero en ese caso como puedo hacer para recorrer las fichas adverdsarias que hay desde mi posicion y mi otra ficha para poder voltear ese rango encontrado de fichas adversarias?por favor ayudame como podria ser mas o menos un algoritmo que me permita dicha gestion, mil y mil gracias por todo tu apoyo y comprension a mi poca experiencia.


12-Jun-2013 17:03
Nacho Cabanes (+30)

En cuanto a lo de "la izquierda y abajo": La columna es la X y moverte hacia la izquierda es disminuir la columna luego equivaldría a hacer X := X-1;  La fila es la Y, y bajar supone a aumentar la fila en que te encuentras, luego moverte hacia abajo equivaldría a  Y := Y+1;, de modo que la orden podría ser algo como

 
if EsPosibleMover(xPieza, yPieza, -1, 1) then ... 
 



Y para probar las 8 direcciones, la forma más simple y quizá la más legible (aunque quizá no la más eficiente en cuanto a que el programa sea "compacto"):

 
if EsPosibleMover(xPieza, yPieza, 1, 0) then
    InvertirColor(xPieza, yPieza,1,0); // Derecha
 
if EsPosibleMover(xPieza, yPieza, 1, 1) then
    InvertirColor(xPieza, yPieza,1,1); // Derecha, abajo
 
if EsPosibleMover(xPieza, yPieza, 0, 1) then
    InvertirColor(xPieza, yPieza,0,1); // Abajo
 
...
 



12-Jun-2013 22:48
Invitado (Antonio velez)

gracias profesor , he podido resolverlo por ahora en modo texto, gracias a tus valiosas explicaciones y en especial esta ultima con la que pude aclararme bien, muy agradecido profesor.seguramente cuando toque la parte grafica estare por aqui pidiendo tu ayuda la cual agradezco muchisimo.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)