Dans la partie précédente de cette série, nous avons assemblé notre interface pour un jeu de blackjack et créé le jeu de cartes. Dans cette partie du didacticiel, nous ajouterons la logique de jeu de Blackjack nécessaire. Commençons!
Nous avons besoin d'un moyen de stocker l'argent du joueur entre les sessions de jeu. Pour ce faire, nous utilisons un simple fichier texte. Ajoutez le code suivant sous le createDeck ()
une fonction.
function createDataFile () chemin local = system.pathForFile ("data.txt", system.DocumentsDirectory) fh local, errStr = io.open (chemin, "r") - r signifie le mode lecture si fh puis print ("DataFile Exists Déjà ") - existe déjà, nous revenons donc de cette fonction return else print (" Reason open failed: "… errStr) - affichage du message d'échec dans le terminal - création du fichier car il n'existe pas encore fh = io.open (chemin, "w") - w signifie mode d'écriture si fh, argent local = 500 fh: write (money) else print ("La création du fichier a échoué!"… errStr) end io.close (fh) end end
Ici nous créons un fichier nommé "data.txt"et l'écriture 500 à cela. Le joueur va commencer le jeu avec 500,00 $. Il est important de toujours téléphoner io.close ()
quand vous avez fini vos opérations.
Vous pouvez en apprendre plus sur la création de ce fichier de données dans la documentation du site Corona..
Maintenant que nous avons un moyen de créer notre fichier de données, nous avons besoin d’une méthode pour lire son contenu. Entrez ce qui suit sous le createDataFile ()
fonction que vous avez entrée à l'étape ci-dessus.
function readMoney () chemin local = system.pathForFile ("data.txt", system.DocumentsDirectory) fh local, errStr = io.open (chemin, "r") si fh, alors theMoney local = fh: read ("* n" ) renvoie theMoney else print ("Reason open failed:"… errStr) - Affiche le message d'échec à la fin du terminal io.close (fh) end
Nous ouvrons le fichier en utilisant la même méthode, puis nous utilisons read ("* n")
pour obtenir la valeur du fichier texte. Le "* n"signifie lu comme un nombre.
Pour terminer nos opérations de traitement de fichiers, nous avons besoin d’un moyen de sauvegarder. Entrez ce qui suit sous le code que vous avez entré à l'étape ci-dessus.
function saveMoney (money) chemin local = system.pathForFile ("data.txt", system.DocumentsDirectory) fh local, errStr = io.open (chemin, "w") si fh alors fh: write (money) sinon print (" La raison de l'ouverture a échoué: "… errStr) - affichage du message d'échec à la fin du terminal io.close (fh) end
Ici, nous ouvrons le fichier en écriture comme indiqué par le "w" dans le ouvrir()
méthode. Nous écrivons alors argent
au fichier qui a été passé en paramètre.
Nous devons maintenant créer l’équilibre initial au début du jeu. Ajouter ce qui suit au sommet de Installer()
.
fonction Setup () createDataFile (); setupCoins (); setupButtons (); setupTextFields (); setupGroups (); createDeck (); fin
Si vous ouvrez le terminal Corona et exécutez l'application deux fois, vous devriez voir "Le fichier de données existe déjà"imprimé sur le terminal. J'ai laissé le impression()
messages dans le code de traitement du fichier afin que vous puissiez voir les étapes et les erreurs. Si tout fonctionne bien, n'hésitez pas à les supprimer.
Alors maintenant que nous avons la balance définie, montrons-la dans notre application. Changer le code suivant dans le setupTextFields ()
une fonction.
function setupTextFields () instructionsText = display.newText ("Placez votre pari", 300, 300, native.systemFont, 30); instructionsText: setTextColor (0,0,0) bankText = display.newText ("Votre banque: $"… 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
Notez que nous ajoutons le solde sur "Votre banque: $"en appelant le readMoney ()
une fonction.
Maintenant que nous avons l'argent en place, nous pouvons ajouter le code à notre betHandler ()
une fonction. Nous avons créé cette fonction dans la partie précédente du tutoriel, assurez-vous donc de l'ajouter au lieu de la redéfinir.!
local betHandler = fonction (événement) local theMoney = readMoney (); si event.phase == "a commencé", alors t local = event.target if (bet + t.betAmount> theMoney) puis print ("Essayer de parier plus que d’avoir"); print ("Money is"… theMoney); revenir; else bet = bet + t.betAmount local tempImage = display.newImage ("money"… t.betAmount… ".png"); randomX local = (math.random () * 150); randomY local = (math.random () * 100); tempImage.x = randomX; tempImage.y = aléatoireY; coinContainer: insert (tempImage); dealBtn.isVisible = true; instructionsText.text = ""; betText.text = "Votre pari: $"… pari; fin fin fin
Ici nous lisons d’abord combien d’argent le joueur a. S'ils essaient de parier plus qu'ils ne le font, la fonction revient tout simplement. J'ai quitté le impression()
instructions dans le code pour aider au débogage. Nous définissons une clé dynamique, montant
, quand nous mettons en place l'argent. S'ils n'essayent pas trop de parier, nous ajoutons le montant au pari
variable.
Ensuite, nous créons un tempImage
, générer deux nombres aléatoires, définir les images X
et y
aux nombres aléatoires, et enfin ajouter l'image au conteneur de pièces de monnaie. Vous remarquerez que nous utilisons "argent"… t.betAmount… ".png"
pour l'URL de l'image. Nos images pour l'argent sont nommés "money10.png","money25.png" et "money50.png", donc tout ce que nous faisons ici est de les concaténer pour former la chaîne d'image.
Enfin, nous définissons la dealBtn
pour être visible, effacer le instructionsTexte
et mettre le betText
égale à la pari
.
Maintenant, nous devons ajouter le addListeners ()
fonctionner à notre Installer()
code. Ajoutez le code suivant en bas.
fonction Setup () createDataFile () setupCoins (); setupButtons (); setupTextFields (); setupGroups (); createDeck (); addListeners (); fin
Si vous testez l'application maintenant, vous devriez pouvoir parier de l'argent.
Nous avons besoin d'un moyen d'obtenir la valeur de main de la main du joueur et de celle du donneur. Entrez ce qui suit sous le createDeck ()
une fonction.
function getHandValue (theHand) handValue locale = 0; hasAceInHand local = false; pour i = 1, # theHand do local cardsValue = tonumber (string.sub (theHand [i], 2,3)); si (cardsValue> 10) alors CardsValue = 10; end handValue = handValue + cardsValue; if (cardsValue == 1) alors hasAceInHand = true; end end if (hasAceInHand et handValue <= 11)then handValue = handValue + 10; end return handValue; end
Nous mettons en place un valeur de la main
variable et un hasAceInHand
variable. Ensuite, nous parcourons la main
qui sera soit le playerHand
ou la dealerHand
. Nous créons une variable cartesValeur
, en la convertissant en nombre en obtenant une sous-chaîne de la carte actuelle. Si cartesValeur
est supérieur à dix nous l'avons mis à dix. Jacks, Queens et Kings sont représentés par 11, 12, et 13. Nous ajoutons ensuite la valeur à valeur de la main
. Si la valeur de la carte est égale à 1 alors nous savons qu'ils ont un as dans leur main. S'ils ont un as et leur valeur de la main
est inférieur ou égal à 11 nous ajoutons dix à cela.
Nous avons maintenant tout mis en place pour un accord, alors maintenant nous allons animer les cartes pour rendre le jeu plus intéressant. Cette fonction est assez grande car c'est là que se déroule toute la logique du jeu. Nous allons le diviser en plusieurs étapes. Ajoutez le code suivant dans le traiter()
fonction que vous avez créée dans la première partie de cette série.
money10.isVisible = false; money25.isVisible = false; money50.isVisible = false; dealBtn.isVisible = false; randIndex local = math.random (#deck) tempCard locale = display.newImage ("card_front.png", 630,55); table.insert (allCards, tempCard); local quiPosition; local whichArray = ; local quiGroupe; if (dealTo == "player"), alors whichArray = playerHand; quellePosition = playerCardsY; quel groupe = groupe de joueurs; else whatArray = dealerHand; quellePosition = dealerCardsY; whichGroup = dealerGroup; end table.insert (whichArray, deck [randIndex]); xPos local = 20 + # whichArray * 35 transition.to (tempCard, heure = 1000, x = xPos, y = quellePosition, onComplete = fonction () if (dealTo == "dealer" et #dealerHand == 1), puis firstDealerCard = deck [randIndex]; dealerGroup: insert (tempCard); sinon tempCard: removeSelf (); tempCard = display.newImage (deck [randIndex]… ".png", xPos-45, quellePosition-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 );
Ici, nous définissons notre argent comme étant invisible et notre bouton de transaction comme étant visible. Ensuite, nous générons un randIndex
du plate-forme
table. Nous générons ensuite une nouvelle image tempCard
, et insérez le tempCard
dans le toutes les images
table. Nous mettons en place trois variables locales, quelle position
, quel tableau
, et quel groupe
. Nous vérifions qui est en train d'être traité pour initialiser ces variables de manière appropriée.
Nous insérons ensuite pont [randIndex]
dans quel tableau
, qui est soit le playerHand
ou la dealerHand
table. Rappelez-vous que notre deck est composé de chaînes, donc deck [randIndex] serait quelque chose comme "h5","d10".
Nous définissons une variable locale xPos
égal à 20 + # quiArray * 35
, ce qui le met à 20 plus la longueur de la table + 35. La première fois à travers la table serait 1, alors 20 + 1 * 35. La prochaine fois à travers la longueur de la table serait 2 donc ce serait 20 + 2 * 35. Tout cela nous permet d'espacer nos cartes uniformément le long de l'axe X.
Nous utilisons des couronnes Transition vers
méthode pour déplacer le tempCard
. Lorsque la carte termine sa transition, nous vérifions si nous traitons avec le revendeur et si la longueur de sa main est correcte. 1. Si oui, nous mettons firstDealerCard
égal à pont [randIndex]
, et insérez la carte dans le dealerGroup
. Nous avons besoin d'une référence à la première carte du revendeur pour pouvoir la montrer plus tard..
Si ce n’était pas la première carte du donneur, nous retirons le tempCard
, générer une nouvelle image en utilisant pont [randIndex]
, et insérez-le dans le groupe approprié (joueur ou croupier). La raison pour laquelle nous soustrayons 45 et 60 respectivement parce que Corona définit le point de référence des images au centre par défaut, et nos images sont 90 x 120. Par conséquent, nous prenons la moitié de cette.
Enfin on enlève la carte en position randIndex
du plate-forme
table et vérifier si dealerHand
la longueur est inférieure à 2. Si c'est le cas, nous changeons traiter
à son opposé (joueur ou croupier) et ensuite traiter.
Enfin, vous pouvez tester l'application, parier de l'argent et obtenir les deux premières cartes distribuées.
Ajoutez le code suivant sous l'endroit où nous avons appelé traiter()
dans l'étape ci-dessus.
if (#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
Ici, nous vérifions si les deux dealerHand
et playerHand
La longueur de est égale à 2. Si tel est le cas, nous vérifierons si l'une de leurs mains est égale à 21. Si l'une de leurs mains est égale à 21, le jeu est terminé. Nous appelons doGameOver (true)
qui va attribuer des gains et commencer une nouvelle partie. le vrai
paramètre est vrai pour le blackjack. Sinon, ce sera faux.
le doGameOver ()
fonction attribue les gains et commence une nouvelle partie. Nous allons également coder cette fonction en plusieurs étapes. Pour l'instant, nous pouvons l'utiliser pour tester la partie blackjack. Entrez le code suivant sous le traiter
une fonction.
function doGameOver (hasBlackJack) local playerHandValue = getHandValue (playerHand); local dealerHandValue = getHandValue (dealerHand); tempCardX local = allCards [2] .x; tempCardY locale = toutes les cartes [2] .y; allCards [2]: removeSelf (); tempCard locale = display.newImage (firstDealerCard… ".png", tempCardX-45, tempCardY-60); dealerGroup: insérer (tempCard); tempCard: toBack (); if (hasBlackJack) puis if (playerHandValue> dealerHandValue), alors money = money + bet * 1.5; instructionsText.text = "Vous avez BlackJack!"; gagnant = "joueur" else money = money - bet; instructionsText.text = "Le revendeur a obtenu un BlackJack!"; gagnant = "dealer" fin fin fin
Ici, nous obtenons la valeur de la main du joueur et du donneur. Nous obtenons une référence à toutes les cartes [2]
, X
, et y
, qui est la première carte du revendeur, puis nous la retirons de l’affichage. Nous générons ensuite un tempCard
en utilisant le firstDealerCard
variable que nous avons configurée plus tôt. Encore une fois on soustrait 45 et 60. Nous insérons ensuite cette nouvelle carte dans le dealerGroup
. Quand nous faisons cela, c'est sur la deuxième carte, nous l'envoyons à l'arrière en appelant retourner()
.
Nous vérifions si hasBlackJack
est vrai, et si c'est le cas, nous vérifions si la main du joueur est supérieure à celle du donneur. Si c’est le cas, nous accordons de l’argent, fixons la instructionsTexte
en conséquence, et changer gagnant
à "joueur".
Nous devons nous rappeler d’initialiser le argent
variable avant de faire quoi que ce soit avec elle. Ajouter ce qui suit dans le Installer()
une fonction.
fonction Setup () createDataFile (); money = readMoney (); setupCoins ();… end
Nous sommes au point où nous pouvons tester pour voir si le joueur ou le croupier a un black jack. Nous allons changer temporairement du code à tester, mais nous le changerons en retour. Tout d'abord, dans le traiter
fonction, changez ce qui suit.
elseif (#dealerHand == 2 et #playerHand == 2) alors if (true), alors doGameOver (true);
Puis dans le doGameOver ()
fonction changer les deux premières lignes comme si.
local playerHandValue = 21 - getHandValue (playerHand); local dealerHandValue = 18 -; getHandValue (dealerHand);
Maintenant, allez-y et testez l'application. Vous devriez voir que le joueur obtient un blackjack.
Maintenant, changez les deux premières lignes à l'intérieur du doGameOver
au suivant
local playerHandValue = 18 - getHandValue (playerHand); local dealerHandValue = 21 -; getHandValue (dealerHand);
Maintenant, si vous testez, vous devriez voir que le croupier a obtenu un blackjack.
Maintenant que nous avons testé, nous devrions définir nos variables. À l'intérieur de traiter
fonction changer ce qui suit.
elseif (#dealerHand == 2 et #playerHand == 2) alors si (getHandValue (playerHand) == 21 ou getHandValue (dealerHand) == 21), alors exécutez DoGameOver (true);
Puis dans le doGameOver ()
fonction, remet les deux premières lignes à leur état précédent.
playerHandValue local = getHandValue (playerHand); local dealerHandValue = getHandValue (dealerHand);
Si vous testez une fois de plus et que ni vous ni le croupier n’obtenez un blackjack, le bouton Deal devrait devenir invisible et les boutons Tirer et tenir doivent apparaître..
Nous devons permettre au joueur de frapper ou de rester debout une fois que les deux premières cartes ont été distribuées. Entrez les informations suivantes dans le frappé()
fonction que vous avez entrée dans la partie précédente de cette série.
function hit (event) if ("started" == event.phase) puis dealTo = "player"; traiter(); fin fin
Si vous testez maintenant, vous devriez pouvoir frapper.
Après quelques tests de contrôle de la qualité, vous avez peut-être remarqué que le lecteur peut appuyer rapidement sur le bouton. frappé bouton encore et encore, distribuant plusieurs cartes à la fois. Ce n'est pas comme ça que le jeu devrait fonctionner. Pour résoudre ce problème, nous devons ajouter une condition afin de s’assurer qu’ils ne peuvent toucher que le moment voulu. Ajoutez ce qui suit au bas de vos déclarations de variables.
local canBet = true;
Maintenant, changez le frappé()
fonction à la suivante.
fonction hit (event) if ("commencé" == event.phase) puis if (canBet) then dealTo = "player"; traiter(); canBet = false; fin fin fin
Dans le traiter()
fonction, ajoute la ligne de code suivante.
transition.to (tempCard, time = 1000, x = xPos, y = quellePosition, onComplete = function () canBet = true;
Maintenant, le joueur ne peut frapper qu'une fois, la carte a fini d'être distribuée.
Ensuite, nous devons permettre au joueur de rester debout. Ajouter ce qui suit dans le supporter()
fonction que vous avez entrée lors de la partie précédente de cette série.
fonction stand () playerYields = true; standBtn.isVisible = false; hitBtn.isVisible = false; if (getHandValue (dealerHand) < 17)then dealTo = "dealer" deal(); else doGameOver(false); end end
Ici, nous indiquons que le joueur est "en attente". Met le standBtn
et hitBtn
à invisible. Nous vérifions si la main du revendeur est inférieure à 17, et si c'est nous changeons traiter
au concessionnaire et affaire. Si sa main n'est pas inférieure à 17, alors on appelle doGameOver ()
. Le concessionnaire doit se tenir debout 17 ou plus grand.
Si vous testez maintenant, le joueur peut obtenir la main qu'il souhaite et appuyer ensuite sur la touche Stand. Il y a cependant quelques problèmes. Si le joueur fait faillite, il peut continuer à piocher des cartes et les pauses sont distribuées au donneur. Nous avons besoin du croupier pour continuer à tirer les cartes jusqu'à ce qu'il ait fini 17 ou plus, ou jusqu'à ce qu'il busto. Nous réglerons ces problèmes lorsque nous aurons terminé notre traiter()
fonctionner dans les deux prochaines étapes.
Ajouter ce qui suit dans le traiter()
une fonction.
si (getHandValue (playerHand) == 21 ou getHandValue (dealerHand) == 21), alors doGameOver (true); sinon standBtn.isVisible = true; hitBtn.isVisible = true; end end if (#dealerHand> = 3 et (getHandValue (dealerHand) < 17))then deal(); elseif( playerYields and getHandValue(dealerHand)>= 17) alors standBtn.isVisible = false; hitBtn.isVisible = false; doGameOver (false); fin
Ici, nous vérifions si le dealerHand
La longueur de est supérieure ou égale à 3 et que la main du revendeur est inférieure à 17. Si sa main est inférieure à 17 il doit piocher une carte. Sinon, nous vérifions si le joueur a cédé et si la main du donneur est supérieure ou égale à 17. Si c'est le cas, le jeu est terminé. Il est possible que le concessionnaire ait 17 ou plus avec les deux premières cartes.
Entrez le code suivant dans le champ traiter()
une fonction.
if (#dealerHand> = 3 et (getHandValue (dealerHand) < 17))then deal(); elseif( playerYields and getHandValue(dealerHand)>= 17) alors standBtn.isVisible = false; hitBtn.isVisible = false; doGameOver (false); se termine si (getHandValue (playerHand)> 21), alors standBtn.isVisible = false; hitBtn.isVisible = false; doGameOver (false); fin
Si le joueur frappe et pioche une carte qui le met plus 21, le jeu est terminé.
Dans cette étape, nous allons continuer à coder le jeu terminé()
une fonction. À partir de maintenant, la fonction de vente détermine uniquement qui gagne lorsque le joueur ou le croupier a un blackjack. Nous devons gérer tous les autres résultats possibles. Entrez les informations suivantes dans le doGameOver ()
une fonction.
sinon argent = argent - pari; instructionsText.text = "Le revendeur a obtenu un BlackJack!"; winner = "dealer" et fin si if (playerHandValue> 21), alors instructionsText.text = "You Busted!"; argent = argent - pari; gagnant = "concessionnaire"; elseif (dealerHandValue> 21) alors money = money + bet; instructionsText.text = "Les batailles du concessionnaire. Vous gagnez!"; gagnant = "joueur"; elseif (dealerHandValue> playerHandValue) puis money = money - bet; instructionsText.text = "Vous perdez!"; gagnant = "dealer" elseif (dealerHandValue == playerHandValue) puis money = money - bet; instructionsText.text = "Cravate - Le revendeur gagne!"; gagnant = "tie" elseif (dealerHandValue < playerHandValue)then money = money +bet; instructionsText.text="You Win!"; winner = "player" end end
Si vous testez le code maintenant, vous devriez pouvoir jouer à un jeu complet. Le texte d'instruction montrera le résultat. Jouez quelques tours et assurez-vous que tout semble correct. Si vous voulez vraiment tester le jeu en profondeur en entrant différentes valeurs de main, vous pouvez utiliser la même technique que celle utilisée précédemment dans ce didacticiel pour tester le blackjack..
Entrez ce qui suit au bas de la doGameOver ()
une fonction
elseif (dealerHandValue < playerHandValue)then money = money +bet; instructionsText.text="You Win!"; winner = "player" end end if(money < 10)then money = 500 end saveMoney(money)
Après chaque tour, nous devrions économiser l'argent du joueur. Si leur argent est inférieur à dix nous considérerons cette faillite et réinitialiser leur argent à 500. En guise d’exercice, voyez si vous pouvez obtenir une alerte pour faire apparaître quelque chose comme "Vous avez fait faillite, le concessionnaire vous octroie 500,00 $."
Après chaque tour, nous déplaçons les pièces vers le gagnant et commençons une nouvelle partie. Entrez ce qui suit sous le code que vous avez entré à l'étape ci-dessus.
saveMoney (money) local tweenTo; if (gagnant == "joueur") puis tweenTo = playerCardsY; else tweenTo = dealerCardsY et la transition.to (coinContainer, heure = 1 000, y = tweenTo, onComplete = fonction () pour i = coinContainer.numChildren, 1, -1 pour un enfant local = coinContainer [i] child: removeSelf () child = nil; end timer.performWithDelay (2000, newGame); coinContainer.y = 600; end);
Nous voyons ici qui a remporté le tour, puis nous leur animons les pièces. Lorsque l'animation est terminée, nous retirons toutes les pièces de la coinContainer
, et les mettre à zéro puisque nous avons fini avec eux. Enfin, nous appelons nouveau jeu()
après deux secondes, nous réinitialisons également notre coinContainer
position.
Entrez ce qui suit sous le doGameOver ()
une fonction.
function newGame () instructionsText.text = "PLACE YOUR BET"; betText.text = ""; money10.isVisible = true; money25.isVisible = true; money50.isVisible = true; bankText.text = "Votre banque: $"… readMoney () pour i = dealerGroup.numChildren, 1, -1 enfant local = concessionnaireGroup [i] enfant: removeSelf () enfant = nil; end pour i = joueurGroupe.numChildren, 1, -1 enfant local = joueurGroupe [i] enfant: removeSelf () enfant = nil; end dealTo = "player"; playerHand = ; dealerHand = ; toutes les cartes = ; createDeck () ;; playerYields = false; gagnant = ""; bet = 0; canBet = true; fin
Ici, nous définissons l'argent sur visible, retirons les cartes des groupes de joueurs et de distributeurs et réinitialisons toutes nos variables..
Nous avons codé un jeu de blackjack amusant et intéressant en utilisant le SDK Corona. Merci d'avoir lu, j'espère que vous avez trouvé ce tutoriel utile!