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