新Swiftで行こう…第64回「ポーカー1解説」 田部井保
5枚のカードを重複無く配る。
//
// ViewController.swift
// Poker
//
// Created by 保 Tabei on 2024/10/03.
//
import UIKit
class ViewController: UIViewController {
//カード表示用ラベル
@IBOutlet weak var lblCard1: UILabel!
@IBOutlet weak var lblCard2: UILabel!
@IBOutlet weak var lblCard3: UILabel!
@IBOutlet weak var lblCard4: UILabel!
@IBOutlet weak var lblCard5: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
///マーク保持配列
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
@IBAction func btnGoTouch(_ sender: Any) {
//リセット
//全カード出ていない事に
for i in 0 ..< EnumCard.Count {
check[i] = false
}
//残り枚数52枚
count = EnumCard.Count
//5枚引く
for i in 0 ..< 5 {
//今回引いたカードを特定する変数
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
//カード一時保持変数
var strCard: String
//ジョーカーの場合
if card == 52 {
strCard = "JK"
//ジョーカー以外の場合
} else {
//カード一時保持変数にマークとナンバーを保持
strCard = mark[card / 13] + number[card % 13]
}
//iの値によって表示位置にカード表示
switch i {
case 0:
lblCard1.text = strCard
case 1:
lblCard2.text = strCard
case 2:
lblCard3.text = strCard
case 3:
lblCard4.text = strCard
case 4:
lblCard5.text = strCard
default:
lblCard1.text = strCard
}
}
}
}
今までのトランプで作ったコードに少し手を加えるだけで出来ました。
13行目から17行目が画面に配置したラベルです。
43行目から49行目が、ボタンが押される度にカードが全部出ていない事にする、リセット部分です。毎回、最初の状態から配ります。
51行目からのループが5枚配る部分です。ここで、51行目からの外のループにも i 、59行目からの内のループにも i を使ってしまいました。Swiftではエラーになりませんが、言語によってはエラーになる場合があります。ここでの i は別物となりますが、紛らわしいので、内側のループには j を使った方が良さそうです。
//発生させた乱数分ループ
for j in 0 ... randInt {
//カードが既に出ていたらcard + 1
while check[card] {
card += 1
}
//jがrandIntに達していなければcard + 1
if j < randInt {
card += 1
}
}
83行目から97行目が、実際にカードを表示する部分です。
ラベルをプログラムで生成する版です。
//
// ViewController.swift
// Poker
//
// Created by 保 Tabei on 2024/10/03.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
//5枚分のラベルを配置する
for i in 0 ..< 5 {
//ラベルを生成する
let lbl = UILabel(frame: CGRectMake(0, 0, 50, 21))
//ラベルの中心を指定する
lbl.center = CGPointMake(100 + 50 * CGFloat(i), 250)
//ラベルのテキスト配置を中央にする
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) {
//リセット
//全カード出ていない事に
for i in 0 ..< EnumCard.Count {
check[i] = false
}
//残り枚数52枚
count = EnumCard.Count
//5枚引く
for i in 0 ..< 5 {
//今回引いたカードを特定する変数
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
//カード一時保持変数
var strCard: String
//ジョーカーの場合
if card == 52 {
strCard = "JK"
//ジョーカー以外の場合
} else {
//カード一時保持変数にマークとナンバーを保持
strCard = mark[card / 13] + number[card % 13]
}
//iの値によって表示位置にカード表示
eachCard[i].text = strCard
}
}
}
これは、解説の必要は無さそうですね。