Swiftで行こう…第31回「ババ抜き2」(もちゃち)

2015-01-31

目次ページへ

ーーーYosemite Xcode6.1.1ーーー
今回は、実際にカードを配ろうと思います。ここで裏のままだと、どのようにカードが配られたか判らないので、今は表を表示しようと思います。

031-01

031-02

以下ソースコードです。

import UIKit

class ViewController: UIViewController {

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

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

    var eachCard: [[UILabel]] = [[],[],[],[]]
    var cardObj:Card = Card(cdCnt: Card.CardSum.joker)
    
    func put53() {
        for i in 0 ..< 4 {
            for j in 0 ..< 14 {
                var lbl = UILabel(frame: CGRectMake(0, 0, 50, 21))
                lbl.center = CGPointMake(50 + 40 * CGFloat(j % 7), 50 + 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: AnyObject) {
        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関数を呼び出すとした方が良さそうです。
そのように改造します。

031-03

031-04

031-05

031-06

以下CardClassのソースコード。

import Foundation

class Card {
    enum CardSum : Int {
        case nonJoker = 52
        case joker = 53
    }
    
    let mark: [String] = ["♣️","♦️","♥️","♠️"]
    let number: [String] = ["A","2","3","4","5","6","7","8","9","T","J","Q","K"]
    var cardCount = CardSum.nonJoker.rawValue
    var check: [Bool] = []
    var count = 0
    
    init(cdCnt: CardSum) {
        cardCount = cdCnt.rawValue
        for i in 0 ..< cardCount {
            check += [false]
        }
        count = cardCount
    }
    
    func reset() {
        for i in 0 ..< cardCount {
            check[i] = false
        }
        count = cardCount
    }
    
    func put() -> Int {
        var card: Int = 0
        var randInt = Int(arc4random_uniform(UInt32(count)))
        for i in 0 ... randInt {
            while check[card] {
                card++
            }
            if i < randInt {
                card++
            }
        }
        check[card] = true
        
        count--
        
        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
    }
}

以下メインプログラムのソースコード。

import UIKit

class ViewController: UIViewController {

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

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

    var eachCard: [[UILabel]] = [[],[],[],[]]
    var cardObj:Card = Card(cdCnt: Card.CardSum.joker)
    
    func put53() {
        for i in 0 ..< 4 {
            for j in 0 ..< 14 {
                var lbl = UILabel(frame: CGRectMake(0, 0, 50, 21))
                lbl.center = CGPointMake(50 + 40 * CGFloat(j % 7), 50 + 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: AnyObject) {
        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(eachCard[i][j].tag)
                }
            }
        }
    }
    
}

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

目次ページへ

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