[ Foro de Pascal ]

ayuda para intentar hacer el juego de memorice

09-Jan-2012 19:06
oscar gomez
13 Respuestas

Cordial saludo profesor nacho cabanes.gracias ante todo por tu ayuda constante.

Profesor queria pedir tu ayuda es que quiero intentar hacer el programa para el juego de memorice y quisiera me orientaras en lo que mas puedas,que debo tener en cuenta para ello.inicialmente quiero intentarlo simple , sin modo grafico para despues si intentarlo con ello.quiero hacerlo utilizando parejas de numeros para entender como operar el codigo.cual seria la logica para este programa en cuanto a seudocodigo profesor para intentar hacerlo en pascal?
Tengo dudas como porejemplo como podria generar automaticamente de forma aleatoria una matriz par para el  juego de utilizando como parejas numeros. ejemplo

1   5   2   6

4   1   3   5

2   6   3   4  

cual seria una vez esto la forma de poder jugarlo con el ordenador?, mil gracias en todo lo que puedas orientarme y ayudarme, ojala me puedas brindar pautas con fragmentos de seudocodigo o codigo en pascal directamente para intentar realizarlo.mil gracias por tu ayuda y todo lo que he aprendido a traves de ti y tus enseñanzas.mil gracias profesor.


10-Jan-2012 01:18
Nacho Cabanes (+31)

En un vistazo rápido, yo haría lo siguiente:

1.- Generar un array formado por las parejas "originales": 1 1 2 2 3 3 4 4 5 5 6 6

2.- Desordenar el array (mira más abajo)

3.- Mostrar el array de la forma deseada (por ejemplo, 4 "cartas" en cada línea).


El único paso difícil es el de desordenar el array. En algunos lenguajes existen órdenes "shuffle" (barajar) o "unsort" (desordenar) que lo hacen, pero no es el caso de Pascal. Pero no es grave: existen algoritmos ya estudiados que lo hacen de forma bastante eficiente, como éste:

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

La idea básica es:

 
para i = n descendiendo hasta 2 (n = tamaño del array)
  j = número al azar entre 1 e i
  intercambiar a[j] , a[i]
 



(A partir de ahí ya sólo queda algo de dificultad -poca- en lo que es el planteamiento del juego: pedir al usuario dos cartas, destaparlas, marcarlas como no disponibles si son iguales o volverlas a tapar al cabo de un instante -o al pulsar Intro- si son distintas).


11-Jan-2012 10:07
oscar gomez

Profesor buenos dias,gracias por tu ayuda.
Bien profesor la primera parte de generar las parejas en la matriz ya la he solucionado.
ahora bien tengo unas dudas siguientes a ello:

cuando se le piden al usuario las cartas se debe hacer pidiendo las posiciones en la matriz para dicha carta o se debe hacer atraves de aleatoriedad,y como podria verificar que la carta que saco ese jugador no ha salido ya , por tu ayuda mil gracias.


12-Jan-2012 22:32
Nacho Cabanes (+31)

Para saber si una carta se ha sacado o  no, tienes dos bloques de información:

- Un array de cartas, que "sabe" lo que hay en cada una de las posiciones.

- Un array de "boolean", que "sabe" si cada una de ellas está destapada o no.

Por supuesto, también lo puedes hacer como un array de "records", en el que cada uno de los registros contendrá la carta (su símbolo, o su imagen en un programa en modo gráfico), si está destapada o no, etc.


13-Jan-2012 16:51
oscar gomez

Gracias profesor por sus ayudas ,otra vez un ejercicio mas he logrado sacarlo adelante y en parte por sus orientaciones, aunque seria de vez en cuando profesor muy conveniente para nosotros que estamos aprendiendo hasta el momento que en algunas de tus intervenciones nos indiques algun seudocodigo por lo menos, pues desde mi posicion de aprendiz eso dislumbra mucho para nosotros, no es a manera de observacion ni mas faltaba profesor, solo es un punto de vista, que no se trata de hacer el programa que alguno de nosotros tenga como duda, no es esa mi direccion profesor , sino que cuando se esta aprendiendo a veces para uno es muy importante esa luz que puede darte un seudocodigo por lo menos en alguna parte de tus comentarios del mismo ,si amerita la complejidad del problema o de la estrategia de solucion, por favor solo es una opinion profesor y espero que no veas otra cosa que lo que intento decirte es que MIL GRACIAS POR TU TIEMPO, TUS CONSEJOS Y ESTRATEGIAS DE SOLUCION QUE NOS BRINDAS pero que de vez en cuando profesor no olvides que somos aprendices que queremos salir adelante y bueno tu pagina y la oportunidad que nos brindas es digna de una gran persona y brillante profesional como lo eres tu, a mi me han ayudado muchisimo tus respuestas siempre , pero se que muchos alumnos quisieran ese pedacito que dislumbre aprendiaje de tecnicas o estrategias de solucin que quiza una partesita de seudocodigo ayudaria tanto!. mil bendiciones profesor , que Dios te siga llenando de tanta generosidad, profesionalidad y paciencia con estos terceros que somos para ti, por que se que lo haces de manera altruista y ya por solo eso todos los que estamos siempre aqui debemos cada vez AGRADECRTE TANTA AYUDA.


15-Jan-2012 16:47
Luis Torres (+12)

Si pudieras colocar el código de tu problema resuelto, te lo agradecería. Es muy interesante lo que estás haciendo y me gustaría verlo. Saludos.


15-Jan-2012 17:52
oscar gomez

Hola compañero Luis, cuéntame en que tienes problema con este ejercicio e intentare orientarte, aunque quien mejor que nuestro profesor Nacho Cabanes para sacarnos siempre de nuestras dudas.
Luis no he subido el código por que a pesar que si lo soluciones quise preguntarle al profesor Nacho Cabanes sobre un aspecto que haría mas elegante la solución, en concreto:
“Profesor quería pedir tu ayuda, con respecto a como podría ser la codificación o el seudocódigo para generar un vector por ejemplo de 12 posiciones donde sus elementos sean números aleatorios asegurando o validando que  los números no se graben en dicho vector mas de dos veces aleatoriamente hablando como entenderá a la final  profesor tendríamos un vector de parejas sin importar que estén ordenados.” estoy en espera de su ayuda y luego entonces ya lo subiré.
un saludo compañero.


16-Jan-2012 10:29
Nacho Cabanes (+31)

Lo de generar el vector de parejas desordenado lo tienes contestado al principio del hilo (en mi primera respuesta).

Si queréis, os incluyo lo que yo haría como pseudocódigo, por si os sirve de ayuda:

- Generar array de parejas
- Desordenar array de parejas
- Repetir:
 * Mostrar estado de las cartas en pantalla (las cartas "tapadas")
 * Pedir carta 1
 * Destapar carta 1
 * Pedir carta 2
 * Destapar carta 2
 * Si son distintas: esperar 2 segundos y conservarlas en la lista de cartas tapadas
 * Si son iguales, quitarlas de la lista de cartas tapadas
- Hasta que no queden cartas tapadas

 


16-Jan-2012 10:56
oscar gomez

Cordial saludo profesor Nacho. gracias por atendernos.
Profesor es que mencionas que en el principio del hilo esta solucionado como generar el array de parejas, pero realmente solo nos lo mencionas, si pudieras ser tan amable de indicarnos como seria un seudocodigo, mas aun como puedo restringir porejemplo que no existan mas de 2 veces un numero generado aleatoriamente dentro de un  array,para asegurar asi las parejas que se van generando porejemplo de 1 hasta 8.
mil gracias por tu ayuda .

gracias por los pasos que nos indicas para la realizacion del juego.


16-Jan-2012 10:59
Nacho Cabanes (+31)

Lo de generar el vector de parejas desordenado lo tienes contestado al principio del hilo (en mi primera respuesta).

Si queréis, os incluyo lo que yo haría como pseudocódigo, por si os sirve de ayuda:

- Generar array de parejas
- Desordenar array de parejas
- Repetir:
 * Mostrar estado de las cartas en pantalla (las cartas "tapadas")
 * Pedir carta 1
 * Destapar carta 1
 * Pedir carta 2
 * Destapar carta 2
 * Si son distintas: esperar 2 segundos y conservarlas en la lista de cartas tapadas
 * Si son iguales, quitarlas de la lista de cartas tapadas
- Hasta que no queden cartas tapadas

 


16-Jan-2012 17:43
Luis Torres (+12)

Me gustaría tener el código para desordenar aleatoriamente el array. Es que entré a Wikipedia y hay palabras del inglés que no entiendo muy bien. Más que el algoritmo quisiera tener el código en pascal. Gracias.


17-Jan-2012 16:57
Luis Torres (+12)

Ya lo hice y salió bien. De todas maneras le pido al profesor que me lo revise a ver que tal. Aquí le dejo el código:

 
program desordenarArray;
uses Crt;
var
 Arreglo: array[1..12] of integer;
 i,j,aux: integer;
 
BEGIN
 ClrScr;
 for i:=1 to 6 do
  Arreglo[i]:= i;
 for i:=1 to 6 do
  Arreglo[i+6]:= i;
 for i:=1 to 12 do write(Arreglo[i],' ');
 writeln;
 randomize;
 for i:= 12 downto 2 do
  begin
    j:= random(i)+1;
    aux:= Arreglo[j];
    Arreglo[j]:= Arreglo[i];
    Arreglo[i]:= aux;
  end;
 for i:=1 to 12 do write(Arreglo[i],' ');
 writeln;
 Readln;
END.
 


 


20-Jan-2012 09:52
Nacho Cabanes (+31)

Perfecto, Luis, esa es la forma de desordenar el array usando el algoritmo de Fisher-Yates.

Como única mejora se me ocurren un par de tonterías:

- Juntar los 2 primeros "for" en uno solo, o incluso los 3 primeros, si se reescribe la forma de rellenar los datos.

- Poner comentarios  ;-)

Es decir, podría quedar así:

 
program desordenarArray;
 
var
Arreglo: array[1..12] of integer;
i,j,aux: integer;
 
BEGIN
{ Genero y muestro el array inicial }
for i:=1 to 12 do
  begin
  Arreglo[i]:= i mod 6;
  write(Arreglo[i],' ');
  end;
writeln;
 
{ Desordeno el array }
randomize;
for i:= 12 downto 2 do
  begin
    j:= random(i)+1;
    aux:= Arreglo[j];
    Arreglo[j]:= Arreglo[i];
    Arreglo[i]:= aux;
  end;
 
{ Muestro el array desordenado }  
for i:=1 to 12 do write(Arreglo[i],' ');
writeln;
 
{ Pausa para poder leer los resultados }
Readln;
END.
 


Y el resultado sería algo como

1 2 3 4 5 0 1 2 3 4 5 0
5 4 3 5 1 2 1 4 0 0 3 2


20-Jan-2012 10:10
oscar gomez

Buenos dias profesor Nacho cabanes.
Excelente tu explicacion y en especial la forma en que nos lo indicas a traves del codigo, pues con ello nos aclaramos muchisimo en lo que necesitabamos.gracias por tu tiempo.






(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.)