新Swiftで行こう…第83回「ババ抜き5解説」 田部井保
ユーザーが4組のどれを選ぶかのボタンを付けます。
//
// ViewController.swift
// baba
//
// Created by 保 Tabei on 2024/10/12.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
//53枚のカードを並べる
put53()
}
///4人分のカードのラベル
var eachCard: [[UILabel]] = [[],[],[],[]]
///4人の内どれを自分にするかのボタン
var eachButton: [UIButton] = []
///カードクラス、ジョーカー込みで初期化
var cardObj:Card = Card(cdCnt: Card.EnumCard.joker)
///53枚のカードを並べる関数
func put53() {
//4人分
for i in 0 ..< 4 {
//14枚(一人目)か13枚(2〜4人目)
for j in 0 ..< 14 {
//ラベルを生成
let lbl = UILabel(frame: CGRectMake(0, 0, 50, 21))
//ラベルの中心を設定
lbl.center = CGPointMake(50 + 40 * CGFloat(j % 7), 150 + 120 * CGFloat(i) +
50 * CGFloat(j / 7))
//ラベルのテキスト位置を設定
lbl.textAlignment = NSTextAlignment.center
//2人目〜4人目の14枚目は空
if i != 0 && j == 13 {
lbl.text = " "
//13枚目までと一人目の14枚目
} else {
lbl.text = "⬛️"
}
//4人分のカードラベルに追加
eachCard[i] += [lbl]
//ラベルをフォームに追加
self.view.addSubview(lbl)
}
//ボタンを生成
let btn = UIButton(frame: CGRectMake(0, 0, 50, 21)) as UIButton
//ボタンの中心を設定
btn.center = CGPointMake(20, 150 + 120 * CGFloat(i) + 25)
//ボタンの表示文字列を指定(白丸)
btn.setTitle("⚪️", for: .normal)
//ボタンのテキストカラーを設定
btn.setTitleColor(UIColor.black, for: .normal)
//ボタンが押された時に動作する関数を指定
btn.addTarget(self, action: #selector(btnTapped), for: .touchUpInside)
//ボタン式別用にタグにiを入れる
btn.tag = i
//ボタン配列に加える
eachButton += [btn]
//ボタンをフォームに追加
self.view.addSubview(btn)
}
//配る
share()
//表示する
show()
}
///自分選択ボタンが押された時の処理
@objc func btnTapped(sender: UIButton) {
//4人分ループ
for i in 0 ..< 4 {
//押されたボタンの場合
if eachButton[i] == sender {
//タイトルが白丸なら
if sender.currentTitle == "⚪️" {
//タイトルを黒丸に
sender.setTitle("⚫️", for: .normal)
//タイトルが黒丸なら
} else {
//タイトルを白丸に
sender.setTitle("⚪️", for: .normal)
}
//押されたボタン以外
} else {
//タイトルを白丸にする
eachButton[i].setTitle("⚪️", for: .normal)
}
}
}
///配る
func share() {
//初期状態にする
cardObj.reset()
//4人分
for i in 0 ..< 4 {
//最大14枚
for j in 0 ..< 14 {
//2人〜4人目14枚目
if i != 0 && j == 13 {
//無効カード
eachCard[i][j].tag = -1
} else {
//カードを引いてtagに
eachCard[i][j].tag = cardObj.put()
}
}
}
}
///表示する
func show() {
//4人分
for i in 0 ..< 4 {
//最大14枚
for j in 0 ..< 14 {
//カードのタグが0以上なら
if eachCard[i][j].tag >= 0 {
//カードの表を表示
eachCard[i][j].text = cardObj.disp(card: eachCard[i][j].tag)
//カードのタグが0より小さいなら
} else {
//カードは空白
eachCard[i][j].text = " "
}
}
}
}
///再配布ボタン
@IBAction func btnGoTouch(_ sender: Any) {
//配る
share()
//表示する
show()
}
///ペアを除くボタン押下時処理
@IBAction func btnPairTouch(_ sender: Any) {
//4人分ループ
for i in 0 ..< 4 {
//最大13枚ループ
for j in 0 ..< 13 {
//ジョーカーかカードのタグが−1なら次のjのループへ
if (eachCard[i][j].tag == 52) || (eachCard[i][j].tag == -1) {
//以下の処理は行わず次のjのループへ
continue
}
//jの次のカードから14枚目までループ
for k in j + 1 ..< 14 {
//ジョーカーかカードのタグが−1なら次のkのループへ
if (eachCard[i][k].tag == 52) || (eachCard[i][k].tag == -1) {
//以下の処理は行わず次のkのループへ
continue
}
//jの位置のカード番号とkの位置のカード番号が同じなら
if (eachCard[i][j].tag % 13) == (eachCard[i][k].tag % 13) {
//jの位置のカードのタグを−1に
eachCard[i][j].tag = -1
//kの位置のカードのタグを−1に
eachCard[i][k].tag = -1
//kのループは終了
break
}
}
}
//無効カードが見つかったか保持する変数
var find = false
//左側のカード位置
var k = 0
//調査するカード位置
for j in 0 ..< 14 {
//調査カードが無効カードなら
if eachCard[i][j].tag == -1 {
//無効カードが見つかった
find = true
//調査カードが無効カードでないなら
} else {
//無効カードが見つかっていたら
if find {
//カードを左側に詰める
eachCard[i][k].tag = eachCard[i][j].tag
eachCard[i][j].tag = -1
}
//左側カード位置を+1する
k += 1
}
}
}
//表示する
show()
}
}
22行目が、4人の内どれを自分にするかのボタンの配列です。
51行目から66行目で、ボタンを生成して、各値を設定し、配列に追加し、画面に追加しています。
74行目からが、自分選択ボタンが押された時の処理で、75行目の sender には、実際に押されたボタンが入ります。77行目から4人分のループとなります。79行目で、自分選択ボタン配列の i 番目が実際に押されたボタンだった場合、タイトルが白丸だったら黒丸にし、黒丸だったら白丸にしています。90行目からが押されたボタン以外の処理で、無条件に白丸にしています。こういった処理なので、黒丸は必ず1箇所までとなり、黒丸をクリックした場合は全部白丸になります。