新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を除く全カード)としただけです。