新Swiftで行こう…第12回「トランプ2」 田部井保

目次 解説編

 前回の問題はJKを出すというものでした。
 前回の問題の一つの答えです。やり方はいろいろあると思います。

//
//  ViewController.swift
//  Card
//
//  Created by 保 Tabei on 2024/09/01.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var lblCard: 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"]

    @IBAction func btnGoTouch(_ sender: Any) {
        let card = Int.random(in: 0 ..< 53)
        
        if card == 52 {
            lblCard.text = "JK"
        } else {
            lblCard.text = mark[card / 13] + number[card % 13]
        }
    }
}

 実行してみましょう。JKが出て来ますか?ここで、

        let card = Int.random(in: 0 ..< 53)

の部分が52から53になって、JKの分が足されている点に注意して下さい。

 トランプは、一度使われると基本的にもう出て来ません。このままだと、同じカードが何度も出て来てしまいます。一度使ったカードはもう出ないようにします。

//
//  ViewController.swift
//  Card
//
//  Created by 保 Tabei on 2024/09/01.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var lblCard: 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"]

    var check = [Bool](repeating: false, count: 53)
    
    @IBAction func btnGoTouch(_ sender: Any) {
        var card:Int
        repeat {
            card = Int.random(in: 0 ..< 53)
        } while check[card]
        
        check[card] = true
                    
        if card == 52 {
            lblCard.text = "JK"
        } else {
            lblCard.text = mark[card / 13] + number[card % 13]
        }
    }
}

 ここで53(あるいは52)が何箇所かに出ています。定数を使って、数を切り替える時、一箇所変えれば良いようにします。普通に変数varでなく定数letで定義すれば良いのかと思っていたら、それだと

    var check = [Bool](repeating: false, count: 53)

の部分でエラーが出てしまいます。webの記事を読んで解決しました。しかし、もっと良い解決方法があるかも知れません。

//
//  ViewController.swift
//  Card
//
//  Created by 保 Tabei on 2024/09/01.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var lblCard: 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 = 53
    }
    
    var check: [Bool] = [Bool](repeating: false, count: EnumCard.Count)
    
    @IBAction func btnGoTouch(_ sender: Any) {
        var card:Int
        repeat {
            card = Int.random(in: 0 ..< EnumCard.Count)
        } while check[card]
        
        check[card] = true
                    
        if card == EnumCard.Count - 1 {
            lblCard.text = "JK"
        } else {
            lblCard.text = mark[card / 13] + number[card % 13]
        }
    }
}

 このコードには問題があります。53枚出た後、どうなるでしょう。無限にループを繰り返しプログラムが先に進まなくなります。こういうのを無限ループと言います。無限ループになりそうな時には、カードを使ったかどうかの配列をクリアするように出来ないか考えてみて下さい。これは結構難しい問題だと思います。

目次 解説編

コメントを残す

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

CAPTCHA