Swiftで行こう…第10回「トランプ2」(もちゃち)

2014-11-01

目次ページへ

ーーーMavericks Xcode6.1ーーー
M010-01
前回の問題の一つの答えです。やり方はいろいろあると思います。
import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var lblCard: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    let mark: [String] = ["♣️","♦️","♥️","♠️"]
    let number: [String] = ["A","2","3","4","5","6","7","8","9","T","J","Q","K"]

    @IBAction func btnGoTouch(sender: AnyObject) {
        var card = Int(arc4random_uniform(53))

        if card == 52 {
            lblCard.text = "JK"
        } else {
            lblCard.text = mark[card / 13] + number[card % 13]
        }
    }
}

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

        var card = Int(arc4random_uniform(53))
の部分が52から53になって、JKの分が足されている点に注意して下さい。
M010-02
トランプは、一度使われると基本的にもう出て来ません。このままだと、同じカードが何度も出て来てしまいます。一度使ったカードはもう出ないようにします。
以下にコードを示します。
import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var lblCard: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    let mark: [String] = ["♣️","♦️","♥️","♠️"]
    let number: [String] = ["A","2","3","4","5","6","7","8","9","T","J","Q","K"]
    var check: [Bool] = [Bool](count: 53, repeatedValue: false)

    @IBAction func btnGoTouch(sender: AnyObject) {
        var card: Int
        do {
            card = Int(arc4random_uniform(53))
        } while check[card]

        check[card] = true

        if card == 52 {
            lblCard.text = "JK"
        } else {
            lblCard.text = mark[card / 13] + number[card % 13]
        }
    }
}
ここで、
        var card: Int
の部分、Xcode6.0.1では、
        var card
だけでエラーにならなかったのですが、Xcode6.1ではエラーとなるようです。
M010-3
ここで53(あるいは52)が何箇所かに出ています。定数を使って数を切り替える時、一箇所変えれば良いようにします。
ここで、
    var check: [Bool] = [Bool](count: 53, repeatedValue: false)
の53を定数に置き換えられませんでした。そこで仕方なく、空の配列を用意して、最初にfalseで53個配列に追加するという方法を取りました。
以下にコードを示します。
import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var lblCard: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        for i in 0 ..< cardCount {
            check += [false]
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    let mark: [String] = ["♣️","♦️","♥️","♠️"]
    let number: [String] = ["A","2","3","4","5","6","7","8","9","T","J","Q","K"]
    let cardCount: UInt32 = 53
    var check: [Bool] = []

    @IBAction func btnGoTouch(sender: AnyObject) {
        var card = 0
        do {
            card = Int(arc4random_uniform(cardCount))
        } while check[card]

        check[card] = true

        if card == cardCount - 1 {
            lblCard.text = "JK"
        } else {
            lblCard.text = mark[card / 13] + number[card % 13]
        }
    }
}
このコードには問題があります。53枚出た後、どうなるでしょう。無限にループを繰り返しプログラムが先に進まなくなります。こういうのを無限ループと言います。無限ループになる場合は、カードを使ったかどうかの配列をクリアするように出来ないか考えてみて下さい。これは結構難しい問題だと思います。
ーーーMavericks Xcode6.0.1ーーー

さて前回の問題の一つの答えです。やり方はいろいろあると思います。

010-01

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

010-02

ここで53(あるいは52)が何箇所かに出ています。定数を使って数を切り替える時、一箇所変えれば良いようにします。ここで、
var check: [Bool] = [Bool](count: 53, repeatedValue: false)
の53を定数に置き換えられませんでした。そこで仕方なく、空の配列を用意して、最初にfalseで53個配列に追加するという方法を取りました。

010-03

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

目次ページへ

Since1991 © Shimayugu All Rights Reserved.
アップルおよびアップルのロゴは、米国および他の国々で登録されたApple Inc.の商標です。
湘南マッキントッシュユーザーズグループは、独立したユーザグループで、Apple Japan合同会社が権限を与えた団体、支援する団体、またはその他に承認する団体ではありません。