新Swiftで行こう…第63回「トランプ5解説」 田部井保

目次 通常版

 ♣️以外のマークのカードもJKを除いてすべて出す。

//
//  ViewController.swift
//  Card
//
//  Created by 保 Tabei on 2024/09/25.
//

import UIKit

class ViewController: UIViewController {
    ///カード表示用ラベル
    @IBOutlet weak var lblCard: UILabel!
    ///残り枚数表示用ラベル
    @IBOutlet weak var lblCount: UILabel!
  
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        //ラベル配列を適切に配置する
        for i in 0 ..< EnumCard.Count {
            //ラベルを生成する
            let lbl = UILabel(frame: CGRectMake(0, 0, 50, 21))
            //ラベルの中心を指定する
            lbl.center = CGPointMake(120 + 50 * CGFloat(i / 13), 100 + CGFloat(i % 13) * 30)
            //ラベルのテキスト配置を中央にする
            lbl.textAlignment = NSTextAlignment.center
            //ラベルの表示をカードが裏になっている様にする
            lbl.text = "⬛️"
            //ラベル配列に追加する
            eachCard += [lbl]
            //ラベルを画面上に配置する
            self.view.addSubview(lbl)
        }
    }

    ///マーク保持配列
    let mark: [String] = ["♣️","♦️","❤️","♠️"]
    ///ナンバー保持配列
    let number: [String] = ["A","2","3","4","5","6","7","8","9","T","J","Q","K"]

    ///カード枚数保持定数
    enum EnumCard {
        static let Count = 52
    }
    
    ///既に出ているかチェックする、出ていたらtrue
    ///出ていなかったらfalse、とりあえず
    ///EnumCard.Count枚分falseで埋める
    var check = [Bool](repeating: false, count: EnumCard.Count)

    ///残り枚数を保持する変数
    var count = EnumCard.Count
    
    ///ラベル配列
    var eachCard: [UILabel] = []

    ///ボタン押下時処理
    @IBAction func btnGoTouch(_ sender: Any) {
        //残り枚数0なら初期化
        if count == 0 {
            //check配列を全部falseに
            //ラベル配列をカードが裏になるように表示
            for i in 0 ..< EnumCard.Count
            {
                check[i] = false
                eachCard[i].text = "⬛️"
            }

            //アラート
            let alert = UIAlertController()
            alert.title = "初期化"
            alert.message = "カードを配り直します"
            alert.addAction(UIAlertAction(title: "OK", style: .default))
            present(alert, animated: true, completion: nil)
            //残り枚数をリセット
            count = EnumCard.Count
        }
        //残り枚数0以上
        else {
            //今回引いたカードを特定する変数
            var card = 0
            //乱数を0から残り枚数−1の範囲で発生させる
            let randInt = Int.random(in: 0 ..< count)
            //発生させた乱数分ループ
            for i in 0 ... randInt {
                //カードが既に出ていたらcard + 1
                while check[card] {
                    card += 1
                }
                //iがrandIntに達していなければcard + 1
                if i < randInt {
                    card += 1
                }
            }
            //新たに出たカード既に出ているとマークする
            check[card] = true

            //残り枚数を1減算
            count -= 1
            //残り枚数表示用ラベルに残り枚数を表示
            lblCount.text = count.description

            //ジョーカーの場合
            if card == 52 {
                lblCard.text = "JK"
                //ジョーカー以外の場合
            } else {
                //カード表示用ラベルにマークとナンバーを表示
                lblCard.text = mark[card / 13] + number[card % 13]
            }

            //ラベル配列の定められた位置に表示
            eachCard[card].text = lblCard.text
        }
    }
    
}

 22行目は、改造前は幅が200だったのを50にしました。200は大き過ぎでしたね。

 24行目、以前は、

lbl.center = CGPointMake(160, 100 + CGFloat(i) * 30)

と、X軸は160固定で、Y軸を100+ i *30、と100から30ポイント置きに配置していました。それを

lbl.center = CGPointMake(120 + 50 * CGFloat(i / 13), 100 + CGFloat(i % 13) * 30)

X軸は120+50*( i /13)と、マーク毎に♣️は120、♦️は170、❤️は220、スペードは270としました。Y軸は100+( i %13)*30と、 A は100、2は130、3は160、4は190…の様にしました。

 あとは、43行目で13(♣️だけ)だったのを52(JKを除く全カード)としただけです。

目次 通常版

コメントを残す

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

CAPTCHA