新Swiftで行こう…第87回「ババ抜き9解説」 田部井保

目次 通常版

 ユーザーが引くカードを選択する為のボタンを加えます。

    ///ユーザーが引くカードを選択するボタン配列
    var eachCardButton: [UIButton] = []
    
    ///2番目の人のカードをシャッフルする
    @IBAction func shuffle(_ sender: Any) {
        //2番目の人
        let i = 1
        //2番目の人のカード枚数
        var kl = 14
        //2番目の人のカードを取っておく配列
        var cardList: [Int] = []
        //2番目の人のカード、無効カードが出るまで検査
        for j in 0 ..< 14 {
            //無効カードが出たら
            if eachCard[i][j].tag == -1 {
                //2番目の人のカード枚数はj
                kl = j
                //ループを抜ける
                break
            }
            //2番目の人のカードを取っておく
            cardList += [eachCard[i][j].tag]
        }
        
        //2番目の人のカード枚数分ループ
        for j in 0 ..< kl {
            //ランダムにカードを選択、最初は2番目の人のカード枚数、順に1引いてゆく
            let jj = Int.random(in: 0 ..< kl - j)
            //2番目の人のカード、左から順にセットする
            eachCard[i][j].tag = cardList[jj]
            //ランダムに選択したカードを後ろのカードで順に詰める、段々最後のカードが1つ前に行く
            for k in jj ..< kl - j - 1 {
                //次のカードで今のカードを上書き
                cardList[k] = cardList[k + 1]
            }
        }
        //表示する
        show()
        
        //2番目の人のカードにボタンを付けユーザーが引けるようにする
        //2番目の人のカードの数ループ
        for j in 0 ..< kl {
            //ボタンを生成する
            let btn = UIButton(frame: CGRectMake(0, 0, 50, 21))
            //ボタンの中心を指定
            btn.center = CGPointMake(50 + 40 * CGFloat(j % 7), 150 + 120 * CGFloat(i) + 50 * CGFloat(j / 7))
            //四角いマークをボタンのタイトルに
            btn.setTitle("◼︎", for: .normal)
            //ボタンを青に
            btn.setTitleColor(UIColor.blue, for: .normal)
            //ボタンが押された時にcardBtnTapped関数を呼ぶ
            btn.addTarget(self, action: #selector(cardBtnTapped), for: .touchUpInside)
            //タグを0に
            btn.tag = 0
            //ボタン配列に生成したボタンを追加
            eachCardButton += [btn]
            //ボタンを描画
            self.view.addSubview(btn)
        }
    }
    
    //カード選択ボタンが押された時に動作する関数
    @objc func cardBtnTapped(sender: UIButton) {
        //カード選択ボタン配列の全ボタンを青色に
        for cardBtn in eachCardButton {
            cardBtn.setTitleColor(UIColor.blue, for: .normal)
            //タグを0に
            cardBtn.tag = 0
        }
        //選んだボタンを赤色に
        sender.setTitleColor(UIColor.red, for: .normal)
        //タグを1に
        sender.tag = 1
    }

 2行目で、ユーザーが引くカードを選択するボタン配列を定義しています。

 42行目からで、2番目の人のカードにボタンを付けユーザーが引けるようにしています。この追加処理は、今まで何度も出て来ているので、もう解説はいらないのでは無いでしょうか。

 63行目からが、カード選択ボタンが押された時に動作する関数で、まずすべてのカード選択ボタンを青にし、タグを0にしています。そして、71行目で、選んだボタンを赤色にしています。そしてタグを1にしています。そして65行目ですが、

        for cardBtn in eachCardButton {

とループが今までとちょっと違います。このループは in 以降の配列を一つずつ取り出して、for の後の変数に入れるという形になります。今までの、for i in 0 ..< kl といったループ、この形にした方が良さそうなものもあったと思います。

目次 通常版

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA