Haciendo un juego de Blackjack en Corona - Implementando el juego

En la parte anterior de esta serie, juntamos nuestra interfaz para un juego de Blackjack y creamos el mazo de cartas. En esta parte del tutorial, agregaremos la lógica de juego de Blackjack necesaria. Empecemos!


17. CreateDataFile ()

Necesitamos una forma de almacenar el dinero del jugador entre las sesiones del juego, y para ello usaremos un simple archivo de texto. Agregue el siguiente código debajo de createDeck () función.

función createDataFile () ruta local = system.pathForFile ("data.txt", system.DocumentsDirectory) local fh, errStr = io.open (ruta, "r") - r significa modo de lectura si fh luego imprime ("DataFile Exists Ya ") - ya existe, por lo que simplemente regresamos de esta función. Return else print (" Reason open failed: "... errStr) - muestra el mensaje de error en el terminal - crea un archivo porque aún no existe fh = io.open (ruta, "w") - w significa modo de escritura si fh entonces money local = 500 fh: write (money) else print ("Error al crear el archivo!" ... errStr) end io.close (fh) end end

Aquí estamos creando un archivo llamado "data.txt" y escribiendo 500 lo. El jugador comenzará el juego con $ 500.00. Es importante asegurarse de que siempre llame io.close () cuando hayas terminado con tus operaciones.

Puede obtener más información sobre cómo crear este archivo de datos en la documentación del sitio de Corona..


18. ReadFile ()

Ahora que tenemos una manera de crear nuestro archivo de datos, necesitamos un método para leer su contenido. Introduzca lo siguiente debajo de createDataFile () Función que ingresaste en el paso anterior.

función readMoney () ruta local = system.pathForFile ("data.txt", system.DocumentsDirectory) local fh, errStr = io.open (ruta, "r") si fh entonces local theMoney = fh: read ("* n" ) devuelve el mensaje "Money else print" ("Reason open failed:" ... errStr): muestra un mensaje de error en el extremo del terminal io.close (fh) end

Abrimos el archivo usando el mismo método, luego usamos leer ("* n") para sacar el valor del archivo de texto. Los "*norte"significa leer como un número.


19. SaveMoney ()

Para completar nuestras operaciones de manejo de archivos, necesitamos una forma de guardar. Ingrese lo siguiente debajo del código que ingresó en el paso anterior.

función saveMoney (money) local path = system.pathForFile ("data.txt", system.DocumentsDirectory) local fh, errStr = io.open (path, "w") si fh then fh: write (money) else print (" Motivo de apertura fallida: "... errStr): muestra un mensaje de error en el extremo del terminal io.close (fh) fin

Aquí abrimos el archivo para escribir como se denota por el "w" en el abierto() método. Entonces escribimos dinero al archivo que fue pasado como parámetro.


20. Configuración del saldo inicial

Ahora debemos crear el saldo inicial cuando se inicie el juego por primera vez. Agrega lo siguiente a la parte superior de Preparar().

función Setup () createDataFile (); setupCoins (); botones de configuración (); setupTextFields (); setupGroups (); createDeck (); fin

Si abres la terminal de Corona y ejecutas la aplicación dos veces, deberías ver "DataFile ya existe"Impreso a la terminal. Salí del impresión() Mensajes en el código de manejo de archivos para que pueda ver los pasos y cualquier error. Si todo funciona bien, siéntete libre de eliminarlos..


21. Mostrando saldo inicial

Así que ahora que tenemos el balance establecido, vamos a mostrarlo en nuestra aplicación. Cambie el siguiente código dentro de setupTextFields () función.

función setupTextFields () instructionsText = display.newText ("Place Your Bet", 300, 300, native.systemFont, 30); instructionsText: setTextColor (0,0,0) bankText = display.newText ("Your Bank: $" ... readMoney (), 10,905, native.systemFont, 30); bankText: setTextColor (0,0,0) betText = display.newText ("", 650,906, native.systemFont, 30); betText: setTextColor (0,0,0); fin

Tenga en cuenta que estamos agregando el saldo en "Su banco: $"llamando al readMoney () función.


22. Apuestas

Ahora que tenemos el dinero en su lugar, podemos agregar el código a nuestro betHandler () función. Creamos esta función en la parte anterior del tutorial, así que asegúrate de agregarla en lugar de redefinirla.!

local betHandler = función (evento) local theMoney = readMoney (); si event.phase == "comenzó" entonces local t = event.target if (bet + t.betAmount> theMoney) luego imprima ("Intentando apostar más de lo que tengo"); imprimir ("El dinero es" ... el dinero); regreso; else bet = bet + t.betAmount local tempImage = display.newImage ("money" ... t.betAmount ... ".png"); local randomX = (math.random () * 150); local randomY = (math.random () * 100); tempImage.x = randomX; tempImage.y = randomY; coinContainer: insertar (tempImage); dealBtn.isVisible = true; instructionsText.text = ""; betText.text = "Tu apuesta: $" ... apuesta; fin extremo fin

Aquí leemos primero cuánto dinero tiene el jugador. Si intentan apostar más de lo que tienen, la función simplemente regresa. He dejado el impresión() Declaraciones en el código para ayudar con la depuración. Establecemos una clave dinámica., betAmount, Cuando configuramos el dinero. Si no están intentando apostar demasiado, sumamos el importe a la apuesta variable.

A continuación creamos un imagen temporal, Genera dos números aleatorios, configura las imágenes. X y y a los números aleatorios, y finalmente agregar la imagen al contenedor de monedas. Notarás que estamos usando "money" ... t.betAmount ... ".png" para la URL de la imagen. Nuestras imágenes para el dinero son nombradas "money10.png"money25.png"y"money50.png", así que todo lo que estamos haciendo aquí es concatenarlos juntos para formar la cadena de imagen.

Por último, configuramos el tratoBtn para ser visible, desactive la instruccionesTexto y establecer el betText igual a la apuesta.

Ahora necesitamos añadir el addListeners () funciona para nuestro Preparar() código. Agrega el siguiente código en la parte inferior.

función Setup () createDataFile () setupCoins (); botones de configuración (); setupTextFields (); setupGroups (); createDeck (); addListeners (); fin

Si prueba la aplicación ahora, debería poder apostar algo de dinero..


23. Obtención de valores de mano

Necesitamos una forma de obtener el valor de la mano del jugador y la mano del crupier. Introduzca lo siguiente debajo de createDeck () función.

función getHandValue (theHand) local handValue = 0; local hasAceInHand = falso; para i = 1, # theHand do local cardsValue = tonumber (string.sub (theHand [i], 2,3)); si (cardsValue> 10) entonces cardsValue = 10; end handValue = handValue + cardsValue; si (cardsValue == 1) entonces hasAceInHand = true; end end if (hasAceInHand y handValue <= 11)then handValue = handValue + 10; end return handValue; end

Creamos un Valor de mano variable y una hasAceInHand variable. A continuación, pasamos a través de la mano que será el jugador a mano o la distribuidor de mano. Creamos una variable tarjetasValor, convirtiéndolo en un número obteniendo una subcadena de la tarjeta actual. Si tarjetasValor es mayor que 10 lo configuramos para 10. Jacks, Queens y Kings están representados por 11, 12, y 13. Entonces agregamos el valor a Valor de mano. Si el valor de la carta es igual a 1 Entonces sabemos que tienen un as en la mano. Si tienen un as y su Valor de mano es menor o igual que 11 añadimos 10 lo.


24. Trato ()

Ahora tenemos todo en orden para un acuerdo, por lo que ahora animaremos las cartas para que el juego sea más interesante. Esta función es bastante grande porque es donde tiene lugar toda la lógica del juego. Lo dividiremos en varios pasos. Agregue el siguiente código dentro del acuerdo() Función que creaste en la primera parte de esta serie..

 dinero10.isVisible = falso; dinero25.isVisible = falso; money50.isVisible = false; dealBtn.isVisible = falso; local randIndex = math.random (#deck) local tempCard = display.newImage ("card_front.png", 630,55); table.insert (allCards, tempCard); cuál es la posición local; local whichArray = ; local whichGroup; if (dealTo == "player") entonces whichArray = playerHand; whichPosition = playerCardsY; whichGroup = playerGroup; else whichArray = dealerHand; whichPosition = dealerCardsY; whichGroup = dealerGroup; end table.insert (whichArray, deck [randIndex]); local xPos = 20 + # whichArray * 35 transition.to (tempCard, time = 1000, x = xPos, y = whichPosition, onComplete = function () if (dealTo == "dealer" y #dealerHand == 1) luego firstDealerCard = deck [randIndex]; dealerGroup: insert (tempCard); else tempCard: removeSelf (); tempCard = display.newImage (deck [randIndex]… ".png", xPos-45, whichPosition-60); whichGroup: insert (tempCard end table.remove (deck, randIndex); if (#dealerHand < 2)then if(dealTo == "player")then dealTo = "dealer" else dealTo = "player" end deal(); end end );

Aquí configuramos nuestro dinero para que sea invisible, y nuestro botón de reparto sea visible. A continuación generamos un randIndex desde el cubierta mesa. Entonces generamos una nueva imagen. tempCard, e inserte el tempCard en el todas las imágenes mesa. Configuramos tres variables locales., cual posición, cuál Array, y que Grupo. Verificamos a quiénes se están tratando actualmente para inicializar estas variables según corresponda.

Luego insertamos mazo [randIndex] dentro cuál Array, que es el jugador a mano o la distribuidor de mano mesa. Recuerda que nuestro mazo está compuesto de cadenas, por lo que mazo [randIndex] sería algo así como "h5"d10".

Establecemos una variable local. xPos igual a 20 + # whichArray * 35, que lo pone a 20 más la longitud de la mesa + 35. La primera vez a través de la longitud de la mesa sería 1, asi que 20 + 1 * 35. La próxima vez a través de la longitud de la mesa sería 2 así sería 20 + 2 * 35. Todo esto es para permitirnos espaciar nuestras tarjetas uniformemente a lo largo del eje X.

Usamos coronas transición a método para mover el tempCard. Cuando la tarjeta completa su transición, verificamos si estamos tratando con el distribuidor y si la longitud de su mano es 1. Si es así, nos ponemos FirstDealerCard igual a mazo [randIndex], e inserte la tarjeta en el grupo de distribuidores. Necesitamos una referencia a la primera carta del crupier para poder mostrarla más adelante..

Si esta no era la primera carta del crupier, quitamos la tempCard, generar una nueva imagen usando mazo [randIndex], e insértelo en el grupo apropiado (jugador o distribuidor). La razón por la que restamos 45 y 60 respectivamente, porque Corona establece el punto de referencia de las imágenes en el centro de forma predeterminada, y nuestras imágenes son 90 x 120. En consecuencia, tomamos la mitad de eso..

Por último sacamos la tarjeta en la posición. randIndex desde el cubierta tabla y comprobar si distribuidor de mano la longitud es menor que 2. Si es así, cambiamos. reparto a su contrario (jugador o dealer) y luego repartir de nuevo..

Finalmente, puedes probar la aplicación, apostar algo de dinero y obtener las dos primeras cartas repartidas.


25. Deal () Continúa ...

Agregue el siguiente código debajo de donde llamamos acuerdo() en el paso anterior.

 si (#dealerHand < 2)then if(dealTo == "player")then dealTo = "dealer" else dealTo = "player" end deal(); elseif(#dealerHand == 2 and #playerHand == 2) then if(getHandValue(playerHand)==21 or getHandValue(dealerHand) == 21)then doGameOver(true); else standBtn.isVisible = true; hitBtn.isVisible = true; end end

Aquí estamos comprobando si ambos distribuidor de mano y jugador a mano's longitud es igual a 2. Si lo son, verificaremos si alguna de sus manos es igual a 21. Si cualquiera de sus manos es igual a 21, el juego ha terminado. Nosotros llamamos doGameOver (verdadero) que otorgará las ganancias y comenzará un nuevo juego. los cierto el parámetro es verdadero para el blackjack. De lo contrario, será falso..


26. DoGameOver ()

los doGameOver () La función premia las ganancias y comienza un nuevo juego. También estaremos codificando esta función en varios pasos. Por ahora podemos usarlo para probar la parte de blackjack. Ingrese el siguiente código debajo de acuerdo función.

function doGameOver (hasBlackJack) local playerHandValue = getHandValue (playerHand); dealerHandValue local = getHandValue (dealerHand); local tempCardX = allCards [2] .x; local tempCardY = allCards [2] .y; allCards [2]: removeSelf (); local tempCard = display.newImage (firstDealerCard… ".png", tempCardX-45, tempCardY-60); dealerGroup: insertar (tempCard); tempCard: toBack (); if (hasBlackJack) entonces if (playerHandValue> dealerHandValue) entonces money = money + bet * 1.5; instructionsText.text = "You Got BlackJack!"; winner = "jugador" else money = money - bet; instructionsText.text = "Dealer got BlackJack!"; winner = "dealer" end end end end end

Aquí obtenemos el valor de la mano del jugador y del crupier. Obtenemos una referencia a allCards [2], X, y y, que es la primera carta del distribuidor, y luego la retiramos de la pantalla. Entonces generamos un tempCard usando el FirstDealerCard variable que configuramos anteriormente. Una vez más restamos 45 y 60. Luego insertamos esta nueva tarjeta en el grupo de distribuidores. Cuando hacemos esto, está en la parte superior de la segunda tarjeta, por lo que la enviamos al final llamando al volver().

Verificamos si ha blackjack es cierto, y si es así, verificamos si la mano del jugador es mayor que la mano del crupier. Si lo es, premiamos algo de dinero, fijamos el instruccionesTexto en consecuencia, y cambio ganador a "jugador".


27. Inicializando el dinero

Necesitamos recordar iniciar el dinero Variable antes de que hagamos algo con ella. Agregue lo siguiente dentro de Preparar() función.

función Setup () createDataFile (); money = readMoney (); setupCoins ();… end

28. Pruebas de Blackjack

Estamos en el punto en el que podemos realizar pruebas para ver si el jugador o el distribuidor tienen blackjack. Cambiaremos temporalmente algún código para probar, pero lo cambiaremos de nuevo. Primero, en el acuerdo función, cambiar lo siguiente.

 elseif (#dealerHand == 2 y #playerHand == 2) luego if (true) entonces doGameOver (true);

Entonces dentro de la doGameOver () función cambiar las dos primeras líneas como tal.

local playerHandValue = 21 - getHandValue (playerHand); dealerHandValue local = 18 -; getHandValue (dealerHand);

Ahora sigue adelante y prueba la aplicación. Debes ver que el jugador obtiene blackjack.

Ahora cambia las dos primeras líneas dentro del DoGameOver a lo siguiente

local playerHandValue = 18 - getHandValue (playerHand); dealerHandValue local = 21 -; getHandValue (dealerHand);

Ahora, si realiza la prueba, debería ver que el crupier ha recibido blackjack.


29. Restablecimiento de pruebas

Ahora que hemos probado, deberíamos restablecer nuestras variables. Dentro de acuerdo función cambiar lo siguiente.

elseif (#dealerHand == 2 y #playerHand == 2) luego if (getHandValue (playerHand) == 21 o getHandValue (dealerHand) == 21) entonces doGameOver (true);

Entonces dentro de la doGameOver () función, cambiar las dos primeras líneas de nuevo a su estado anterior.

local playerHandValue = getHandValue (playerHand); dealerHandValue local = getHandValue (dealerHand);

Si realiza una prueba una vez más, y ni usted ni el crupier obtienen blackjack, el botón de reparto debería volverse invisible y los botones de golpe y soporte deberían ser visibles..


30. Golpear ()

Debemos permitir que el jugador golpee o se pare una vez que se hayan repartido las dos primeras cartas. Ingrese lo siguiente dentro de golpear() Función que ingresaste en la parte anterior de esta serie..

función hit (evento) if ("comenzó" == evento.fase) luego dealTo = "jugador"; acuerdo(); final fin

Si haces la prueba ahora, deberías poder golpear.

Después de algunas pruebas de control de calidad, es posible que haya notado que el jugador puede presionar rápidamente golpear botón una y otra vez, repartiendo muchas cartas a la vez. Así no es como debería funcionar el juego. Para solucionarlo, necesitamos agregar una condición para asegurarnos de que solo puedan alcanzar el momento adecuado. Agregue lo siguiente al final de sus declaraciones de variables.

local canBet = true;

Ahora, cambia el golpear() funciona a lo siguiente.

función hit (evento) if ("comenzó" == evento.fase) luego si (canBet) entonces dealTo = "jugador"; acuerdo(); canBet = falso; fin extremo fin

Dentro de acuerdo() Función, agrega la siguiente línea de código.

transition.to (tempCard, time = 1000, x = xPos, y = whichPosition, onComplete = function () canBet = true;

Ahora el jugador solo puede golpear una vez, la carta ha terminado de ser repartida..


31. Stand ()

Luego debemos permitir que el jugador se pare. Agregue lo siguiente dentro de estar() Función que ingresaste durante la parte anterior de esta serie..

función stand () playerYields = true; standBtn.isVisible = falso; hitBtn.isVisible = falso; if (getHandValue (dealerHand) < 17)then dealTo = "dealer" deal(); else doGameOver(false); end end

Aquí indicamos que el jugador está "sosteniendo". Selecciona el standBtn y hitBtn a lo invisible. Verificamos si la mano del crupier es menor que 17, y si es que cambiamos reparto al comerciante y trato. Si su mano no es menor que 17, entonces llamamos doGameOver (). El distribuidor tiene que pararse en 17 o mayor.

Si realiza la prueba ahora, el jugador puede obtener la mano que desea y luego presionar el soporte. Sin embargo, hay un par de problemas. Si el jugador se quiebra, puede continuar robando cartas y el reparto se detiene en el crupier. Necesitamos que el crupier siga sacando cartas hasta que se le pase. 17 O encima, o hasta que él los bustes. Vamos a solucionar estos problemas cuando terminemos nuestro acuerdo() Funcionar en los siguientes dos pasos.


32. Deal () Continúa ...

Agregue lo siguiente dentro de acuerdo() función.

if (getHandValue (playerHand) == 21 o getHandValue (dealerHand) == 21) entonces doGameOver (verdadero); else standBtn.isVisible = true; hitBtn.isVisible = true; end end end if (#dealerHand> = 3 and (getHandValue (dealerHand) < 17))then deal(); elseif( playerYields and getHandValue(dealerHand)>= 17) entonces standBtn.isVisible = falso; hitBtn.isVisible = falso; doGameOver (falso); fin

Aquí comprobamos para ver si el distribuidor de manoLa longitud de es mayor o igual que 3 y que la mano del crupier es menor que 17. Si su mano es menor que 17 tiene que sacar una carta. De lo contrario, verificamos si el jugador ha cedido y si la mano del crupier es mayor o igual que 17. Si es así, el juego ha terminado. Es posible que el distribuidor tenga 17 o mayor con las dos primeras cartas.


33. Terminando la función Deal ()

Ingrese el siguiente código dentro de acuerdo() función.

if (#dealerHand> = 3 and (getHandValue (dealerHand) < 17))then deal(); elseif( playerYields and getHandValue(dealerHand)>= 17) entonces standBtn.isVisible = falso; hitBtn.isVisible = falso; doGameOver (falso); end if (getHandValue (playerHand)> 21) luego standBtn.isVisible = false; hitBtn.isVisible = falso; doGameOver (falso); fin

Si el jugador golpea y roba una carta que lo pone encima 21, el juego ha terminado.


34. GameOver () Continúa ...

En este paso continuaremos codificando el juego terminado() función. A partir de ahora, la función de reparto solo determina quién gana cuando el jugador o el crupier tienen blackjack. Necesitamos manejar todos los otros resultados posibles. Ingrese lo siguiente dentro de doGameOver () función.

otra cosa dinero = dinero - apuesta; instructionsText.text = "Dealer got BlackJack!"; winner = "dealer" end else else if (playerHandValue> 21) luego instructionsText.text = "You Busted!"; dinero = dinero - apuesta; winner = "dealer"; elseif (dealerHandValue> 21) luego money = money + bet; instructionsText.text = "Busts Dealer. You Win!"; winner = "jugador"; elseif (dealerHandValue> playerHandValue) entonces money = money - bet; instructionsText.text = "You Lose!"; winner = "dealer" elseif (dealerHandValue == playerHandValue) luego money = money - bet; instructionsText.text = "Tie - Dealer Wins!"; winner = "tie" elseif (dealerHandValue) < playerHandValue)then money = money +bet; instructionsText.text="You Win!"; winner = "player" end end

Si prueba el código ahora, debería poder jugar un juego completo. El texto de instrucciones mostrará el resultado. Juega unas cuantas rondas y asegúrate de que todo parece correcto. Si realmente quieres probar el juego a fondo ingresando diferentes valores de manos, puedes usar la misma técnica que usamos anteriormente en este tutorial para probar el blackjack.


35. GameOver () Continúa ...

Introduzca lo siguiente en la parte inferior de la doGameOver () función

elseif (dealerHandValue < playerHandValue)then money = money +bet; instructionsText.text="You Win!"; winner = "player" end end if(money < 10)then money = 500 end saveMoney(money)

Después de cada ronda deberíamos ahorrar el dinero del jugador. Si su dinero es menor que 10 Consideraremos eso en bancarrota y reajustaremos su dinero a 500. Como ejercicio, vea si puede obtener una alerta para que aparezca diciendo algo como "Usted ha quebrado, el concesionario le está otorgando $ 500.00.."


36. Acabado de GameOver ()

Después de cada ronda, movemos las monedas al ganador y luego comenzamos un nuevo juego. Ingrese lo siguiente debajo del código que ingresó en el paso anterior.

saveMoney (dinero) tweenTo local; si (ganador == "jugador") entonces tweenTo = playerCardsY; else tweenTo = dealerCardsY end transition.to (coinContainer, time = 1000, y = tweenTo, onComplete = function () para i = coinContainer.numChildren, 1, -1 do local child = coinContainer [i] child: removeSelf () child = nil; final timer.performWithDelay (2000, newGame); coinContainer.y = 600; end);

Aquí vemos quién ganó la ronda, y luego les animamos las monedas. Cuando la animación se completa, eliminamos todas las monedas de la coinContainer, y ponlos en cero ya que hemos terminado con ellos. Por último, llamamos nuevo juego() Después de dos segundos, también reiniciamos nuestra coinContainer posición.


37. Nuevo juego ()

Introduzca lo siguiente debajo de doGameOver () función.

function newGame () instructionsText.text = "PLACE YOUR BET"; betText.text = ""; money10.isVisible = true; money25.isVisible = true; money50.isVisible = true; bankText.text = "Your Bank: $"… readMoney () para i = dealerGroup.numChildren, 1, -1 do local child = dealerGroup [i] child: removeSelf () child = nil; end for i = playerGroup.numChildren, 1, -1 do local child = playerGroup [i] child: removeSelf () child = nil; end dealTo = "jugador"; playerHand = ; dealerHand = ; allCards = ; createDeck () ;; playerYields = falso; ganador = ""; apuesta = 0; canBet = true; fin

Aquí configuramos el dinero como visible, retiramos las cartas tanto del jugador como de los grupos de distribuidores, y restablecemos todas nuestras variables.


Conclusión

Hemos codificado un juego de blackjack divertido e interesante con el SDK de Corona. Gracias por leer, espero que hayas encontrado este tutorial útil!