新Swiftで行こう…第82回「ババ抜き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]] = [[],[],[],[]]
///カードクラス、ジョーカー込みで初期化
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)
}
}
//配る
share()
//表示する
show()
}
///配る
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 {
var ii: Int
//カードを配る
ii = cardObj.put()
//表示する
eachCard[i][j].text = cardObj.disp(card: ii)
//番号をtagに
eachCard[i][j].tag = ii
}
}
}
}
///表示する
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()
}
}
56行目からが、新しく移設した share 関数です。これで53枚のカードを4人に配っています。59行目で card クラスの reset関数を呼んでいるので、 card クラスが初期化され、何回 share 関数を呼んでも大丈夫な様になっています。
81行目からが、新しく移設した show 関数です。4人分のカードを表にして表示します。
put53 関数内の50行目から53行目で、share 関数を呼んで show 関数を呼んでいます。配って、表示しています。
100行目から106行目の配布ボタンは、再配布ボタンに意味を変え、配り直しの時に押すボタンになりました。ここの中身は share 関数に移りました。
ペアを除くボタン押下時処理内の161行目で、show 関数を呼び、それまで表示処理を書いていた部分を削除しました。表示処理は、4人分全部表示するので、今まで一人分ずつ表示していたのと位置が変わりました( i ループ内から i ループ外)。
通常版では、記述が無いのですが、share 関数で、表示もしてしまっています。ここは show 関数に任せて、share 関数は純粋に配るだけにしたいと思います。
///配る
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()
}
}
}
}
15行目で、カードを引いて tag に入れるだけにしました。