Créer un jeu de blackjack dans Swift 3 et SpriteKit

Ce que vous allez créer

Dans ce didacticiel, vous allez créer un jeu de blackjack dans SpriteKit à l’aide de Swift 3. Vous apprendrez à mettre en œuvre le toucher, la création d’animations visuelles et de nombreux autres concepts qui vous seront utiles lors de la création d’un jeu SpriteKit..

1. Création du projet et importation de ressources

Ouvrez Xcode et choisissez Créer un nouveau projet Xcode ou choisir Nouveau> Projet…  du Fichier menu. Assure-toi iOS est sélectionné et choisissez le Jeu modèle.

Ensuite, choisissez ce que vous souhaitez pour le Nom du produit, nom de l'organisation, et Identifiant d'organisation. Sois sûr que La langue est réglé sur Rapide, Technologie de jeu est réglé sur SpriteKit, et Dispositifs est réglé sur iPad.

Spécifiez un emplacement pour enregistrer les fichiers du projet et cliquez sur Créer.

Importer les classes auxiliaires

Téléchargez le repo GitHub pour ce projet. À l'intérieur, vous verrez un Des classes dossier. Ouvrez ce dossier et faites glisser tous les fichiers sur le dossier qui porte le nom de celui que vous avez nommé votre projet, par exemple, black jack. Assure-toi Copier les éléments si nécessaire est cochée ainsi que la cible principale dans la liste des cibles.

Importation des images

Le référentiel du tutoriel GitHub contient également un dossier nommé images de tutoriel. Dans le navigateur de projet, ouvrez Assets.xcassets et faites glisser toutes les images dans la barre latérale. Xcode créera automatiquement des atlas de texture à partir de ces images.

2. Mise en place du projet

Dans le navigateur de projet, vous pouvez supprimer deux fichiers (Gamescene.sks et Actions.sks).Supprimez ces deux fichiers et sélectionnez Mettre à la corbeille. Ces fichiers sont utilisés par l'éditeur de scène intégré à Xcode, qui peut être utilisé pour présenter visuellement vos projets. Nous allons tout créer avec du code, donc ces fichiers ne sont pas nécessaires.

Ouvrir GameViewController.swift, effacez son contenu et remplacez-le par le suivant.

import UIKit import SpriteKit class GameViewController: UIViewController remplace func viewDidLoad () super.viewDidLoad () let scene = GameScene (taille: CGSize (width: 768, height: 1024)) let skView = self.view as! SKView skView.showsFPS = false skView.showsNodeCount = false skView.ignoresSiblingOrder = false scene.scaleMode = .aspectFill skView.presentScene (scène) écrasement de la valeur var prefersStatusBarHidden: Bool return true 

le GameViewController la classe hérite de UIViewController et aura un SKView comme sa vue. À l'intérieur de viewDidLoad méthode, nous avons descendu le vue propriété à un SKView exemple, en utilisant le comme! tapez l'opérateur cast et configurez la vue.

Si vous exécutez ce projet lors de sa création, vous remarquerez peut-être un texte en bas à droite de l'écran. C'est ce que le spectaclesFPS et showsNodeCount propriétés sont pour, montrant le nombre d'images par seconde du jeu et le nombre de SKNodes visible dans la scène. Nous n’avons pas besoin de cette information, nous les avons donc configurés pour faux.

le ignoreSiblingOrder propriété est utilisée pour déterminer l'ordre de tirage du SKNodes dans le jeu. Nous réglons ceci à faux ici parce que nous avons besoin de notre SKNodes dessiner dans l'ordre dans lequel ils sont ajoutés à la scène.

Enfin, nous définissons le mode échelle sur .aspectFill, ce qui entraînera l’échelle du contenu de la scène sur tout l’écran. Nous invoquons ensuite le presentScene (_ :) méthode sur le skView qui présente ou "montre" la scène.

Ensuite, supprimez tout ce qui se trouve dans GameScene.swift et remplacez-le par le suivant.

import SpriteKit import GameplayKit class GameScene: SKScene annule la fonction didMove (pour afficher: SKView)  annule la fonction touchBegan (_ touches: Définir, avec événement: UIEvent?) 

Vous pouvez maintenant tester le projet et vous devriez avoir un écran noir. Dans la prochaine étape, nous commencerons à ajouter du contenu à notre scène..

3. Variables et constantes

Entrez le code suivant au début de la GameScene classe juste en dessous de GameScene hérite de SKScene.

class GameScene: SKScene let moneyContainer = SKSpriteNode (couleur: .clear, taille: CGSize (largeur: 250, hauteur: 150)) let dealBtn = SKSpriteNode (imageNamed: "deal_btn") let hitBtn = SKSpriteNode (imageNamed: "hit_btn") let standBtn = SKSpriteNode (imageNamed: "stand_btn") let money10 = Money (moneyValue: .ten) let money25 = Money (valueValue: .twentyFive) let money50 = Money (valueValue: .ten) let money25 = Money (valueValue: .twentyFive) let money50 = Money (valueValue: .ten) let instructionText = SKLabelNode (text: "Place votre pari ") 

Nous créons un certain nombre de SKSpriteNodes ici. SKSpriteNodes sont utilisés pour créer un noeud coloré, ou plus communément à partir d’un SKTexture, qui est le plus souvent une image. Nous utilisons l'initialiseur de commodité init (couleur: taille :) créer un noeud de couleur claire moneyContainer. le moneyContainer sera utilisé pour conserver l'argent que le joueur parie, et à la fin de chaque tour, nous animerons ce déplacement vers le vainqueur. Placer tout l'argent dans ce seul nœud facilite l'animation de tout l'argent en même temps.

Ensuite, nous créons les constantes dealBtn, hitBtn, et standBtn. Comme les noms le suggèrent, ils seront utilisés dans le jeu pour traiter, frapper et rester, respectivement. Nous utilisons l'initialiseur de commodité init (imageNamed :), qui prend en paramètre le nom de l'image sans extension.

Nous créons ensuite les trois constantes argent10, argent25, et argent50, qui sont du type Argent. Argent est une classe personnalisée qui s'étend SKSpriteNode et selon le type de moneyValue passé en tant que paramètre crée l'un des trois types d'argent différents. le moneyValue le paramètre est de type MoneyValue, qui est un enum. Regardez le Argent classe dans le projet GitHub repo pour voir comment tout cela fonctionne.

Enfin, nous créons un SKLabelNode en utilisant l'initialiseur de commodité  init (texte :) qui prend en paramètre le texte à afficher dans l'étiquette.

4. Mise en œuvre setupTable

Ajouter ce qui suit sous le didMove (to :) une fonction.

func setupTable () let table = SKSpriteNode (imageNamed: "table") addChild (table) 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 (instructionText) ) instructionText.position = CGPoint (x: size.width / 2, y: 400) 

Ici on initialise une constante table et l'ajouter à la scène en utilisant addChild (_ :) qui prend en paramètre le noeud à ajouter à la scène. Nous avons mis le tablede position dans la scène et mettre son zPosition à -1. le zPosition property contrôle l'ordre dans lequel les nœuds sont dessinés. Le numéro le plus bas est tiré en premier, les plus élevés étant tirés dans l'ordre. Parce que nous avons besoin de table en dessous de tout le reste, nous mettons sa zPosition à -1. Cela garantit qu'il est dessiné avant tout autre nœud.

Nous ajoutons aussi le moneyContainer et instructionText à la scène. Nous avons mis le couleur de la police du instructionText to black (le défaut est blanc).

Mettre à jour didMove (to :) au suivant.

redéfinit func didMove (pour afficher: SKView) setupTable () 

le didMove (to :) La méthode est appelée immédiatement après la présentation de la scène par la vue. En règle générale, c’est à cet endroit que vous effectuerez la configuration de votre scène et créerez vos éléments. Si vous testez maintenant, vous devriez voir que table et instructionText a été ajouté à la scène. le moneyContainer est là aussi, mais vous ne pouvez pas le voir parce que nous l'avons créé avec une couleur claire.

5. Mise en œuvre setupMoney

Ajouter ce qui suit sous le setupTable méthode.

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) 

Ici, nous ajoutons simplement les instances d’argent et définissons leur position. Invoquer cette méthode dans didMove (to :).

remplacer func didMove (pour afficher: SKView) setupTable () setupMoney () 

6. Mise en œuvre boutons de configuration

Ajouter ce qui suit sous le setupMoney méthode que vous avez créée à l'étape ci-dessus.

func 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 

Comme nous l'avons fait avec les fonds à l'étape précédente, nous ajoutons les boutons et définissons leurs positions. Ici nous utilisons le prénom propriété afin que nous puissions identifier chaque bouton par le code. Nous avons également mis le hitBtn et standBtn être caché, ou invisible, en réglant la est caché propriété à vrai.

Maintenant, invoquez cette méthode dans didMove (to :).

remplace func didMove (pour afficher: SKView) setupTable () setupMoney () setupButtons ()

Si vous exécutez l'application maintenant, vous devriez voir les instances d'argent et les boutons ont été ajoutés à la scène.

7. Mise en œuvre toucheBegan

Nous devons mettre en œuvre le toucheBegan (_: avec :) méthode permettant de savoir quand un objet de la scène a été touché. Cette méthode est appelée lorsqu'un ou plusieurs doigts ont touché l'écran. Ajouter ce qui suit dans toucheBegan.

remplacer les touches fonctionnellesBien (_ touches: Définir, with event: UIEvent?) gardien laissez touch = touch.first else return laissez touchLocation = touch.location (dans: self) laissez touchedNode = self.atPoint (touchLocation) if (touchedNode.name == "money")  laisser de l'argent = touchedNode as! Pari d'argent (betAmount: money.getValue ()) 

le multiTouchEnabled propriété de la vue de la scène est définie sur faux Par défaut, cela signifie que la vue reçoit uniquement le premier contact d'une séquence multitouch. Avec cette propriété désactivée, vous pouvez récupérer le contact en utilisant le premier propriété calculée de l'ensemble des touches puisqu'il n'y a qu'un seul objet dans l'ensemble.

Nous pouvons obtenir le touchLocation dans la scène par le emplacement propriété du toucher. Nous pouvons alors déterminer quel noeud a été touché en appelant au point(_:) et en passant dans le touchLocation.

Nous vérifions si le touchedNodeLa propriété name est égale à "argent", et si c’est nous savons qu’ils ont abordé l’une des trois instances d’argent. Nous initialisons une argent constante en rabaissant la touchedNode à Argent, et ensuite on appelle le pari méthode invoquant le getValue () méthode sur le argent constant.

8. Mise en œuvre pari

Entrez ce qui suit sous le boutons de configuration fonction que vous avez créée à l'étape ci-dessus.

func bet (betAmount: MoneyValue) if (betAmount.rawValue> player1.bank.getBalance ()) print ("Essayer de parier plus qu'avoir"); return else pot.addMoney (amount: betAmount.rawValue) let tempMoney = money (moneyValue: betAmount) tempMoney.anchorPoint = CGPoint (x: 0, y: 0) moneyContainer.addChild (tempMoney) tempMoney.position = CGPoint (x : CGFloat (arc4random_uniform (UInt32 (moneyContainer.size.width - tempMoney.size.width))), y: CGFloat (arc4random_uniform (UInt32 (moneyContainer.size.height - tempMoney.size.height))) dealBtn. ; 

Nous nous assurons d’abord que le joueur n’essaye pas de parier plus d’argent qu’il en a, et s’ils le font, nous revenons simplement de la fonction. Sinon, nous ajoutons le montant au pot, créer une constante tempMoney, mettre sa point d'ancrage à (0,0), et l'ajouter à la moneyContainer. Nous avons ensuite mis sa position et cache le dealBtn en mettant sa est caché propriété à false.

SKSpriteNodes ont un point d'ancrage propriété par défaut (0.5,0.5). Le système de coordonnées place (0,0) en bas à gauche et (1,1) en haut à droite. Vous souhaitez modifier cette propriété par défaut si vous faites pivoter le SKSpriteNode et je voulais que ça tourne autour d'un point différent. Par exemple, si vous avez changé le point d'ancrage propriété à (0,0) puis le SKSpriteNode tournerait de son coin inférieur gauche. Vous allez souvent changer cette propriété pour aider au positionnement, comme nous l'avons ici.

Nous devons créer une instance de la Pot et Joueur classes pour que ce code fonctionne. Ajoutez ce qui suit avec les autres constantes et variables.

let pot = Pot () let player1 = Player (main: main (), banque: banque ())

Si vous testez maintenant, vous pouvez appuyer sur n’importe quelle somme et l’ajouter à la liste. moneyContainer.

9. Mise en œuvre traiter

Ajoutez ce qui suit avec le reste de vos constantes et variables.

let dealer = Dealer (main: main) var allCards = [Carte] () let dealerCardsY = 930 // position Y des cartes donneur laissez playerCardsY = 200 // position Y des cartes joueur var currentPlayerType: GenericPlayer = Player (main: Main (), banque: Bank ()) let deck = Deck () 

le toutes les cartes tableau sera utilisé pour contenir toutes les cartes dans le jeu. Cela facilitera leur lecture en boucle et les supprimera de la scène en une seule fois. le dealerCardsY et playerCardsY les constantes sont les positions des cartes sur l’axe des y. Cela nous aidera lors du placement de nouvelles cartes. le currentPlayerType est utilisé pour indiquer à qui traiter. Il sera soit égal à Marchand ou joueur1

À l'intérieur didMove (to :), ajouter ce qui suit.

remplace func didMove (pour afficher: SKView) setupTable () setupMoney () setupButtons () currentPlayerType = player1 

Dans le code précédent, nous avons initialisé currentPlayerType à une instance non nommée du Joueur classe. Ici nous l'avons mis à joueur1

Nous devons créer un nouveau jeu de cartes avant de mettre en œuvre la méthode de transaction. Entrez les informations suivantes dans setupTable.

func setupTable () let table = SKSpriteNode (imageNamed: "table") addChild (table) 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 (instructionText) ) instructionText.position = CGPoint (x: size.width / 2, y: 400) deck.new ()

Nous pouvons maintenant implémenter la fonction deal. Ajouter ce qui suit sous le pari méthode.

func deal () instructionText.text = "" money10.isHidden = true; money25.isHidden = true; money50.isHidden = true; dealBtn.isHidden = true; standBtn.isHidden = false hitBtn.isHidden = false let tempCard = Card (convient: "card_front", valeur: 0) tempCard.position = CGPoint (x: 630, y: 980) addChild (tempCard) tempCard.zPosition = 100 let newCard = deck.getTopCard () var quiPosition = playerCardsY var quiHand = player1.hand si (self.currentPlayerType est Player) whichHand = player1.hand whichPosition = playerCardsY;  else whichHand = dealer.hand whichPosition = dealerCardsY;  whichHand.addCard (card: newCard) let xPos = 50 + (whichHand.getLength () * 35) let moveCard = SKAction.move (to: CGPoint (x: xPos, y: quellePosition), durée: 1.0) tempCard.run (moveCard, complétion: [sans propriétaire]] dans self.player1.setCanBet (canBet: true) si (self.currentPlayerType est Dealer && self.dealer.hand.getLength () == 1) self.dealer.setFirstCard (card : newCard) self.allCards.append (tempCard) tempCard.zPosition = 0 else tempCard.removeFromParent () self.allCards.append (newCard) self.addChild (newCard) newCard.position = CGPoint (x: xPos, y: quellePosition) newCard.zPosition = 100 if (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() >= 17) self.standBtn.isHidden = true self.hitBtn.isHidden = true self.doGameOver (hasBlackJack: false) if (self.player1.hand.getValue ()> 21) self.standBtn.isHidden = true; self.hitBtn.isHidden = true; self.doGameOver (hasBlackJack: false); ) 

Cette méthode est assez volumineuse, mais nécessaire pour mettre en œuvre la logique de traitement. Allons-y pas à pas. Nous initialisons un tempCard constante à une instance de Carte, définissez sa position et ajoutez-la à la scène. Nous avons besoin de cette carte tirée à un zPosition plus grand que 0, parce que la première carte du revendeur doit être à 0. Nous mettons cela à un nombre arbitraire-100 ça ira. Nous créons également un nouvelle carte constante en invoquant le plate-formede getTopCard () méthode.

Ensuite, nous initialisons deux variables, quelle position et quelle main, et ensuite exécuter une certaine logique pour déterminer leurs valeurs finales. Nous ajoutons ensuite le nouvelle carte à la main appropriée (du joueur ou du donneur). le xPos constante détermine la position finale x de la carte une fois l'animation terminée.

le SKAction class a un certain nombre de méthodes de classe que vous pouvez appeler pour modifier les propriétés d'un nœud, telles que la position, l'échelle et la rotation. Ici nous appelons le move (to: duration :) méthode, qui déplacera le nœud d’une position à une autre. Cependant, pour réellement exécuter le SKAction, vous devez invoquer le courir(_:) méthode d'un noeud et passez dans le SKAction en paramètre. Ici, cependant, nous invoquons le run (_: complétion :) méthode, qui entraînera l'exécution du code dans la fermeture d'achèvement après l'exécution de l'action.

Une fois l’action terminée, nous permettons au joueur de parier en invoquant setCanBet (canBet :) sur le joueur1 exemple. Nous vérifions ensuite si le currentPlayerType est un exemple de Marchand, et vérifier que le Marchand a seulement une carte en invoquant hand.getLength (). Si tel est le cas, nous définissons la MarchandLa première carte dont nous aurons besoin à la fin du jeu. 

Parce que le MarchandLa première carte est toujours face cachée jusqu'à la fin de la partie. Nous avons besoin d'une référence à la première carte pour pouvoir la montrer plus tard. Nous ajoutons cette carte au toutes les cartes tableau afin que nous puissions le supprimer plus tard, puis définissez sa zPosition propriété à 0 comme nous avons besoin de cette carte ci-dessous toutes les autres cartes. (Rappelez-vous que les autres cartes ont la position z 100.)

Si la currentPlayerType n'est pas un exemple de  Marchand, et la longueur de la main n'est pas égale à 1, puis on enlève le tempCard et mettre le nouvelle carte dans la même position, en veillant à régler son zPosition à 100.

Selon les règles du blackjack, le croupier et le joueur reçoivent deux cartes pour commencer le jeu. Ici, nous vérifions ce que le currentPlayerType est et le changer à l'opposé. Comme le croupier a moins de deux cartes, nous invoquons le traiter fonctionner à nouveau. Sinon, nous vérifions si les deux Marchand et joueur1 avoir deux cartes, et si tel est le cas, nous vérifions si l'une ou l'autre a des cartes d'une valeur totale de 21-une main gagnante. Si l'un a 21 alors le jeu est terminé parce que l'un d'entre eux a obtenu un black jack. Si ni a 21 alors nous montrons la standBtn et hitBtn et le jeu continue.

Les règles du black jack prévoient que le Marchand doit se tenir à 17 ou plus grand. Les prochaines lignes de code vérifient si le MarchandLa valeur de la main de est inférieure à 17 et si ainsi invoque le traiter méthode. Si c'est 17 ou plus, le jeu est terminé. Enfin, si joueur1La valeur de la main de est supérieure à 21 alors le jeu est terminé parce qu'ils ont éclaté.

C'était beaucoup de logique à traverser! Si quelque chose n'est pas clair, relisez-le et prenez votre temps pour le comprendre.. 

Ensuite, nous devons mettre en œuvre le jeu terminé méthode.

Nous devons pouvoir savoir quand l'utilisateur a appuyé sur le bouton Deal. Ajoutez le code suivant au toucheBegan (_: avec :) méthode.

remplacer les touches fonctionnellesBien (_ touches: Définir, with event: UIEvent?) gardien laissez touch = touch.first else return laissez touchLocation = touch.location (dans: self) laissez touchedNode = self.atPoint (touchLocation) if (touchedNode.name == "money")  laisser de l'argent = touchedNode as! Pari d'argent (betAmount: money.getValue ()) if (touchedNode.name == "dealBtn") deal () 

10. Mise en œuvre doGameOver

Ensuite, entrez ce qui suit sous le traiter méthode que vous avez créée à l'étape ci-dessus.

func doGameOver (hasBlackJack: Bool) hitBtn. tempCard) allCards.append (tempCard) tempCard.position = CGPoint (x: tempCardX, y: tempCardY) tempCard.zPosition = 0 gagnant gagnant: GenericPlayer = player1 if (hasBlackJack) if (player1.hand.getValue ()>. hand.getValue ()) // Ajouter aux joueurs Bank Ici (valeur du pot * 1.5) instructionText.text = "Vous avez un BlackJack!"; moveMoneyContainer (position: playerCardsY) else // Soustrayez de la banque de joueurs ici instructionText.text = "Le revendeur a obtenu BlackJack!"; moveMoneyContainer (position: dealerCardsY) return if (player1.hand.getValue ()> 21) instructionText.text = "You Busted!" // Soustraire de la banque de joueurs gagnant = concessionnaire else if (dealer.hand.getValue ()> 21) // Ajouter à la banque de joueurs instructionText.text = "Les bustes des concessionnaires. Vous gagnez!" winner = player1 else if (dealer.hand.getValue ()> player1.hand.getValue ()) // soustrait de la banque des joueurs instructionText.text = "You Lose!" winner = dealer else if (dealer.hand.getValue () == player1.hand.getValue ()) // Soustraire de la banque du joueur instructionText.text = "Cravate - Le revendeur gagne!" gagnant = dealer else if (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)  

Nous obtenons la position x et y de la première carte dans le toutes les cartes tableau, qui est la première carte du revendeur. Puis on instancie une constante tempCard en invoquant getFirstCard sur le revendeur. N'oubliez pas que nous définissons ceci Carte plus tôt dans la méthode des transactions? Ici, nous l’ajoutons à la scène, définissons sa position à l’aide des touches tempCardX et tempCardY constantes et définissez sa zPosition à 0il est donc sous les autres cartes.

Nous avons besoin de savoir qui a gagné le jeu, donc nous initialisons une variable gagnant le mettre égal à joueur1, si cela peut changer en fonction de si le Marchand effectivement gagné le jeu.

Nous suivons ensuite une certaine logique pour déterminer qui a gagné le match. Si hasBlackjack paramètre était vrai alors nous déterminons qui a gagné et revient de la fonction. Sinon, nous poursuivons dans la logique pour déterminer qui a remporté le match. Je ne vais pas aller pas à pas dans cette logique, qui doit être claire à comprendre. Peu importe qui a gagné, nous invoquons moveMoneyContainer (position :), qui prend comme paramètre la position pour déplacer le conteneur d’argent vers. Ce sera la position y de la Marchandou joueur1Les cartes de.

11. Mise en œuvre moveMoneyContainer

Entrez le code suivant sous le doGameOver méthode.

 func moveMoneyContainer (position: Int) let moveMoneyContainer = SKAction.moveTo (y: CGFloat (position), durée: 3.0) moneyContainer.run (moveMoneyContainer, complétion: [auto non propriétaire] dans self.resetMoneyContainer ()); 

le moveMoneyContainer (position :) la méthode déplace le moneyContainer à celui qui a gagné le jeu, que ce soit le joueur ou le croupier. Quand le SKAction complète, nous invoquons resetMoneyContainer.

12. Mise en œuvre resetMoneyContainer

le resetMoneyContainer méthode supprime tous les fonds en invoquant le removeAllChildren () méthode, réinitialise le moneyContainer à sa position d'origine, et invoque nouveau jeu.

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

13. Mise en œuvre nouveau jeu

Ajouter ce qui suit sous le resetMoneyContainer méthode que vous avez mis en œuvre dans l'étape ci-dessus.

func newGame () currentPlayerType = player1 deck.new () instructionText.text = "PLACE YOUR BET"; money10.isHidden = false; money25.isHidden = false; money50.isHidden = false; dealBtn.isHidden = false player1.hand.reset () dealer.hand.reset () player1.setYielding (rendement: false) pour la carte allCards card.removeFromParent () allCards.removeAll ()

Ici, nous réinitialisons toutes les variables nécessaires et retirons toutes les cartes de la scène en passant en boucle. toutes les cartes tableau et invoquer removeFromParent () sur chaque élément.

14. Mise en œuvre du hitBtn et standBtn

Pour terminer notre jeu, il ne reste plus qu'à mettre en œuvre les touches sur le hitBtn et standBtn. Entrez les informations suivantes dans le toucheBegan (_: avec :) méthode.

remplacer les touches fonctionnellesBien (_ touches: Définir, with event: UIEvent?) gardien laissez touch = touch.first else return laissez touchLocation = touch.location (dans: self) laissez touchedNode = self.atPoint (touchLocation) if (touchedNode.name == "money")  laisser de l'argent = touchedNode as! Pari d'argent (betAmount: money.getValue ()) if (touchedNode.name == "dealBtn") deal () if (touchedNode.name == "hitBtn") hit () if (touchedNode.name = = "standBtn") stand () 

Et maintenant, nous allons implémenter les méthodes appelées dans le gestionnaire d'événements. Entrez les deux méthodes suivantes sous le nouveau jeu méthode.

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

Dans le frappé méthode, nous nous assurons que ce joueur peut parier, et si tel est le cas, nous définissons la currentPlayerType à joueur1, puis invoquer le traiter méthode et arrêter le joueur pariant plus loin.

Dans la méthode du stand, nous invoquons setYielding sur joueur1, en passant vrai. Nous vérifions ensuite si le MarchandLa valeur de la main de est inférieure à 17, et si tel est le cas, nous appelons accord, et si le Marchandla main de 17 ou plus cela signifie que le jeu est terminé.

Vous pouvez maintenant tester le jeu terminé.

Conclusion

Ce fut un long tutoriel avec une bonne logique dissimulée dans la méthode des transactions. Nous n'avons pas implémenté l'utilisation du Pot et additionner et soustraire de l'argent de la banque du joueur. Pourquoi n'essaies-tu pas de faire ça comme exercice pour finir l'application??

Vous avez maintenant un jeu de blackjack dont vous pouvez être fier. Merci de votre lecture et j'espère que vous avez trouvé ce tutoriel utile. Pendant que vous êtes ici, consultez certains de nos autres cours et tutoriels sur la programmation d'applications avec Swift et SpriteKit.!