新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 に入れるだけにしました。

目次 通常版

コメントを残す

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

CAPTCHA