Lag et Blackjack-spill i Swift 3 og SpriteKit

Hva du skal skape

I denne opplæringen lager du et blackjack-spill i SpriteKit ved hjelp av Swift 3. Du lærer om å implementere berøring, skape visuelle animasjoner og mange andre begreper som kommer til nytte når du bygger et SpriteKit-spill.

1. Opprette prosjektet og importere ressurser

Åpne Xcode og velg Opprett et nytt Xcode-prosjekt eller velg Nytt> Prosjekt ...  fra Fil Meny. Forsikre iOS er valgt og velg Spill mal.

Deretter velger du hva du ønsker for Produktnavn, Organisasjonsnavn, og Organisasjonsidentifikator. Sørge for at Språk er satt til Fort, Spillteknologi er satt til SpriteKit, og enheter er satt til iPad.

Angi et sted for å lagre prosjektfilene og klikk Skape.

Importerer hjelpeklassene

Last ned GitHub repo for dette prosjektet. Inne i det ser du en klasser mappe. Åpne denne mappen og dra alle filene til mappen som har navnet til det du for eksempel oppgav prosjektet ditt, blackjack. Forsikre Kopier elementer om nødvendig er sjekket så vel som hovedmålet i listen over mål.

Importerer bildene

Også i opplæringen er GitHub repo en mappe som heter opplæringsbilder. Inne i prosjektnavigatoren, åpne Assets.xcassets og dra alle bildene i sidefeltet. Xcode lager automatisk teksturatlaser fra disse bildene.

2. Sette opp prosjektet

I prosjektnavigatoren er det to filer du kan slette (Gamescene.sks og Actions.sks).Slett disse to filene og velg Flytt til søppel. Disse filene brukes av Xcodes innebygde sceneditor, som kan brukes til å visuelt legge ut prosjektene dine. Vi vil skape alt via kode, men så er disse filene ikke nødvendig.

Åpen GameViewController.swift, Slett innholdet, og erstatt det med følgende.

importere UIKit import SpriteKit klasse GameViewController: UIViewController override func viewDidLoad () super.viewDidLoad () la scene = GameScene (størrelse: CGSize (bredde: 768, høyde: 1024)) la skView = self.view as! SKView skView.showsFPS = false skView.showsNodeCount = falskt skView.ignoresSiblingOrder = false scene.scaleMode = .aspektFill skView.presentScene (scene) overstyr var prefersStatusBarHidden: Bool return true 

De GameViewController Klassen arver fra UIViewController og vil ha en SKView som sin utsikt. Inne i viewDidLoad metode, vi nedkastet utsikt eiendom til en SKView eksempel ved bruk av som! skriv cast operatør, og konfigurer visningen.

Hvis du skulle kjøre dette prosjektet når du opprettet det friskt, kan det hende du merker tekst nederst til høyre på skjermen. Det er det som showsFPS og showsNodeCount egenskaper er for, viser rammer per sekund spillet kjører på og antall SKNodes synlig i scenen. Vi trenger ikke denne informasjonen, så vi setter dem til falsk.

De ignoreSiblingOrder Egenskapen brukes til å bestemme tegningsordren til SKNodes i spillet. Vi satte dette til falsk her fordi vi trenger vår SKNodes å tegne i den rekkefølgen de legges til scenen.

Til slutt setter vi skalaen til .aspectFill, som vil føre til at sceneinnholdet skaleres for å fylle hele skjermen. Vi anvender deretter presentScene (_ :) metode på skView som presenterer eller "viser" scenen.

Deretter slett alt i GameScene.swift og erstatt det med følgende.

importere SpriteKit import GameplayKit klasse GameScene: SKScene override func didMove (for å se: SKView)  overstyr func touchesBegan (_ berører: Set, med hendelsen: UIEvent?) 

Du kan nå teste prosjektet, og du bør bli presentert med en blank svart skjerm. I neste trinn vil vi begynne å legge til innhold på vår scene.

3. Variabler og Konstanter

Skriv inn følgende kode ved starten av GameScene klasse rett under hvor GameScene arver fra SKScene.

Klasse GameScene: SKScene let moneyContainer = SKSpriteNode (farge: .clear, size: CGSize (bredde: 250, høyde: 150)) la dealBtn = SKSpriteNode (imageNamed: "deal_btn") la hitBtn = SKSpriteNode (imageNamed: "hit_btn") la standBtn = SKSpriteNode (imageNamed: "stand_btn") la money10 = Money (moneyValue: .ten) la money25 = Money (moneyValue: .twentyFive) la money50 = Money (moneyValue: .fifty) la instructionText = SKLabelNode din innsats ") 

Vi lager en rekke SKSpriteNodes her. SKSpriteNodes brukes til å lage en farget node, eller mer vanlig fra en SKTexture, som ofte er et bilde. Vi bruker bekvemmelighetsinitiatoren init (farge: størrelse :) å lage en klar fargetode moneyContainer. De moneyContainer vil bli brukt til å holde pengene spilleren satser, og på slutten av hver runde vil vi animere denne bevegelsen mot den som vant spillet. Plassering av alle pengene i denne enkelt node gjør det enkelt å animere alle pengene på en gang.

Deretter lager vi konstantene dealBtn, hitBtn, og standBtn. Som navnene antyder, vil disse bli brukt i spill for å håndtere, treffe og stå henholdsvis. Vi bruker brukervennligheten init (imageNamed :), som tar som en parameter navnet på bildet uten en forlengelse.

Vi lager da de tre konstantene money10, money25, og money50, som er av typen Penger. Penger er en tilpasset klasse som strekker seg SKSpriteNode og avhengig av typen moneyValue bestått som en parameter skaper en av tre forskjellige pengetyper. De moneyValue parameteren er av typen MoneyValue, som er en enum. Ta en titt på Penger klasse i prosjektet GitHub repo for å se hvordan alt dette fungerer.

Til slutt oppretter vi en SKLabelNode ved hjelp av bekvemmelighetsinitiatoren  init (tekst :) som tar som en parameter teksten som skal vises på etiketten.

4. Gjennomføring setupTable

Legg til følgende under didMove (i :) funksjon.

func setupTable () la tabellen = SKSpriteNode (imageNamed: "table") addChild (tabell) table.position = CGPoint (x: size.width / 2, y: size.height / 2) table.zPosition = -1 addChild moneyContainer) moneyContainer.anchorPoint = CGPoint (x: 0, y: 0) moneyContainer.position = CGPoint (x: size.width / 2 - 125, y: size.height / 2) instructionText.fontColor = UIColor.black addChild ) instructionText.position = CGPoint (x: size.width / 2, y: 400) 

Her initialiserer vi en konstant bord og legg det til scenen ved hjelp av addChild (_ :) som tar som en parameter noden for å legge til scenen. Vi satte bord's stilling innenfor scenen og sette sin zPosition til -1. De zPosition Egenskapen styrer rekkefølgen der knutepunktene trekkes. Det laveste tallet tegnes først, med høyere tall tegnes i rekkefølge. Fordi vi trenger bord Under alt annet, satte vi det zPosition til -1. Dette sikrer at det trekkes før noen andre noder.

Vi legger også til moneyContainer og instructionText til scenen. Vi satte skriftfarge av instructionText til svart (standard er hvit).

Oppdater didMove (i :) til følgende.

overstyr func didMove (for å vise: SKView) setupTable () 

De didMove (i :) Metoden kalles umiddelbart etter at scenen er presentert av visningen. Vanligvis er dette stedet du vil gjøre oppsettet for din scene og opprette dine eiendeler. Hvis du tester nå, bør du se det bord og instructionText har blitt lagt til scenen. De moneyContainer er det også, men du kan ikke se det fordi vi opprettet det med en klar farge.

5. Gjennomføring setupMoney

Legg til følgende under setupTable metode.

func setupMoney () addChild (money10) money10.position = CGPoint (x: 75, y: 40) addChild (money25) money25.position = CGPoint (x: 130, y: 40) addChild (money50) money50.position = CGPoint (x: 185, y: 40) 

Her legger vi ganske enkelt penger til og legger sin posisjon. Invoke denne metoden innenfor didMove (i :).

overstyr func didMove (for å vise: SKView) setupTable () setupMoney () 

6. Gjennomføring setupButtons

Legg til følgende under setupMoney Metode du opprettet i trinnet ovenfor.

funk setupButtons () dealBtn.name = "dealBtn" addChild (dealBtn) dealBtn.position = CGPoint (x: 300, y: 40) hitBtn.name = "hitBtn" addChild (hitBtn) hitBtn.position = CGPoint (x: 450 , y: 40) hitBtn.isHidden = true standBtn.name = "standBtn" addChild (standBtn) standBtn.position = CGPoint (x: 600, y: 40) standBtn.isHidden = true 

Som vi gjorde med penger i det forrige trinnet, legger vi til knappene og setter deres posisjoner. Her bruker vi Navn eiendom slik at vi vil kunne identifisere hver knapp gjennom kode. Vi satte også hitBtn og standBtn å være skjult, eller usynlig, ved å sette inn IsHidden eiendom til ekte.

Påkall nå denne metoden innen didMove (i :).

overstyr func didMove (for å vise: SKView) setupTable () setupMoney () setupButtons ()

Hvis du kjører appen nå, bør du se at penger og knapper er lagt til scenen.

7. Gjennomførings touchesBegan

Vi må implementere touchesBegan (_: med :) Metode for å kunne fortelle når noen objekter i scenen er blitt rørt. Denne metoden kalles når en eller flere fingre har rørt ned på skjermen. Legg til følgende i touchesBegan.

overstyr func touchesBegan (_ berører: Set, med hendelsen: UIEvent?) vakt låt berøre = berører.for det første return la touchLocation = touch.location (i: selv) la touchedNode = self.atPoint (touchLocation) hvis (touchedNode.name == "money")  la penger = berørtNode som! Pengerinnsats (betAmount: money.getValue ()) 

De multiTouchEnabled Egenskapen til scenens visning er satt til falsk som standard, som betyr at visningen bare mottar det første trykket på en multitouch-sekvens. Med denne egenskapen deaktivert, kan du hente kontakten ved å bruke først Beregnet egenskap for berøringene sett siden det bare er ett objekt i settet.

Vi kan få touchLocation innenfor scenen av plassering egenskapen til berøring. Vi kan da finne ut hvilken knute som var berørt ved å påkalle atPoint (_ :) og passerer i touchLocation.

Vi sjekker om touchedNodeNavn på eiendom er lik "penger", og hvis det er vi vet at de har rørt på en av de tre pengene-instansene. Vi initialiserer en penger konstant ved å downcasting touchedNode til Penger, og så kaller vi vedde metode som påkaller getValue () metode på penger konstant.

8. Gjennomføring vedde

Skriv inn følgende under setupButtons Funksjonen du opprettet i trinnet ovenfor.

func bet (betAmount: MoneyValue) hvis (betAmount.rawValue> player1.bank.getBalance ()) print ("Prøver å satse mer enn har"); return else pot.addMoney (mengde: betAmount.rawValue) la tempMoney = Money (moneyValue: betAmount) tempMoney.anchorPoint = CGPoint (x: 0, y: 0) moneyContainer.addChild (tempMoney) tempMoney.position = CGPoint : CGFloat (arc4random_uniform (UInt32 (moneyContainer.size.width - tempMoney.size.width))): yGFloat (arc4random_uniform (UInt32 (moneyContainer.size.height - tempMoney.size.height))) dealBtn.isHidden = false ; 

Vi sørger først for at spilleren ikke prøver å satse mer penger enn de har, og hvis de er, returnerer vi bare fra funksjonen. Ellers legger vi til betAmount til gryte, skape en konstant tempMoney, sett sin forankringspunkt til (0,0), og legg det til moneyContainer. Vi setter da sin stilling og skjul dealBtn ved å sette sin IsHidden eiendom til falsk.

SKSpriteNodes har en forankringspunkt Egenskapen som standard (0.5,0.5). Koordinatsystemet plasserer (0,0) nederst til venstre og (1,1) øverst til høyre. Du ville endre denne egenskapen fra standard hvis du roterte SKSpriteNode og ønsket at den skulle rotere rundt et annet punkt. For eksempel, hvis du endret forankringspunkt eiendom til (0,0) og så SKSpriteNode ville rotere fra nederste venstre hjørne. Du vil ofte endre denne egenskapen for å hjelpe med posisjonering, slik vi har her.

Vi må opprette en forekomst av Gryte og Spiller klasser for denne koden til å fungere. Legg til følgende sammen med de andre konstantene og variablene.

la potten = Pot () la player1 = Spiller (hånd: Hånd (), Bank: Bank ())

Hvis du tester nå, kan du trykke på noe av pengene og legge det til moneyContainer.

9. Gjennomførings avtale

Legg til følgende sammen med resten av dine konstanter og variabler.

la forhandler = forhandler (hånd: hånd ()) var allCards = [kort] () la dealerCardsY = 930 // Y plassering av dealer kort la playerCardsY = 200 // Y plassering av spillerkort var currentPlayerType: GenericPlayer = Spiller Hånd (), bank: Bank ()) la dekk = Dekke () 

De allCards array vil bli brukt til å holde alle kortene i spillet. Dette gjør det enkelt å løse gjennom dem og fjerne dem fra scenen alt på en gang. De dealerCardsY og playerCardsY konstanter er posisjonene til kortene på y-aksen. Dette vil hjelpe oss når du plasserer nye kort. De currentPlayerType brukes til å angi hvem som skal håndtere neste. Det vil enten være lik forhandler eller PLAYER1

Innsiden didMove (i :), legg til følgende.

overstyr func didMove (for å vise: SKView) setupTable () setupMoney () setupButtons () currentPlayerType = player1 

I den forrige koden ble vi initialisert currentPlayerType til en navngitt forekomst av Spiller klasse. Her satte vi det på PLAYER1

Vi må skape et nytt kortkort før vi gjennomfører avtalemetoden. Skriv inn følgende innen setupTable.

func setupTable () la tabellen = SKSpriteNode (imageNamed: "table") addChild (tabell) table.position = CGPoint (x: size.width / 2, y: size.height / 2) table.zPosition = -1 addChild moneyContainer) moneyContainer.anchorPoint = CGPoint (x: 0, y: 0) moneyContainer.position = CGPoint (x: size.width / 2 - 125, y: size.height / 2) instructionText.fontColor = UIColor.black addChild ) instructionText.position = CGPoint (x: size.width / 2, y: 400) deck.new ()

Nå kan vi implementere avtalefunksjonen. Legg til følgende under vedde metode.

func deal () instructionText.text = "" money10.isHidden = true; money25.isHidden = true; money50.isHidden = true; dealBtn.isHidden = true; standBtn.isHidden = false hitBtn.isHidden = false let tempCard = Kort (dress: "card_front", verdi: 0) tempCard.position = CGPoint (x: 630, y: 980) addChild (tempCard) tempCard.zPosition = 100 la newCard = deck.getTopCard () var whichPosition = playerCardsY var whichHand = player1.hand if (self.currentPlayerType er spiller) whichHand = player1.hand whichPosition = playerCardsY;  else whichHand = dealer.hand whichPosition = dealerCardsY;  whichHand.addCard (kort: newCard) la xPos = 50 + (whichHand.getLength () * 35) la moveCard = SKAction.move (til: CGPoint (x: xPos, y: whichPosition), varighet: 1,0) tempCard.run (moveCard, fullføring: [unowned self] i self.player1.setCanBet (canBet: true) hvis (self.currentPlayerType er Dealer && self.dealer.hand.getLength () == 1) self.dealer.setFirstCard : newCard) self.allCards.append (tempCard) tempCard.zPosition = 0 annet tempCard.removeFromParent () self.allCards.append (newCard) self.addChild (newCard) newCard.position = CGPoint (x: xPos, y: whichPosition) newCard.zPosition = 100 hvis (self.dealer.hand.getLength () < 2) if(self.currentPlayerType is Player) self.currentPlayerType = self.dealer else self.currentPlayerType = self.player1  self.deal() else if (self.dealer.hand.getLength() == 2 && self.player1.hand.getLength() == 2)  if(self.player1.hand.getValue() == 21 || self.dealer.hand.getValue() == 21) self.doGameOver(hasBlackJack: true)  else  self.standBtn.isHidden = false; self.hitBtn.isHidden = false;   if(self.dealer.hand.getLength() >= 3 && self.dealer.hand.getValue () < 17) self.deal();  else if(self.player1.isYeilding() && self.dealer.hand.getValue() >= Selv) self.hitBtn.isHidden = true; self.doGameOver (hasBlackJack: false); ) 

Denne metoden er ganske stor, men nødvendig for å implementere handlingslogikken. La oss ta det trinnvis. Vi initialiserer en tempCard konstant til en forekomst av Kort, sett sin posisjon, og legg den til scenen. Vi trenger dette kortet tegnet på en zPosition større enn 0, fordi forhandlerens første kort må være på 0. Vi setter dette til et vilkårlig nummer-100 Vil gjøre. Vi lager også en newCard konstant ved å påkalle Dekk's getTopCard () metode.

Deretter initialiserer vi to variabler, whichPosition og whichHand, og kjør gjennom en logikk for å bestemme sluttverdiene. Vi legger da til newCard til riktig hånd (enten spillerens eller forhandlerens). De XPOS Konstant bestemmer den endelige x-posisjonen til kortet når den er ferdig animert.

De SKAction klassen har en rekke klassemetoder du kan ringe for å endre en nodes egenskaper som posisjon, skala og rotasjon. Her kaller vi bevege seg (i: :) varighet metode som vil flytte knuten fra en posisjon til en annen. Men for å faktisk utføre SKAction, du må påkalle løpe(_:) metode for en node og passere i SKAction som en parameter. Her påpeker vi imidlertid kjøre (_: ferdigstillelse :) metode, som vil føre til at koden innen ferdigstillelse lukkes etter at handlingen fullfører gjennomføringen.

Etter at handlingen har gått til slutt, lar vi spilleren satse ved å påkalle setCanBet (canBet :)PLAYER1 forekomst. Vi sjekker da om currentPlayerType er en forekomst av forhandler, og kontroller at forhandler Bare har ett kort ved å påkalle hand.getLength (). Hvis dette er tilfelle, setter vi inn forhandlerFørste kort, som vi trenger på slutten av spillet. 

Fordi det forhandlerFørste kort er alltid med forsiden ned til slutten av spillet, vi trenger en referanse til det første kortet, så vi kan vise det senere. Vi legger til dette kortet til allCards array slik at vi kan fjerne det senere, og deretter sette det zPosition eiendom til 0 som vi trenger dette kortet under alle de andre kortene. (Husk at de andre kortene har z-posisjon 100.)

Hvis currentPlayerType er ikke en forekomst av  forhandler, og håndens lengde er ikke lik 1, da fjerner vi tempCard og sett newCard i samme posisjon, sørg for å angi dens zPosition til 100.

I henhold til blackjacks regler får både dealer og spiller to kort for å starte spillet med. Her sjekker vi hva currentPlayerType er og skifter det til motsatt. Fordi forhandleren har mindre enn to kort, påberoper vi oss avtale funksjonen igjen. Ellers sjekker vi om begge deler forhandler og PLAYER1 har to kort, og hvis dette er tilfelle, sjekker vi for å se om de har kort med en totalverdi på 21-en vinnende hånd. Hvis enten har 21 da er spillet over, fordi en av dem har fått blackjack. Hvis ingen har 21 så viser vi standBtn og hitBtn og spillet fortsetter.

Reglene for blackjack sier at forhandler må stå på 17 eller større. De neste kodelinjene kontrollerer om forhandlerHandens verdi er mindre enn 17 og hvis så påkaller avtale metode. Hvis det er 17 eller større enn spillet er over. Til slutt, hvis PLAYER1Handens verdi er større enn 21 så er spillet over fordi de har busted.

Dette var mye logikk for å gå gjennom! Hvis noe er uklart, bare les det igjen og ta deg tid til å forstå det. 

Deretter må vi implementere spillet er slutt metode.

Vi må kunne fortelle når brukeren har trykket på avtaleknappen. Legg til følgende kode i touchesBegan (_: med :) metode.

overstyr func touchesBegan (_ berører: Set, med hendelsen: UIEvent?) vakt låt berøre = berører.for det første return la touchLocation = touch.location (i: selv) la touchedNode = self.atPoint (touchLocation) hvis (touchedNode.name == "money")  la penger = berørtNode som! Money bet (betAmount: money.getValue ()) hvis (touchedNode.name == "dealBtn") deal () 

10. Gjennomføring doGameOver

Deretter skriver du inn følgende under avtale Metode du opprettet i trinnet ovenfor.

func doGameOver (hasBlackJack: Bool) hitBtn.isHidden = true standBtn.isHidden = true la tempCardX = allCards [1] .position.x la tempCardY = allCards [1] .position.y la tempCard = dealer.getFirstCard () addChild tempCard) allCards.append (tempCard) tempCard.position = CGPoint (x: tempCardX, y: tempCardY) tempCard.zPosition = 0 var vinner: GenericPlayer = player1 if (hasBlackJack) if (player1.hand.getValue ()> dealer. hand.getValue ()) // Legg til spillere Bank her (pott verdi * 1.5) instructionText.text = "Du har BlackJack!"; moveMoneyContainer (posisjon: playerCardsY) else // Trekk fra spillere bank her instructionText.text = "Forhandleren fikk BlackJack!"; moveMoneyContainer (posisjon: dealerCardsY) return hvis (player1.hand.getValue ()> 21) instructionText.text = "You Busted!" // Trekk fra spillere bankvinner = forhandler annet hvis (dealer.hand.getValue ()> 21) // Legg til spillere bank instructionText.text = "Dealer Busts. You Win!" vinner = player1 else if (dealer.hand.getValue ()> player1.hand.getValue ()) // Trekke fra spillere bank instructionText.text = "You Lose!" vinner = forhandler annet hvis (dealer.hand.getValue () == player1.hand.getValue ()) // Trekke fra spillere bank instructionText.text = "Tie - Dealer Wins!" vinner = forhandler annet hvis (dealer.hand.getValue () < player1.hand.getValue()) //Add to players bank instructionText.text="You Win!"; winner = player1  if(winner is Player) moveMoneyContainer(position: playerCardsY) else moveMoneyContainer(position: dealerCardsY)  

Vi får x og y posisjonen til det første kortet i allCards array, som er dealerens første kort. Da instanser vi en konstant tempCard ved å påkalle getFirstCard på forhandleren. Husk at vi angir dette Kort tidligere i avtalemetoden? Her legger vi den til scenen, setter sin posisjon ved hjelp av tempCardX og tempCardY konstanter, og sett dens zPosition til 0så det er under de andre kortene.

Vi trenger å vite hvem som vant spillet, så vi initialiserer en variabel vinner sette den lik til PLAYER1, selv om dette kan endres avhengig av om forhandler faktisk vunnet spillet.

Vi kjører gjennom en logikk for å avgjøre hvem som vant spillet. Hvis hasBlackjack parameteren var sann da vi regner ut hvem som vant og returnerte fra funksjonen. Ellers fortsetter vi gjennom logikken for å finne ut hvem som vant spillet. Jeg skal ikke gå trinnvis gjennom denne logikken, da det burde være klart å forstå. Uansett hvem vant, anvender vi moveMoneyContainer (posisjon :), som tar som en parameter posisjonen til å flytte pengerbeholderen til. Dette vil være y-posisjonen til enten forhandlers eller PLAYER1s kort.

11. Gjennomføring moveMoneyContainer

Skriv inn følgende kode under doGameOver metode.

 func moveMoneyContainer (posisjon: Int) la moveMoneyContainer = SKAction.moveTo (y: CGFloat (posisjon), varighet: 3.0) moneyContainer.run (moveMoneyContainer, fullføring: [unowned self] i self.resetMoneyContainer ()); 

De moveMoneyContainer (posisjon :) Metoden beveger moneyContainer til den som vant spillet, enten spilleren eller forhandleren. Når SKAction fullfører, påberoper vi oss resetMoneyContainer.

12. Gjennomførings resetMoneyContainer

De resetMoneyContainer Metoden fjerner alle pengene ved å påkalle removeAllChildren () metode, tilbakestiller moneyContainer til sin opprinnelige posisjon, og påberoper newGame.

func resetMoneyContainer () moneyContainer.removeAllChildren () moneyContainer.position.y = size.height / 2 newGame ()

13. Gjennomføring newGame

Legg til følgende under resetMoneyContainer Metode du implementerte i trinnet ovenfor.

func newGame () currentPlayerType = player1 deck.new () instructionText.text = "PLACE DIN BET"; money10.isHidden = false; money25.isHidden = false; money50.isHidden = false; dealBtn.isHidden = false player1.hand.reset () dealer.hand.reset () player1.setYielding (yield: false) for kort i alleKort card.removeFromParent () allCards.removeAll ()

Her tilbakestilles alle nødvendige variabler og fjerner alle kortene fra scenen ved å løpe gjennom allCards array og påkalle removeFromParent () på hvert element.

14. Gjennomføring av hitBtn og standBtn

Alt som er igjen for å fullføre vårt spill er å implementere berøringene på hitBtn og standBtn. Skriv inn følgende i feltet touchesBegan (_: med :) metode.

overstyr func touchesBegan (_ berører: Set, med hendelsen: UIEvent?) vakt låt berøre = berører.for det første return la touchLocation = touch.location (i: selv) la touchedNode = self.atPoint (touchLocation) hvis (touchedNode.name == "money")  la penger = berørtNode som! Betalingsmåte (betAmount: money.getValue ()) hvis (touchedNode.name == "dealBtn") deal () hvis (touchedNode.name == "hitBtn") hit () hvis (touchedNode.name = = "standBtn") stand () 

Og nå skal vi implementere metodene som kalles i hendelseshandleren. Skriv inn følgende to metoder under newGame metode.

 func hit () player1.getCanBet ()) currentPlayerType = player1 deal () player1.setCanBet (canBet: false) func stand () player1.setYielding (yields: true) standBtn.isHidden = true hitBtn. isHidden = true if (dealer.hand.getValue () < 17) currentPlayerType = dealer deal(); else doGameOver(hasBlackJack: false)   

Innen truffet metode, sørger vi for at spilleren kan satse, og hvis det er tilfelle, setter vi inn currentPlayerType til PLAYER1, og deretter påkalle avtale metode og stopp spilleren ved å satse videre.

Innenfor standemetoden påberoper vi oss setYieldingPLAYER1, passerer inn ekte. Vi sjekker da om forhandlerHandens verdi er mindre enn 17, og hvis det er tilfellet, kaller vi avtale, og hvis forhandlerhånden er 17 eller større betyr det at spillet er over.

Du kan nå teste det fullførte spillet.

Konklusjon

Dette var en lang opplæring med en god logikk tucked away i avtale metoden. Vi implementerte ikke ved hjelp av Gryte og legge til og trekke penger fra spillerens bank. Hvorfor ikke prøve å gjøre det som en øvelse for å fullføre appen?

Du har nå et blackjack-spill å være stolt av. Takk for at du leser, og jeg håper du fant denne opplæringen nyttig. Mens du er her, sjekk ut noen av våre andre kurs og opplæringsprogrammer om appprogrammering med Swift og SpriteKit!