Swiftで行こう!--スタンフォードでGame!3
の続きです。まず準備です。新しいファイル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] ?? "?"
}
こんな感じになりました。
この記事が気に入ったらサポートをしてみませんか?