新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 には押されたボタンが入っています。