[ Foro de Pascal ]

Juego de Póker

10-Jul-2014 21:23
Luis Torres (+12)
18 Respuestas

Si yo quisiera realizar un juego de póker, ¿cómo sería la forma de plantear la solución? ¿cómo almaceno las combinaciones de cartas claves de manera que las pueda comparar con las de cada jugador y así obtener al ganador?. ¿Qué pasa si lo quiero hacer en red?, ¿qué necesitaría para hacerlo en red?
Saludos.


11-Jul-2014 00:33
Nacho Cabanes (+31)

Hay varias formas de plantear un juego de cartas. La más natural es usar una estructura repetitiva (un array, o mejor una "lista", porque la cantidad de cartas puede cambiar) para la mesa y otra para cada jugador. Cada elemento de esa estructura será un "record", con datos como el "palo" (por ejemplo, corazones) de la carta y su "valor numérico" (por ejemplo, 9).

Cuando se reparten cartas, las "quitas" del array (o lista) de la mesa para incorporarlas al array (o lista) de cada jugador. Insisto: debes quitarlas desde un sitio común, o puedes encontrarte con que 2 jugadores distintos tengan un as de diamantes.

La forma de comparar cartas depende de las reglas de cada juego. Por ejemplo, en el poker muchas de las comparaciones se pueden hacer a partir del valor numérico de cada carta (parejas, tríos, full), pero en otras hay que considerar también el "palo" (color, escalera de color).

Para poderlo hacer en red, tendrás que:

- Tener funciones de red disponibles para el compilador que vayas a usar.

- Decidir una forma de repartir el trabajo en la red (¿la mesa actúa de "servidor" al que se conectan los jugadores?  ¿es el primer jugador el que coordina el flujo de la partida? ¿existe un servidor central que almacena todas las partidas de forma simultánea?)

- "Inventar" un protocolo de comunicaciones: ¿cómo informará cada jugador de que se incorpora a una partida? ¿cómo se le preguntará desde el servidor si quiere cartas? ¿cómo informa de si quiere apostar o se retira? ¿qué se hará si una respuesta tarda en llegar? ¿cómo se sabe de qué partida se está hablando, si hay varias simultáneas?

- Configurar los equipos que vayas a conectar en red (de lo contrario, es posible que el "cortafuegos" del sistema operativo bloquee las conexiones salientes, y más aún las entrantes).

Como ves, el juego no es trivial, y la parte de red puede ser complicada.


11-Jul-2014 02:30
Luis Torres (+12)

Muchas gracias por la respuesta, aclaré muchas dudas.
¿Dónde puedo aprender lo relacionado a todas las interrogantes que usted amablemente planteó sobre la implementación en redes?, ¿se puede implementar el juego en red, en Pascal?
Saludos.


14-Jul-2014 22:35
Invitado (juanplo)

Hola luis, estoy muy interesado en tu planteamiento del juego dle poker, si eres tan amable podrias orientarme quisiera tambien poder realizarlo, si me asesoras seria de gran ayuda para mi, porejemplo lo que plantea el profesor,en relacion con:

usar una estructura repetitiva (un array, o mejor una "lista", porque la cantidad de cartas puede cambiar) para la mesa y otra para cada jugador. Cada elemento de esa estructura será un "record", con datos como el "palo" (por ejemplo, corazones) de la carta y su "valor numérico" (por ejemplo, 9).

Cuando se reparten cartas, las "quitas" del array (o lista) de la mesa para incorporarlas al array (o lista) de cada jugador. Insisto: debes quitarlas desde un sitio común, o puedes encontrarte con que 2 jugadores distintos tengan un as de diamantes.

podrias en codigo ir orientandome te lo agradeceria, la parte de red se ve super interesante me gustaria unirme a ti y poder mirarlo,gracias


14-Jul-2014 23:23
Luis Torres (+12)

Al igual que tú tengo muchas dudas.
En cuanto a quitar las cartas de la lista, bueno se refiere a implementar una pila, de esa forma se pueden entregar las cartas a cada jugador y evitar que una misma carta la tengan varios jugadores a la vez. Lo que no entiendo es cómo puedo barajar las cartas en la pila, porque el método que sugirieron en otro post se hace con arreglos, no con listas, así que me gustaría saber cómo hacerlo.
Saludos.


15-Jul-2014 16:05
Invitado (juanplo)

buenas compañero luis, podrias indicarme como seria en codigo la implementacion de la pila en cuanto a quitar las cartas y como seria la forma de entregar las cartas a cada jugador? gracias estoy muy motivado con tu hilo, gracias


15-Jul-2014 18:36
Luis Torres (+12)

La verdad es que no pienso hacer el código hasta tanto no tenga toda la estrategia de solución completada. De paso, no tengo mucho tiempo, de hacerlo sería en el mes de agosto.
En lo que respecta a tu pregunta, pues, cuando tú haces una pila, ésta cuenta con todas las funciones o procedimientos para "quitar elementos", "insertar elementos", etc. Sería cuestión de que te pongas a investigar sobre las pilas.
En el juego de póker siempre hay un jugador que dirige la partida, éste dará la orden de repartir las cartas, y de esta forma se "quitará" una carta del mazo de cartas (pila) y se "insertará" en la lista que representa a cada jugador.
Saludos.


15-Jul-2014 21:13
Nacho Cabanes (+31)

Estáis hablando de pilas, y eso es peligroso, porque es una estructura demasiado limitada: sólo se obtienen elementos por un lado, y la lectura es "destructiva". Eso recuerda al comportamiento de la mesa en algunos casos (ni siquiera en todos: operaciones como "barajar" son impensables con una pila). Pero no sirve para los jugadores: un jugador no tiene por qué descartarse de la última carta que ha recibido, sino que puede conservar la primera, la cuarta y la quinta, y "tirar" la segunda y la tercera.

Una lista permite una cantidad variable de elementos y a la vez permite acceso directo, de modo que se puede implementar algoritmos como el "barajar" igual que si fuera un array. Para desordenar hay algoritmos conocidos que funcionan bastante bien, como el de Fisher-Yates, que habíamos comentado en otro hilo del foro:

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] 
 



En cuanto a la programación de redes, que era casi implanteable con Turbo Pascal, sí es parte del lenguaje en el caso de Free Pascal y de una red TCP/IP, empleando "sockets", aunque no es algo especialmente fácil. Tomo nota mental para ampliar el curso de Pascal con ello. De momento, puedes ir "abriendo boca" aquí:

http://wiki.freepascal.org/Networking



16-Jul-2014 01:28
Luis Torres (+12)

Yo pensé implementar una pila solo en el caso del mazo de cartas, porque si nos ponemos a ver la relación es perfecta, porque la carta que se reparte es la que está en el tope, al igual que los elementos de la pila; si quitamos una carta, ésta desaparece del mazo, si quitamos un elemento de la pila igualmente.  Lo que no sabía era lo difícil que es "barajar" los elementos de la pila, aunque una pila es una lista enlazada, ¿o no?, y si se puede aplicar el algoritmo de Fisher-Yates en una lista, también se podría hacer en una pila, ¿no?

Para cada jugador sí pensé en implementarlos como lista enlazadas simples, sería lo que más se adecua a ellos.

Ojalá puede terminar pronto la parte de redes del tutorial que está volviendo a hacer.

Saludos.


16-Jul-2014 10:21
Invitado (juanplo)

hola compañero luis, gracias por responderme y mil gracias al profesor impecable explicacion la que nos da. luis queria pedirte el favor si pudieras asesorarme en agosto en este juego y si puedes en el tema de pilas es que este tema me esta costando tanto, ahora bien respecto a tu respuesta al profesor cuando dices:"porque la carta que se reparte es la que está en el tope" te refieres al tope a cualquiera de las dos opciones, es decir por arriba o por abajo?, pues recuerda que al barajar una persona lo puede hacer bien por el tope superior o por el tope de abajo  e ir alternando.gracias por su atencion y como puedo en agosto contactar contigo luis?


16-Jul-2014 11:03
Invitado (juanplo)

una cuestion mas, que modalidad de poker pretendes desarrollar?


16-Jul-2014 15:20
Luis Torres (+12)

No te puedo asesorar porque yo no he hecho el programa y ni siquiera sé jugar póker, hace una semana que estoy investigando cómo se juega. Yo pensaba que las cartas se sacaban desde arriba y no de abajo. No sabía eso de que se alternaban.

En cuanto a las pilas, es algo que tú mismo debes buscar, en internet encontrarás explicaciones y códigos. Yo no puedo hacer entendértelas.

Aún no sé cuántas modalidades de póker hay. Vi un video sobre el Holdem-Texas, pero nada más. Yo estaría en la posición de ser asesorado, en vez de estar asesorando a los demás.

Lamento no poder ayudarte.

Saludos.


16-Jul-2014 18:33
Luis Torres (+12)

Prof. Nacho, ¿cómo se pueden usar frameworks en freepascal?, ¿para qué sirven?


17-Jul-2014 16:47
Invitado (venezolano_en_españa)

hola luis,  podrias explicarme en tu opinion que es un framework, y si en pascal tiene alguna aplicacion, puesto que he leido que tiene mas aplicacion en lenguajes como php, java, ajax etc, gracias si puedes responder al igual que el profesor nacho cabanes quiza con un ejemplo


17-Jul-2014 17:25
Luis Torres (+12)

Si lees mi respuesta anterior a la tuya te darás cuenta de que eso mismo es lo que yo estoy preguntando. Yo sabía que habían frameworks para javascript y otros, pero no sabía que existieran para lenguajes tan antiguos como pascal.

Yo creo que estás confundido, porque yo no soy profesor, soy estudiante y estoy aprendiendo.

He leído lo que es un framework buscando en Google, pero me gustaría saber lo que opina un experto como el Prof. Nacho Cabanes.

Saludos.


17-Jul-2014 18:06
Invitado (venezolano_en_espana)

ok luis , no lo sabia, disculpa. me gustaria leyendop todo el hilo si puede ser unirme a ti cuando tengas tiempo al proyecto del poker, dos son mas que uno ojala pienses igual y no seas de esos que el conocimiento solo lo esconden pensando que estan en lo correcto cuando se sabe que aprende doble quien enseña,lo digo en parte por el post al que respondes al compañero juanplo, que quiza lo queintentaba tambien era unirse a tu idea, en fin, espero poder unirme y por supuesto colaborar en el mismo si lo permites claro.


17-Jul-2014 21:04
Luis Torres (+12)

Muchas gracias por el ofrecimiento, pero me gusta trabajar solo. No soy de los que esconde lo poquito que sabe, porque humildemente he puesto mi granito de arena para aclarar las dudas de varios foristas de este sitio web.

Ya no creo que puede hacerlo, porque me surgieron varias cosas de imprevisto y tendré que ocuparme de ellas en agosto y septiembre. Seguramente, entre tus compañeros de clase, podrás encontrar a alguno que quiera hacer un equipo contigo y emprender proyectos juntos.

No obstante, seguiré aclarando mis dudas con el Prof. Nacho Cabanes para tenerlo todo listo, cuando me proponga hacer el programa, si es lo hago, ya sabré cómo hacerlo.

Saludos.


19-Jul-2014 11:40
Nacho Cabanes (+31)

Este final de la discusión se está convirtiendo un poco en off-topic, quizá lo acabe teniendo que llevar a una nueva conversación...  :-D

En programación, un "framework" es básicamente un "esqueleto" que usar como punto de partida para realizar programas de una cierta complejidad.

Por ejemplo, en aplicaciones web existen diversos framework para PHP, que simplifican la trabajosa tarea de crear una aplicación conectada a bases de datos y con distintas vistas. De paso, estos frameworks ayudan a que el programa final sea más robusto, "tapando" agujeros de seguridad o dificultando cometer errores frecuentes.

Pascal es un lenguaje más antiguo, con el que no es habitual crear aplicaciones tan complejas, pero aun así, existe algún que otro framework. Por ejemplo, la adaptación de la biblioteca de juegos "Allegro" para Pascal lo es, o el esqueleto de aplicaciones "basadas en ventanas de modo texto" llamado Turbo Vision (Free Vision en su port para Free Pascal). Pero es que incluso la biblioteca de visual de clases que incluyen Delphi y Lazarus se puede considerar un Framework.


19-Jul-2014 12:47
Luis Torres (+12)

Eso he notado, un framework es prácticamente lo mismo que una biblioteca, solo que un framework está hecho para orientar la programación hacia un destino específico.






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