見出し画像

Swiftで行こう!--スタンフォードでGame!3

Swiftで行こう!--スタンフォードでGame!

Swiftで行こう!--スタンフォードでGame!2

の続きです。まず準備です。新しいファイル2つ作ります。Concentration.swiftとCard.swiftを新規ファイルとしてからファイルを作っています。Card.swiftはConcentration.swiftの中で使います。Concentration.swiftはViewControllerの中で変数gameを宣言して使っていきます。

まず、

class Concentration{}

ですが、

var cards = [Card]()
   func chooseCard(at index:Int) {
       if cards[index].isFaceUp{
           cards[index].isFaceUp = false
       }else{
           cards[index].isFaceUp = true
       }
   }
   
   init(numberOfpairsOfCards:Int){
       for _ in 0...numberOfpairsOfCards{
           let card = Card()
           cards += [card,card]
       }
   }

まず初期化ですが、"numberOfpairsOfCards"の数だけカードのペア、同じカード2枚を追加します。

init(numberOfpairsOfCards:Int){}

そして、

func chooseCard(at index:Int){}

で選んだカードが表か裏かの条件を設定。

次に決めていくのは、

struct Card{}

で、カードのもつ属性、どんなものを持っているのかを決めてやります。

var isFaceUp = false
var isMatched = false
var identifier:Int

この3つの性質を持ちます。デフォルトの設定ですね。

そしてViewControllerに繋いでいきます。

 lazy var game = Concentration(numberOfpairsOfCards: (cardButtons.count + 1)/2)

まずここで大事なこと。"lazy"がついていること。遅延評価で実施していることです。あとペアのカードなので1/2しています。

あとポイントを紹介します。

@IBOutlet var cardButtons: [UIButton]!

でボタンを定義していますので、これ重要です。[ ]なのでCollectionで、複数の値が入ってきます。

@IBAction func touchCard(_ sender: UIButton) {}

ボタンをタッチした時の挙動です。

if let cardNumber = cardButtons.firstIndex(of: sender){
           game.chooseCard(at: cardNumber)
           updateViewFromModel()
       }else{
           print("no")
       }

ボタンを押したカードのインデックスを取得してそのカードの表裏を逆転させます。そして

updateViewFromModel()

へ繋げます。

func updateViewFromModel(){
       for index in cardButtons.indices{
           let button = cardButtons[index]
           let card = game.cards[index]
           if card.isFaceUp{
               button.setTitle(emoji(for: card), for: .normal)
               button.backgroundColor = .white
           }else{
               button.setTitle("", for: .normal)
               button.backgroundColor =  card.isMatched ? #colorLiteral(red: 1, green: 0.5763723254, blue: 0, alpha: 0)  :#colorLiteral(red: 0.9529411793, green: 0.6862745285, blue: 0.1333333403, alpha: 1)
           }
       }
   }

ここでボタンに絵文字を表示させていきます。

var emojiChoices = ["👾","👻","☠️","🤖","🎃"]

var emoji = [Int:String]()

func emoji(for card:Card)->String{
       if emoji[card.identifier] == nil,emojiChoices.count > 0{
           let randomIndex = Int.random(in: 0 ... emojiChoices.count)
           emoji[card.identifier] = emojiChoices.remove(at: randomIndex)
       }
      return emoji[card.identifier] ?? "?"
 }

こんな感じになりました。

この記事が気に入ったらサポートをしてみませんか?