[ Foro de Pascal ]

orientacion con el juego memory block

20-Dec-2010 18:49
oscar gomez
3 Respuestas

Cordial saludo Antonio y profesor Nacho.
Agradecerles lo importantisima que es su labor para nosotros que estamos aprendiendo y que gracias a su ayuda y explicaciones geniales nos hacen crecer en esta area de la programacion, mil gracias.

Mira estoy intentando realizar en modo grafico el juego de adivinar parejas(memory block),para ello mi idea es tener porejemplo una matriz de 5X5 en la que inicialmente muestre los numeros consecutivamente de la dimension de la matriz, es decir desde la casilla 1 a la 25 que es la que mostrare al usuario inicialmente y quiero que cada casilla guarde una cadena que logicamente el usuario no vera hasta que no pulse sobre dicha casilla del numero asociado. graficamente seria algo asi:

1  2  3  4  5
6  7  8  9  10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25


Terna  Oso    Terna   Conejo  Delfin
Oso    Raton  Delfin  Pavo    Loro
Perro  Atun   Loro    Gato    Pavo
Perro  Pato   Atun    Paloma  Raton
Gato   Pato   Terna   Paloma  conejo


como ves si el usuario uno da click en 2 esta cambiaria a una visualizacion para el usuario con la cadena "OSO" y si da clic seguidamente en la casilla visualizada con el numero 6, se mostrara al usuario "OSO", por lo tanto este usuario habra hecho una pareja y tiene derecho a seguir, bien quisiera que por favor me ayudaran a como podria hacer para implementar este ejercicio, que seria lo mas conveniente usar dos matrices? como definiria la matriz de cadenas? como asociaria cada casilla de numeros con su respectiva cadena si genero aleatoriamente la matriz que guarda las cadenas? cual es el comando trabajando ya graficamente en pascal para que cuando se pulse una casilla numerica esta de la sensacion de que se ha volteado y se muestre en su defecto la cadena asociada a dicho numero? por su amable tiempo en ayudarme a orientarme en lo que deberia  hacer para codificarlo, quedare como siempre muy agradecido contigo Antonio y profesor Nacho, su generosidad es incalculable gracias.


21-Dec-2010 20:55
Antonio P.G.

Hola, Oscar.

Lo primero: cuando dices "click", ¿te refieres a utilizar el ratón? Porque si es así, lo siento pero no puedo ayudarte... Hasta ahí mis conocimientos no llegan.

Lo segundo: con modo gráfico, ¿te refieres a "modo texto con colores y tal" o a "modo gráfico usando la unit graph"?

Sé que es raro que ante dudas tuyas yo te responda con preguntas... pero más vale dejar eso claro. :D.

A lo que de momento sí te puedo responder es a la pregunta de las matrices. Yo te recomiendo que utilices una matriz de 5x5 de records, donde cada record contenga ciertos campos como: nombre (nombre del animal), acertada (si está acertada)... y así.

Podría ayudarte un poco más, pero hasta que no sepa lo que te pregunto, no. :).

¡Ciao!


21-Dec-2010 22:17
oscar gomez

Hola Antonio muchisimas gracias por tu pronta ayuda.
Mira lo de hacer clik dejalo que de eso me ocupo yo, y lo de manejar la unidad graph tambien. lo que necesito es que me ayudes a como podria realizar el ejercicio sin que tengas en cuenta la parte graphica.
me dices que utilizar una matriz de record pero no habria otra forma de hacerlo? y una de mis mayores inquietudes es la referente a como asocias aleatoriamente las cadenas de texto a cada numero de la matriz? es decir si en el 2 esta la palabra oso como hago esta asociacion?como se que al 2 le corresponderia la palabra oso? y asi para los demas casillas? y otra duda mas como podria hacer un modulo en el que pudiera jugar un usuario con el ordenador, es decir que tendria que hacer mas o menos en la parte que corresponde al turno del ordenador? por tu siempre generosa ayuda para todos nosotros mil gracias.


22-Dec-2010 02:01
Antonio P.G.

Hola.

Ok, vamos a ver...

Bien, lo primero que acabo de ver es que hablas de parejas y tienes una matriz con un número impar de elementos. Tendrás que tener en cuenta eso.

Claro que podrías utilizar dos matrices: una que contuviese las palabras y otra el valor booleano de si ha sido acertada ya o no. Yo prefiero la opción de los records, ya que así lo tienes todo en la misma matriz. Creo que ocupa la misma cantidad de memoria. Ahora bien, creo que usar los records es más estructurado.

Para hacer esa asociación aleatoria, yo lo haría con un array que contuviese los nombres de los animales. Hablemos del array. Éste podría:
- Ser una constante del programa, con sus palabras incluidas de forma predeterminada.
- Ser una variable a la que un usuario le introdujese palabras antes de empezar a jugar.
- Ser una variable con unas palabras predeterminadas al principio, pero que antes de jugar el usuario tuviese la oportunidad de introducir otras palabras diferentes.

De cualquiera de estas formas, una vez se tiene un array de longitud igual al número de palabras, llega la hora de asignarlo a la matriz de nombres. Creo que esta es la parte por la que tú me preguntas. Bueno, aquí se pueden diseñar varios algoritmos, no muy complejos. Dependiendo del tiempo que le dediques te saldrán mejor o peor. También depende del nivel de aleatoriedad que busques (yo estudio estadística y esto de la aleatoriedad es algo bastante más complejo de lo que parece). Yo te propongo uno que se me está ocurriendo ahora mismo.

Mira:
- Se crea un array de tipo integer, con todos sus valores iguales a 2. La longitud de este array será igual que la longitud del array de nombres del que hablaba un poco más arriba.

- Tendrás que usar la función "Randomize".

- Supongamos que "N" es el número de nombres que tienes.

- Irás recorriendo la matriz de nombres con un par de bucles anidados, por filas o columnas; eso es lo mismo.

- Cuando llegues a un elemento de la matriz de nombres, supongamos el primero, tomas un número aleatorio. Especifico un poco esto, aunque puede que ya lo sepas. Si tu array está definido [a..b], donde "a" y "b" son dos números enteros, y "b>a", tu función aleatoria para tomar un nombre del array sería:

"indice:= random (b-a+1) + a;"

Prueba con "[1..N]" y verás que tiene sentido.

- Bien, una vez obtenido el índice, miramos en el array de doses. ¿La casilla es igual a cero?:

       Sí: ¿Es índice = N?
                Sí: índice:= 1.
                No: índice:= índice + 1.
           Repetimos "¿La casilla es igual a cero?".
       No: restamos 1 a la casilla y ponemos el nombre del array de nombres (correspondiente, claro, al índice) en la casilla correspondiente de la matriz.

- Y ya está. Espero que lo hayas entendido. Si dudas, ya sabes.

Este algoritmo es aleatorio (siempre y cuando nos basemos en la hipótesis de que Randomize es 100% aleatorio...) pero no es "equiprobabilista", porque en ciertas fases puede que un nombre tenga más probabilidades de ser escogido que otro. (Esto es fácilmente demostrable con un poquito de teoría de probabilidad).

Sin embargo, como mientras escribía este algoritmo se me han ocurrido otros 2 algoritmos más (completamente equiprobabilistas), te diré que se puede hacer mediante más arrays, o mediante listas.
-------------------------------------------
Con respecto a la parte del ordenador, del turno.

Hay dos formas clásicas (que yo conozca) de jugar a este juego. La primera es: levantas carta, levantas la otra, tienes todo el tiempo del mundo para memorizar, y pones las cartas boca-abajo otra vez (a no ser, claro, que hayas acertado).

La segunda es: seleccionas dos cartas, alguien (o en este caso el ordenador) las voltea para que las puedas ver, y tras unos segundos determinados, esa otra persona las pone boca-abajo otra vez. (De nuevo, a no ser que hayas acertado).

Es más fácil de programar la primera forma, creo, dado que no tienes que controlar tiempos.

Si a lo que te referías es que cómo puede hacerse para pretender que el ordenador es un competidor, entonces eso es bastante más complicado. Ahí entra en temas de inteligencia artificial. Adquirí un libro de eso no hace mucho, pero a ver cuando tengo tiempo para leerlo...

Bueno termino diciendo que es bueno que tengas dudas, porque mediante el diálogo y la reflexión estimulamos el cerebro un poco y desarrollamos conceptos (que aunque son muy sencillos para los genios que pasan a la historia) son nuestros logros de cada día (o semana, según el tiempo que tengas).

Un saludo. Espero que hayas entendido todo, y si no, a preguntar, que yo no soy profe y (aún :P) no tengo experiencia de expresarme bien.






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