În partea anterioară a acestei serii, am pus interfața noastră împreună pentru un joc Blackjack și am creat pachetul de cărți. În această parte a tutorialului, vom adăuga logica jocului Blackjack necesar. Să începem!
Avem nevoie de o modalitate de a stoca banii jucătorului între sesiunile de joc, iar pentru a face acest lucru vom folosi un fișier text simplu. Adăugați următorul cod sub createDeck ()
funcţie.
funcția createDataFile () calea locală = system.pathForFile ("data.txt", system.DocumentsDirectory) local fh, errStr = io.open (calea "r") - r înseamnă modul de citire dacă fh apoi print (" Deja ") - există deja, așa că tocmai ne întoarcem de la această funcție înapoiește altceva print (" Motiv deschis deschis: "... errStr) - afișarea mesajului de eroare în terminal - crearea fișierului deoarece nu există încă fh = io.open (calea "w") - w înseamnă modul de scriere dacă fh apoi banul local = 500 fh: scrie (bani) alt tipar ("Crearea fișierului nu a reușit" ... errStr) end io.close
Aici creăm un fișier numit "data.txt"și scris 500 la el. Jucătorul va începe jocul cu $ 500,00. Este important să vă asigurați că vă sunați întotdeauna io.close ()
când ați terminat operațiunile.
Puteți afla mai multe despre crearea acestui fișier de date în documentația de pe site-ul Corona.
Acum, că avem o modalitate de a crea fișierul nostru de date, avem nevoie de o metodă pentru a citi conținutul acestuia. Introduceți următoarele sub createDataFile ()
funcția pe care ați introdus-o în pasul de mai sus.
funcția readMoney () calea locală = system.pathForFile ("data.txt", system.DocumentsDirectory) local fh, errStr = io.open (calea "r") dacă fh locală theMoney = ) returnați imprimareaMoney else ("Motiv deschis deschis:" ... errStr) - afișarea mesajului de eroare în capătul terminalului io.close (fh) end
Deschidem fișierul folosind aceeași metodă, apoi folosim citește ( "* n")
pentru a obține valoarea din fișierul text. ""* n"înseamnă citirea ca număr.
Pentru a finaliza operațiile de gestionare a fișierelor, avem nevoie de o modalitate de salvare. Introduceți următoarele sub codul introdus în pasul de mai sus.
funcția saveMoney (bani) calea locală = system.pathForFile ("data.txt", system.DocumentsDirectory) local fh, errStr = io.open (calea "w") if fh then fh: Motivul deschis a eșuat: "... errStr) - afișează mesajul de eroare în capătul final al terminalului io.close (fh)
Aici vom deschide fișierul pentru scriere așa cum este indicat de "w" în deschis()
metodă. Atunci scriem bani
la fișierul care a fost transmis ca parametru.
Acum trebuie să creați soldul inițial când începe jocul. Adăugați următoarele în partea de sus a paginii Înființat()
.
funcția Setup () createDataFile (); setupCoins (); setupButtons (); setupTextFields (); setupGroups (); createDeck (); Sfârșit
Dacă deschideți terminalul Corona și rulați aplicația de două ori, ar trebui să vedeți "DataFile există deja"tipărit la terminal. Am plecat imprimare()
mesaje în codul de manipulare a fișierelor, astfel încât să puteți vedea pașii și eventualele erori. Dacă totul funcționează bine, nu ezitați să le eliminați.
Deci, acum că avem balanța stabilită, să o prezentăm în aplicația noastră. Modificați următorul cod în cadrul setupTextFields ()
funcţie.
funcția setupTextFields () instructionsText = display.newText ("Place Your Bet", 300, 300, native.systemFont, 30); instrucțiuniText: setTextColor (0,0,0) bankText = display.newText ("Banca dvs.: $" ... readMoney (), 10,905, native.systemFont, 30); banTxt: setTextColor (0,0,0) betText = display.newText ("", 650,906, native.systemFont, 30); betText: setTextColor (0,0,0); Sfârșit
Rețineți că adăugăm soldul la "Banca dvs.: $"prin apelarea readMoney ()
funcţie.
Acum, că avem banii în loc, putem adăuga codul nostru betHandler ()
funcţie. Am creat această funcție în partea anterioară a tutorialului, deci asigurați-vă că adăugați în ea în loc să o redefiniți!
local betHandler = funcție (eveniment) local theMoney = readMoney (); dacă event.phase == "a început" atunci local t = event.target dacă (bet + t.betAmount> theMoney) apoi tipăriți ("Încercarea de a paria mai mult decât au"); imprimare ("Money is" ... theMoney); întoarcere; altceva bet = bet + t.betAmount local tempImage = display.newImage ("bani" ... t.betAmount ... ".png"); local randomX = (math.random () * 150); local randomY = (math.random () * 100); tempImage.x = randomX; tempImage.y = aleatoriu; coinContainer: inserare (tempImage); dealBtn.isVisible = true; instructionsText.text = ""; betText.text = "Pariul dvs.: $" ... pariu; sfârșitul capătului final
Aici am citit mai întâi câte bani are jucătorul. Dacă încearcă să parieze mai mult decât au, funcția se întoarce pur și simplu. Am lăsat-o imprimare()
instrucțiuni din cod pentru a ajuta la depanare. Am stabilit o cheie dinamică, betAmount
, când ne-am înființat banii. Dacă nu încearcă să parieze prea mult, adăugăm suma la pariu
variabil.
Apoi vom crea o tempImage
, generați două numere aleatorii, setați imaginile X
și y
la numerele aleatoare și, în final, adăugați imaginea în containerul pentru monede. Veți observa că folosim "bani" ... t.betAmount ... ".png"
pentru adresa URL a imaginii. Imaginile noastre pentru bani sunt numite "money10.png","money25.png" și "money50.png", deci tot ceea ce facem aici este să le concatenăm împreună pentru a forma șirul de imagini.
În cele din urmă, am setat dealBtn
pentru a fi vizibile, eliminați instructionsText
și setați betText
egal cu pariu
.
Acum trebuie să adăugăm addListeners ()
funcția noastră Înființat()
cod. Adăugați următorul cod în partea de jos.
setarea funcției () createDataFile () setupCoins (); setupButtons (); setupTextFields (); setupGroups (); createDeck (); addListeners (); Sfârșit
Dacă testați acum aplicația, ar trebui să puteți paria niște bani.
Avem nevoie de o modalitate de a obține valoarea mână a mâinii jucătorului și a mâinii dealerului. Introduceți următoarele sub createDeck ()
funcţie.
funcția getHandValue (theHand) handValue local = 0; local hasAceInHand = false; pentru i = 1, #Harta face cartele localeValue = tonumber (string.sub (Hand [i], 2,3)); dacă (cardsValue> 10), apoi cardsValue = 10; end handValue = HandValue + cardsValue; dacă (cardsValue == 1) areAceInHand = adevărat; sfârșitul final dacă (hasAceInHand și handValue <= 11)then handValue = handValue + 10; end return handValue; end
Am creat o handValue
variabilă și a hasAceInHand
variabil. Apoi, ne batem mana
care va fi fie playerHand
sau dealerHand
. Creăm o variabilă cardsValue
, turnându-l la un număr prin obținerea unui substring al cardului curent. Dacă cardsValue
este mai mare decât 10 am stabilit-o 10. Jacks, Queens și Kings sunt reprezentați de 11, 12, și 13. Apoi adăugăm valoarea la handValue
. Dacă valoarea cardului este egală cu 1 atunci știm că au un as în mână. Dacă au un as și ei handValue
este mai mică sau egală cu 11 adaugam 10 la el.
Acum avem totul pentru o înțelegere, așa că acum vom anima cărțile pentru a face jocul mai interesant. Această funcție este destul de mare pentru că acolo este locul în care are loc toată logica jocului. O vom împărți în mai mulți pași. Adăugați următorul cod în afacere()
pe care ați creat-o în prima parte a acestei serii.
money10.isVisible = false; money25.isVisible = false; money50.isVisible = false; dealBtn.isVisible = false; local randIndex = math.random (#deck) tempCard local = display.newImage ("card_front.png", 630,55); table.insert (allCards, tempCard); local carePoziție; local careArray = ; local careGrup; dacă (dealTo == "player") atunci careArray = playerHand; whichPosition = carduri jucător; whichGroup = playerGroup; altceva whichArray = dealerHand; whichPosition = dealerCardsY; whichGroup = dealerGroup; end table.insert (careArray, punte [randIndex]); (x = xPos, y = carePosition, onComplete = function () dacă (dealTo == "dealer" și #dealerHand == 1), apoi firstDealerCard = deck [randIndex]; dealerGroup: insert (tempCard); altul tempCard: removeSelf (); tempCard = display.newImage (deck [randIndex] ... "png", xPos-45, whichPosition-60) ); end table.remove (punte, randIndex); dacă (#dealerHand < 2)then if(dealTo == "player")then dealTo = "dealer" else dealTo = "player" end deal(); end end );
Aici ne-am stabilit banii pentru a fi invizibili, iar butonul nostru de tranzacționare să fie vizibil. Apoi vom genera o randIndex
de la punte
masa. Apoi generăm o nouă imagine tempCard
, și introduceți tempCard
în allImages
masa. Am creat trei variabile locale, care poziție
, whichArray
, și care grup
. Verificăm cine este tratat în prezent pentru a inițializa aceste variabile, după caz.
Apoi inserăm punte [randIndex]
în whichArray
, care este fie playerHand
sau dealerHand
masa. Amintiți-vă că puntea noastră este compusă din șiruri de caractere, astfel încât puntea [randIndex] ar fi ceva de genul "h5""D10".
Am setat o variabilă locală xPos
egal cu 20 + # whichArray * 35
, care o stabilește 20 plus lungimea mesei + 35. Prima dată prin lungimea mesei ar fi 1, asa de 20 + 1 * 35. Data viitoare prin lungimea mesei ar fi 2 așa ar fi 20 + 2 * 35. Toate acestea ne permit să ne dispunem în mod egal cardurile de-a lungul axei X..
Folosim coroane transition.to
metoda de a muta tempCard
. Când cardul își încheie tranziția, verificăm dacă avem de-a face cu dealerul și dacă lungimea mâinii este 1. Dacă da, am stabilit firstDealerCard
egal cu punte [randIndex]
, și introduceți cartela în dealerGroup
. Avem nevoie de o referire la primul card al dealerului, astfel încât să îl putem arăta mai târziu.
Dacă nu a fost prima carte a dealerului, atunci vom elimina tempCard
, generează o nouă imagine prin utilizarea punte [randIndex]
, și introduceți-o în grupul corespunzător (jucător sau distribuitor). Motivul pentru care scădem 45 și 60 respectiv, deoarece Corona stabilește punctul de referință al imaginilor la centru în mod implicit și imaginile noastre sunt 90 x 120. În consecință, luăm jumătate din asta.
În cele din urmă, scoatem cardul în poziție randIndex
de la punte
tabel și verificați dacă dealerHand
lungimea este mai mică decât 2. Dacă este, ne schimbăm dealTo
la opusul său (jucător sau distribuitor) și apoi rezolvați din nou.
În cele din urmă, puteți testa aplicația, puteți paria niște bani și primiți primele două cărți.
Adăugați următorul cod de mai jos, în cazul în care am sunat afacere()
în pasul de mai sus.
în cazul în care (#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
Aici verificăm dacă amândouă dealerHand
și playerHand
lungimea lor sunt egale cu 2. Dacă sunt, vom verifica dacă una din mâinile lor este egală cu 21. Dacă una dintre mâinile lor este egală cu 21, jocul se termină. Noi sunam doGameOver (true)
care va acorda câștiguri și va începe un nou joc. Adevărat
parametrul este valabil pentru blackjack. În caz contrar, va fi falsă.
doGameOver ()
Funcția acordă câștigurile și începe un nou joc. De asemenea, vom codifica această funcție în mai mulți pași. Pentru moment, o putem folosi pentru a testa partea de blackjack. Introduceți codul de mai jos afacere
funcţie.
funcția doGameOver (hasBlackJack) player localHandValue = getHandValue (playerHand); distribuitorul localHandValue = getHandValue (dealerHand); tempCardX local = toateCartile [2] .x; tempCardY locală = toate cardurile [2] .y; allCards [2]: removeSelf (); tempCard local = display.newImage (primaDealerCard ... ".png", tempCardX-45, tempCardY-60); dealerGroup: inserare (tempCard); tempCard: Toback (); dacă (hasBlackJack) atunci dacă (playerHandValue> dealerHandValue) atunci bani = bani + pariu * 1,5; instructionsText.text = "Ai primit BlackJack!"; câștigător = "jucător" altceva bani = bani - pariu; instructionsText.text = "Dealer a primit BlackJack!"; câștigător = "dealer" sfârșit sfârșit sfârșit
Aici vom obține valoarea jucătorului și cea a dealerului. Avem o referință allCards [2]
, X
, și y
, care este prima carte a dealerului, apoi îl scoatem de pe ecran. Apoi, generăm a tempCard
folosind firstDealerCard
pe care am setat-o mai devreme. Încă o dată, scădem 45 și 60. Apoi inserăm această nouă carte în dealerGroup
. Când facem asta, este pe partea de sus a celui de-al doilea card, așa că îl trimitem înapoi prin apel în spate()
.
Verificăm să vedem dacă hasBlackJack
este adevărat, iar dacă este, atunci verificăm dacă mâna jucătorului este mai mare decât cea a dealerului. Dacă este, vom acorda niște bani, setați instructionsText
în consecință, și schimbare câştigător
la "jucător".
Trebuie să ne amintim că trebuie inițializată bani
înainte de a face ceva cu ea. Adăugați următoarele în cadrul Înființat()
funcţie.
funcția Setup () createDataFile (); bani = readMoney (); setupCoins (); ... end
Suntem la punctul în care putem testa dacă jucătorul sau distribuitorul are blackjack. Vom schimba temporar un cod pentru a testa, dar îl vom schimba. În primul rând, în afacere
funcție, modificați următoarele.
elseif (#dealerHand == 2 și #playerHand == 2) atunci dacă (adevărat) apoi doGameOver (true);
Apoi, în interiorul doGameOver ()
funcția schimba primele două linii ca atare.
jucătorul localHandValue = 21 - getHandValue (playerHand); distribuitorul localHandValue = 18 -; getHandValue (dealerHand);
Acum mergeți și testați aplicația. Ar trebui să vedeți că jucătorul primește blackjack.
Acum schimbați primele două linii în interiorul doGameOver
la următoarele
jucătorul localHandValue = 18 - getHandValue (playerHand); distribuitorul localHandValue = 21 -; getHandValue (dealerHand);
Acum, dacă încercați, ar trebui să vedeți că dealer-ul a obținut blackjack.
Acum că am testat, ar trebui să ne întoarcem variabilele. În interiorul afacere
modificați funcția următoare.
elseif (#dealerHand == 2 și #playerHand == 2) atunci dacă (getHandValue (playerHand) == 21 sau getHandValue (dealerHand) == 21) apoi doGameOver (true);
Apoi, în interiorul doGameOver ()
funcția, modificați primele două linii înapoi la starea lor anterioară.
jucătorul localHandValue = getHandValue (playerHand); distribuitorul localHandValue = getHandValue (dealerHand);
Dacă încercați încă o dată și nici dvs., nici dealer-ul nu obțineți blackjack, butonul de tranzacționare ar trebui să devină invizibil, iar butoanele pentru hit și stand ar trebui să devină vizibile.
Trebuie să permitem jucătorului să lovească sau să stea odată ce primele două cărți au fost împărțite. Introduceți următoarele în cadrul lovit()
funcție pe care ați introdus-o în partea anterioară a acestei serii.
funcția hit (eveniment) dacă ("a început" == event.phase) apoi dealTo = "player"; afacere(); sfârșitul final
Dacă încercați acum, ar trebui să puteți lovi.
După unele teste de control al calității, este posibil să fi observat că jucătorul poate apăsa rapid lovit butonul din nou și din nou, ocupând multe cărți simultan. Acesta nu este modul în care jocul ar trebui să funcționeze. Pentru a remedia acest lucru, trebuie să adăugăm o condiție pentru a vă asigura că pot atinge doar la momentul potrivit. Adăugați următoarele în partea de jos a declarațiilor dvs. de variabile.
local canBet = adevărat;
Acum, schimbați lovit()
funcționează la următoarele.
funcția hit (eveniment) dacă ("a început" == event.phase) atunci dacă (canBet) apoi dealTo = "player"; afacere(); canBet = false; sfârșitul capătului final
În cadrul afacere()
adăugați următoarea linie de cod.
transition.to (tempCard, timp = 1000, x = xPos, y = carePoziție, onComplete = funcție () canBet = true;
Acum, jucătorul poate lovi doar o singură dată, cartea terminându-se împărțită.
În continuare trebuie să lăsăm jucătorul să stea. Adăugați următoarele în cadrul stand()
funcție pe care ați introdus-o în partea anterioară a acestei serii.
funcția stand () playerYields = adevărat; standBtn.isVisible = false; hitBtn.isVisible = false; if (getHandValue (dealerHand) < 17)then dealTo = "dealer" deal(); else doGameOver(false); end end
Aici indicăm faptul că jucătorul este "exploatație". Seteaza standBtn
și hitBtn
la invizibil. Verificăm dacă mâna dealerului este mai mică decât 17, și dacă ne schimbăm dealTo
la dealer și să se ocupe. Dacă mâna lui nu este mai mică decât 17, atunci sunăm doGameOver ()
. Dealerul trebuie să stea în picioare 17 sau mai mare.
Dacă încercați acum, jucătorul poate obține mâna pe care o doresc și apoi apăsați stand. Există totuși câteva probleme. În cazul în care player-ul busts, el poate continua să deseneze cărți și pauzele de tranzacționare la dealer. Avem nevoie de dealer pentru a continua să deseneze cărți până se termină 17 sau peste, sau până când el busts. Vom rezolva aceste probleme când vom termina afacere()
funcția în următorii doi pași.
Adăugați următoarele în cadrul afacere()
funcţie.
dacă (getHandValue (playerHand) == 21 sau getHandValue (dealerHand) == 21) apoi doGameOver (true); altceva standBtn.isVisible = adevărat; hitBtn.isVisible = adevărat; sfârșitul final dacă (#dealerHand> = 3 și (getHandValue (dealerHand) < 17))then deal(); elseif( playerYields and getHandValue(dealerHand)>= 17) apoi standBtn.isVisible = false; hitBtn.isVisible = false; doGameOver (false); Sfârșit
Aici verificăm dacă dealerHand
lungimea lui este mai mare sau egală cu 3 și că mâna dealerului este mai mică decât 17. Dacă mâna lui este mai mică decât 17 el trebuie să tragă o carte. În caz contrar, verificăm dacă jucătorul a câștigat și dacă mâna dealerului este mai mare sau egală cu 17. Dacă da, jocul sa terminat. Este posibil ca dealer-ul să aibă 17 sau mai mare cu primele două cărți.
Introduceți codul următor în afacere()
funcţie.
dacă (#dealerHand> = 3 și (getHandValue (dealerHand) < 17))then deal(); elseif( playerYields and getHandValue(dealerHand)>= 17) apoi standBtn.isVisible = false; hitBtn.isVisible = false; doGameOver (false); sfârșitul dacă (getHandValue (playerHand)> 21) apoi standBtn.isVisible = false; hitBtn.isVisible = false; doGameOver (false); Sfârșit
Dacă jucătorul lovește și trage o carte care îl pune pe el 21, jocul s-a terminat.
În acest pas vom continua să codificăm joc încheiat()
funcţie. Deocamdată, funcția de afacere determină numai cine câștigă atunci când jucătorul sau distribuitorul are blackjack. Trebuie să rezolvăm toate celelalte posibile rezultate. Introduceți următoarele în cadrul doGameOver ()
funcţie.
altfel bani = bani - pariu; instructionsText.text = "Dealer a primit BlackJack!"; câștigătorul = "dealer" se termină altfel dacă (playerHandValue> 21), apoi instrucțiunileText.text = "Ai fost dezactivat!"; bani = bani - pariuri; câștigător = "dealer"; elseif (dealerHandValue> 21) apoi bani = bani + pariu; instructionsText.text = "Bust-uri dealeri, câștigi!"; câștigător = "jucător"; elseif (dealerHandValue> playerHandValue) apoi bani = bani - pariu; instructionsText.text = "Pierdeți!"; câștigător = "dealer" elseif (dealerHandValue == playerHandValue) apoi bani = bani - pariu; instructionsText.text = "Tie - Dealerul câștigă!"; câștigător = "cravată" altfel (dealerHandValue < playerHandValue)then money = money +bet; instructionsText.text="You Win!"; winner = "player" end end
Dacă încercați codul acum, ar trebui să puteți juca un joc complet. Textul de instrucțiuni va arăta rezultatul. Redați câteva runde și asigurați-vă că totul pare corect. Dacă chiar vrei să testezi jocul prin introducerea unor valori diferite ale mâinii, poți folosi aceeași tehnică pe care am folosit-o mai devreme în acest tutorial pentru a testa pentru blackjack.
Introduceți următoarele în partea de jos a paginii doGameOver ()
funcţie
altfel (dealerHandValue < playerHandValue)then money = money +bet; instructionsText.text="You Win!"; winner = "player" end end if(money < 10)then money = 500 end saveMoney(money)
După fiecare rundă, ar trebui să salvăm banii jucătorului. Dacă banii lor sunt mai mici decât 10 vom considera că ne-au falimentat și ne-am resetat banii 500. Ca exercițiu, vezi dacă poți să-ți aduci o alertă care să apară spunând ceva de genul "Ați dat faliment, comerciantul vă acordă 500 de dolari."
După fiecare rundă, mutăm monedele la câștigător și apoi începem un nou joc. Introduceți următoarele sub codul introdus în pasul de mai sus.
saveMoney (bani) local tweenTo; dacă (câștigător == "jucător") atunci tweenTo = cardCardsY; altfel tweenTo = dealerCardsY end transition.to (coinContainer, timp = 1000, y = tweenTo, onComplete = function () pentru i = coinContainer.numChildren, 1, -1 local child = monetContainer [i] child: removeSelf = nil; end timer.performWithDelay (2000, newGame); coinContainer.y = 600; end);
Aici vedem cine a câștigat runda și apoi îi animăm monedele. Când animația se termină, eliminăm toate monedele din coinContainer
, și le-a pus la zero, de vreme ce am terminat cu ei. În cele din urmă, sunăm joc nou()
după două secunde, ne reinițializăm și noi coinContainer
poziţie.
Introduceți următoarele sub doGameOver ()
funcţie.
funcția newGame () instructionsText.text = "PLACE BET"; betText.text = ""; money10.isVisible = true; money25.isVisible = adevărat; money50.isVisible = true; BankText.text = "Banca dvs.: $" ... readMoney () pentru i = dealerGroup.numChildren, 1, -1 local child = dealerGroup [i] child: removeSelf () child = nil; end pentru i = playerGroup.numChildren, 1, -1 face local copil = playerGroup [i] child: removeSelf () child = nil; end dealTo = "jucător"; playerHand = ; dealerHand = ; allCards = ; createDeck () ;; playerYields = false; câștigător = ""; pariu = 0; canBet = adevărat; Sfârșit
Aici setăm banii vizibili, eliminăm cardurile din grupul de jucători și de la dealer și ne reinițializăm toate variabilele.
Am codificat un joc distractiv și interesant de blackjack folosind kitul Corona SDK. Vă mulțumim pentru lectură, sper că ați găsit acest tutorial util!