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

目次 通常版

 実際にカードを配ります。

//
//  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)
            }
        }
    }
    
    ///配るボタン
    @IBAction func btnGoTouch(_ sender: Any) {
        //4人分
        for i in 0 ..< 4 {
            //最大14枚
            for j in 0 ..< 14 {
                //2人〜4人目14枚目
                if i != 0 && j == 13 {
                //上記以外(通常)
                } else {
                    var st: String?
                    var ii: Int
                    //カードを配る
                    (st, ii) = cardObj.put()
                    //カードを表にして出す
                    eachCard[i][j].text = st
                    //カード番号を控えておく
                    eachCard[i][j].tag = ii
                }
            }
        }
    }
}

 今回の追加部分については、解説の必要はほとんど無いのではと思います。

 CardClassですが、put関数でカードの表示文字列とカード番号を返すようにしていますが、ここはカード番号だけを返すようにします。

//
//  CardClass.swift
//  Poker
//
//  Created by 保 Tabei on 2024/10/12.
//

import Foundation

class Card {
    
    ///マーク保持配列
    let mark: [String] = ["♣️","♦️","❤️","♠️"]
    ///ナンバー保持配列
    let number: [String] = ["A","2","3","4","5","6","7","8","9","T","J","Q","K"]
    
    ///ジョーカーありなし設定
    enum EnumCard: Int {
        //ジョーカーなし52枚
        case nonJoker = 52
        //ジョーカーあり53枚
        case joker = 53
    }

    ///カード枚数
    var cardCount = 0
    ///既に出ているかチェックする配列、出ていたらtrue
    ///出ていなかったらfalse、init関数で生成
    var check: [Bool] = []
    ///残り枚数を保持する変数
    var count = 0

    ///初期化関数
    init(cdCnt: EnumCard) {
        //カード枚数設定
        cardCount = cdCnt.rawValue
        //カード枚数分チェック配列を生成、初期値false
        for _ in 0 ..< cardCount {
            check += [false]
        }
        //残り枚数をカード枚数に
        count = cardCount
    }

    ///リセット
    func reset() {
        //全カード出ていない事に
        for i in 0 ..< cardCount {
            check[i] = false
        }
        //残り枚数をカード枚数に
        count = cardCount
    }
    
    ///カードを引いてカード表面文字列とカード番号を返す
    func put() -> Int {
        //今回引いたカードを特定する変数
        var card = 0
        //乱数を0から残り枚数−1の範囲で発生させる
        let randInt = Int.random(in: 0 ..< count)
        //発生させた乱数分ループ
        for j in 0 ... randInt {
            //カードが既に出ていたらcard + 1
            while check[card] {
                card += 1
            }
            //jがrandIntに達していなければcard + 1
            if j < randInt {
                card += 1
            }
        }
        //新たに出たカード既に出ているとマークする
        check[card] = true
        
        //残り枚数を1減算
        count -= 1
        
        //カード番号を返す
        return card
    }
    
    //カード番号を指定するとそのカードの表面文字列を返す
    func disp(card: Int) -> String {
        //一時保持文字列
        var strCard: String
        //ジョーカーの場合
        if card == 52 {
            strCard = "JK"
        //ジョーカー以外の場合
        } else {
            //カード一時保持変数にマークとナンバーを保持
            strCard = mark[card / 13] + number[card % 13]
        }
        //表面文字列を返す
        return strCard
    }
}

 メインプログラムのソースコードです。

//
//  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)
            }
        }
    }
    
    ///配るボタン
    @IBAction func btnGoTouch(_ sender: Any) {
        //4人分
        for i in 0 ..< 4 {
            //最大14枚
            for j in 0 ..< 14 {
                //2人〜4人目14枚目
                if i != 0 && j == 13 {
                //上記以外(通常)
                } else {
                    //カードを配る、番号をtagに
                    eachCard[i][j].tag = cardObj.put()
                    //カードを表示する
                    eachCard[i][j].text = cardObj.disp(card: eachCard[i][j].tag)
                }
            }
        }
    }
}

目次 通常版

コメントを残す

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

CAPTCHA