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

目次 解説編

 今回は、実際にカードを配ろうと思います。ここで裏のままだと、どのようにカードが配られたか判らないので、今は表を表示しようと思います。

 以下ソースコードです。

//
//  ViewController.swift
//  baba
//
//  Created by 保 Tabei on 2024/09/15.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        put53()
    }

    var eachCard: [[UILabel]] = [[],[],[],[]]
    var cardObj:Card = Card(cdCnt: Card.EnumCard.joker)
    func put53() {
        for i in 0 ..< 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
                if i != 0 && j == 13 {
                    lbl.text = " "
                } else {
                    lbl.text = "⬛️"
                }
                eachCard[i] += [lbl]
                self.view.addSubview(lbl)
            }
        }
    }
    
    @IBAction func btnGoTouch(_ sender: Any) {
        for i in 0 ..< 4 {
            for j in 0 ..< 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関数でカードの表示文字列とカード番号を返すようにしていますが、ここはカード番号だけを返すようにして、表示が必要な時は、disp関数を呼び出すとした方が良さそうです。
そのように改造します。

以下CardClassのソースコード。

//
//  CardClass.swift
//  Poker
//
//  Created by 保 Tabei on 2024/09/15.
//

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 {
        case nonJoker = 52
        case joker = 53
    }
    
    var cardCount = 0
    
    var check: [Bool] = []
    
    var count = 0
    
    init(cdCnt: EnumCard) {
        cardCount = cdCnt.rawValue
        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
        let randInt = Int.random(in: 0 ..< count)
        for i in 0 ... randInt {
            while check[card] {
                card += 1
            }
            if i < randInt {
                card += 1
            }
        }
        check[card] = true
        count -= 1
        //var strCard: String?
        //if card == 52 {
        //    strCard = "JK"
        //} else {
        //    strCard = mark[card / 13] + number[card % 13]
        //}
        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/09/15.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        put53()
    }

    var eachCard: [[UILabel]] = [[],[],[],[]]
    var cardObj:Card = Card(cdCnt: Card.EnumCard.joker)
    func put53() {
        for i in 0 ..< 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
                if i != 0 && j == 13 {
                    lbl.text = " "
                } else {
                    lbl.text = "⬛️"
                }
                eachCard[i] += [lbl]
                self.view.addSubview(lbl)
            }
        }
    }
    
    @IBAction func btnGoTouch(_ sender: Any) {
        for i in 0 ..< 4 {
            for j in 0 ..< 14 {
                if i != 0 && j == 13 {
                } else {
                    eachCard[i][j].tag = cardObj.put()
                    eachCard[i][j].text = cardObj.disp(card: eachCard[i][j].tag)
                }
            }
        }
    }
}

 さて、カードが重複無く配られているでしょうか?
 次回は、ババ抜きですので、ペアになったカードを除くという処理を加えてみます。皆さんも考えてみて下さい。

目次 解説編

コメントを残す

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

CAPTCHA