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

目次 通常版

 自分のカードを並べ替える処理を追加します。

    //ユーザー並び替えボタン配列
    var eachChangeButton: [UIButton] = []
    
    //ユーザー並び替え開始ボタン押下時処理
    @IBAction func btnChangeTouch(_ sender: Any) {
        //3番目の人(ユーザー)
        let i = 2
        //3番目の人のカード枚数
        var kl = 14
        //3番目の人のカードをチェックする
        for j in 0 ..< 14 {
            //無効カードだったら
            if eachCard[i][j].tag == -1 {
                //3番目の人のカード枚数はj
                kl = j
                //ループを抜ける
                break
            }
        }
        
        //3番目の人のカード枚数分並べ替えボタンを用意する
        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)
            //ボタンが押された時cardChangeTapped関数を呼ぶ
            btn.addTarget(self, action: #selector(cardChangeTapped), for: .touchUpInside)
            //ボタンのタグを0にする
            btn.tag = 0
            //ユーザー並び替えボタン配列にボタンを追加
            eachChangeButton += [btn]
            //ボタンを画面に出す
            self.view.addSubview(btn)
        }
    }
    
    //ユーザー並び替えボタンのどれかが押された時
    @objc func cardChangeTapped(sender: UIButton) {
        //3番目の人
        let i = 2
        //前に選択していたものがあったらその位置
        var j = 0
        //今選択したボタンの位置
        var k = 0
        //ユーザー並び替えボタン配列分ループ
        for cardBtn in eachChangeButton {
            //今選択したボタンならループを抜ける
            if cardBtn == sender {
                break;
            }
            //位置を+1
            k += 1
        }
        //前に選択していたものがある(最初は無い)
        var dis = false
        //ユーザー並び替えボタン配列分ループ
        for cardBtn in eachChangeButton {
            //前に選択していたものが見つかったら
            if cardBtn.tag == 1 {
                //今の位置のカードをchangeに退避
                let change = eachCard[i][j].tag
                //今の位置のカードを新たに選択したカードで置き換える
                eachCard[i][j].tag = eachCard[i][k].tag
                //新たに選択した位置のカードを退避していたカード番号にする
                eachCard[i][k].tag = change
                //今の位置の選択ボタンの色を青色に
                cardBtn.setTitleColor(UIColor.blue, for: .normal)
                //今の位置の選択ボタンのtagを0に
                cardBtn.tag = 0
                //前に選択していたものがあった
                dis = true
                //表示する
                show()
                //ループを抜ける
                break
            }
            //位置を+1
            j += 1
        }
        //前に選択していたものが無い場合
        if dis == false {
            //新たに選択した位置のボタンを赤に
            sender.setTitleColor(UIColor.red, for: .normal)
            //新たに選択したボタンのtagを1に
            sender.tag = 1
        }
    }

 ここでは、ユーザーのカード(とりあえず3番目固定)に並べ替えボタンを配置して、1回目のボタンタップでは、押されたボタンの色を青色から赤色に変えてtagに印を付ける。2回目のボタンタップでは、2回目に押されたボタン位置のカードと1回目に押されたボタン位置のカードを入れ替える処理をしています。

 5行目からが、ユーザーカード並べ替え開始ボタンが押下された時の処理で、ユーザーのカードの上に選択用ボタンを青色で配置してtagを0にしています。

 43行目からが、ユーザー並び替えボタンが押下された時の処理で、49行目から58行目で、今選択したボタンの位置を k に取得し、60行目から84行目で、前に選択したボタンの位置を割り出し、64行目からで、前に選択したボタンが見つかったら、66行目で前に選択した位置のカード番号を change 変数に入れ、68行目で前に選択したボタン位置のカード番号を、今選択したボタン位置のカード番号で上書きし、70行目で今選択したボタン位置のカード番号を change 変数で上書きします。この様に2つのカード番号を入れ替えるには、まず1つ目のカード番号を退避し、1つ目のカード番号を2つ目のカード番号で上書きし、2つ目のカード番号を退避した番号で上書きするという操作をします。そして前に選択したボタンの色を青色に戻し、tag を0にしています。そして前に選択したボタンがあるかを示す dis 変数を true(ある)にしています。そして表示してループを抜けています。

 86行目から91行目が、前に選択していたものが無かった場合の処理で、新たに選択したボタンの色を赤に変え、tag の値を1にしています。sender には押されたボタンが入っています。

目次 通常版

コメントを残す

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

CAPTCHA