新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)
}
}
}
}
}