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

 これは、解説の必要は無さそうですね。

目次 通常版

コメントを残す

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

CAPTCHA