Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Corona SDK
Code

Crear un juego de poker en Corona: Logica de Juego

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

En la primera parte de este tutorial, configuramos el proyecto y creamos la interfaz del juego. También creamos e implementamos una función para crear un mazo de cartas. En este segundo tutorial, crearemos la lógica del juego.


Aplicación de muestra

Si desea ejecutar la aplicación de ejemplo de este tutorial, asegúrese de incluir imágenes para los autos como se explicó en el tutorial anterior. No olvide incluir y actualizar la biblioteca de dataSaver mencionada en este tutorial.


1. enableDealButton

Actualice la implementación de la función enableDealButton como se muestra a continuación.

Primero llamamos disableDealButton, que elimina los escuchas agregados previamente, y agregamos un escuchador tap, que invoca doDeal. El método addEventListener acepta un evento y una devolución de llamada. Hay una serie de eventos que puede escuchar, según el contexto en el que lo llame.


2. disableDealButton

Como mencioné en la sección anterior, en disableButton eliminamos cualquier escuchas agregados previamente.


3. enableBetButtons

En enableBetButtons, agregamos escuchas tap a betMaxButton y betButton, y le damos al jugador algunas instrucciones sobre cómo colocar su apuesta.


4. disableBetButtons

Como en disableDealButton, eliminamos cualquier escuchas agregados previamente en disableBetButtons.


5. enableHoldButtons

En enableHoldButtons, recorramos la tabla de holdButtons y agregamos un escucha de tap a cada botón.


6. disableHoldButtons

En la función disableHoldButtons, también recorramos la tabla de holdButtons, pero eliminamos los escuchas agregados en lugar de agregar nuevos escuchas.


7. generateCard

La implementación de generateCard requiere un poco más de explicación. Primero generamos un número aleatorio de 1 a la longitud de la tabla deck. Luego creamos una tarjeta temporal utilizando el deck["randIndex]..".png" y almacenamos una referencia en tempCard. Lo que hace el deck["randIndex]..".png" es agarrar un elemento aleatorio de la mesa deck, que sería algo como c1 o h5 y le agrega .png. Debido a que Lua es un lenguaje dinámico, podemos agregar nuevas propiedades a los objetos. En este ejemplo, agregamos una propiedad isHolding, que nos dice si el jugador está sosteniendo la carta, una propiedad cardNumber al obtener una subcadena del elemento del deck elegido, y hacemos lo mismo con la propiedad cardSuit. Finalmente, eliminamos el elemento elegido de la tabla deck y devolvemos la matriz.


8. getCard

En getCard, configuramos cardPosition, que es la coordenada x de la primera carta en la interfaz del juego. Generamos una tarjeta, la agregamos a la tabla playerHand y pasamos una variable cardIndex, que será un número entre 1 y 5, que representa una de las cinco tarjetas. Esto nos permite colocar las cartas en el orden correcto en la mesa playerHand. Establecemos la posición de cada tarjeta utilizando un desplazamiento de (93 * (cardIndex - 1)). Esto significa que las tarjetas están separadas 93 píxeles entre sí.


9. holdCard

En holdCard, primero obtenemos una referencia al botón que se presionó usando su propiedad buttonNumber. Esto nos permite verificar si la carta está en la mesa de PlayerHand. Si es así, establecemos isHolding en falso y actualizamos la coordenada y de la tarjeta. Si la tarjeta no está en la tabla PlayerHand, configuramos isHolding en true y actualizamos la coordenada y de la carta. Si el jugador elige sostener la carta, su coordenada y disminuye, lo que significa que la carta se mueve ligeramente hacia arriba.


10. resetCardsYPosition

En resetCardsYPosition, recorremos la tabla  PlayerHand y vemos si alguna de las cartas está siendo retenida. Los que están, vuelven a su posición original utilizando la biblioteca Transition. La biblioteca Transition hace que sea muy fácil mover objetos y interpolar sus propiedades.


11. Datos persistentes a través de sesiones

Queremos que nuestro juego pueda conservar valores o datos en las sesiones. Podemos construir una solución nosotros mismos usando la biblioteca io de Corona, pero en este tutorial usaremos una solución de terceros. Arturs Sosins ha creado un pequeño y práctico módulo para la persistencia de datos en las sesiones de juego.

Descargue la biblioteca y agregue los dos archivos que contiene a su proyecto. Para hacer uso de la biblioteca, agregue la siguiente línea en la parte superior de main.lua.

Para hacer que la biblioteca funcione en nuestro proyecto, necesitamos hacer algunos cambios menores en dataSaver.lua. Abra este archivo y el cambie require "json"  a local json = require "json".

Cambio:

A:

El segundo cambio que debemos hacer es cambiar todas las apariciones de system.ResourceDirectory a system.DocumentsDirectory como se muestra a continuación.

Cambie:

A:


12. createDataFile

Para configurar un almacén de datos, inserte el siguiente fragmento de código debajo de la función setupTextFields. Asegúrese de incluir la definición de la función, ya que no hemos eliminado esta función en el tutorial anterior.

En createDataFile, primero intentamos cargar la clave gameData del protector en la variable gameData. El método loadValue devuelve nil si la clave no existe. Si no existe, inicializamos la tabla gameData, agregamos las propiedades numberOfCredits y numberOfGames, actualizamos los respectivos campos de texto y guardamos la tabla gameData invocando saveValue en saver. Si la clave existe, entonces ya lo hemos hecho y podemos rellenar los campos de texto con los valores correctos.

En el siguiente paso, invocamos la función createDataFile en la función setup como se muestra a continuación.


13. betMax

En betMax, comenzamos cargando nuestros datos en gameData. Si el número de créditos es mayor o igual a 15, seguimos adelante y llamamos doDeal. De lo contrario, el jugador no tiene suficientes créditos para apostar el máximo de 15 créditos y le mostramos una alerta al jugador.


14. bet

En la función de apuesta bet, habilitamos el botón de reparto y eliminamos el oyente de betMaxButton. Como el jugador está haciendo una apuesta regular, no puede jugar una apuesta máxima al mismo tiempo. Necesitamos verificar si el número de créditos es mayor o igual a 5 para asegurarnos de que el jugador no esté intentando apostar más créditos de los que le quedan. Si betAmount es igual a 15, llamamos a doDeal ya que han apostado la cantidad máxima.


15. doDeal

La función doDeal coordina el reparto de las cartas. Si es un juego nuevo, repartimos la mano inicial. De lo contrario, repartimos nuevas cartas al jugador.


16. dealInitialHand

Deshabilitamos los botones de apuesta en dealInitialHand y habilitamos los botones de espera. Invocamos a getCard cinco veces, lo que genera las cinco cartas iniciales. Luego cargamos gameData, actualizamos los créditos actuales currentCredits, calculamos nuevos créditos newCredits, actualizamos el campo de texto de crédito y guardamos gameData.


17. dealNewCards

En dealNewCards, verificamos si el jugador tiene una carta. Si lo son, obtenemos una referencia a la tarjeta actual, llamamos a removeSelf, la configuramos en nil, y obtenemos una nueva tarjeta invocando getCard(i)

Cada vez que elimine algo de la pantalla, debe establecerlo en nil para asegurarse de que esté configurado correctamente para la recolección de basura.

18. getHand

La función getHand determina la mano del jugador. Como se puede ver a continuación, la función es bastante complicada. Vamos a romper si vamos a ver qué está pasando. Comience implementando la función getHand como se muestra a continuación.

Comenzamos llamando a table.sort en la tabla playerHand. El método sort realiza una clasificación en el lugar, utiliza el operador para determinar si un elemento de la tabla debe aparecer antes o después de otro elemento. Podemos pasar una función de comparación como segundo argumento. En nuestro ejemplo, verificamos si la propiedad cardNumber es menor que la anterior. Si es así, entonces intercambia los dos elementos.

Luego creamos una tabla frequencies de frecuencias, la rellenamos con trece ceros (0), recorramos la tabla playerHand e incrementamos el número de cada índice si el playerHand contiene ese número. Por ejemplo, si tuviera dos tres y tres cinco, entonces la tabla frequencies sería 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0.

En el siguiente paso declaramos y configuramos una serie de variables locales que necesitamos en unos momentos. Luego pasamos por la tabla frequencies y verificamos los números para ver si el índice contiene un 2, lo que significa que tenemos un par, un 3, lo que significa que tenemos tres de un tipo, o un 4, lo que significa que tenemos cuatro de un tipo. A continuación, verificamos el número de pares, tres de una clase y cuatro de una clase, y actualizamos los valores de winningHand y el cashAward en consecuencia.

Para verificar si hay un Royal Straight, necesitamos verificar si la primera carta es igual a un as y las restantes serían diez, Jack, Queen y King. Para verificar si hay un Straight normal, recorramos el PlayerHand y verificamos si cada cardNumber posterior es uno mayor que el anterior. Para verificar si hay Flush, verificamos si todas las claves de cardSuit de la combinación son iguales a la tarjeta de la primera cardSuit.

Al final de getHand, invocamos awardWinnings.


19. awardWinnings

En awardWinnings, le mostramos al jugador qué mano tienen en la mano y actualizamos la configuración de GameData. Guardamos gameData e invocamos newGame con un retraso de tres segundos.


20. newGame

En newGame, revisamos y reiniciamos todas las variables, creamos un nuevo mazo de cartas y verificamos si gameData.numberOfCredits es igual a cero. Si es así, entonces el jugador ha gastado todos sus créditos, por lo que les otorgamos 100 créditos más. Finalmente, actualizamos los campos de texto.


21. Probando el juego

Actualice la función setup invocando la función createDeck como se muestra a continuación y pruebe el resultado final.


Conclusión

En este tutorial, creamos un juego de póker divertido e interesante. Aún no implementamos el botón para retirar dinero, pero puedes hacerlo en tu juego. Espero que hayas aprendido algo útil en este tutorial. Deja tus comentarios en los comentarios a continuación.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.