新Swiftで行こう…第28回「ポーカー13」 田部井保

目次 解説編

 さて、最初に出来ていた役分マイナスするという改造ですが、一つの例を示します。

 ラベルを一つ追加しました。ここで基準となる値を出すようにしました。最初からワンペアが出来ていたら1と出ます。

 以下ソースコードです。

//
//  ViewController.swift
//  Poker
//
//  Created by 保 Tabei on 2024/09/09.
//

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var btnRe: UIButton!
    @IBOutlet weak var lblPoint: UILabel!
    @IBOutlet weak var lblBet: UILabel!
    @IBOutlet weak var btnPlus: UIButton!
    @IBOutlet weak var btnMinus: UIButton!
    @IBOutlet weak var lblBefore: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        point = 10 
        betPoint = 0
        display()
        
        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 btn = UIButton(frame: CGRectMake(0, 0, 50, 21)) as UIButton
            btn.center = CGPointMake(100 + 50 * CGFloat(i), 300)
            btn.setTitle("off", for: .normal)
            btn.setTitleColor(UIColor.systemGray, for: .normal)
            btn.addTarget(self, action: #selector(btnTapped), for: .touchUpInside)
            btn.tag = i
            eachButton += [btn]
            self.view.addSubview(btn)
        }
    }

    @objc func btnTapped(sender: UIButton) {
        if sender.currentTitle == "off" {
            sender.setTitle("on", for: .normal)
            eachCard[sender.tag].text = "⬛️"
        } else {
            sender.setTitle("off", for: .normal)
            let card = eachCard[sender.tag].tag
            var strCard: String
            if card == 52 {
                strCard = "JK"
            } else {
                strCard = mark[card / 13] + number[card % 13]
            }
            eachCard[sender.tag].text = strCard
        }
    }
    
    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
    }
    
    var check: [Bool] = [Bool](repeating: false, count: EnumCard.Count)
    
    var count = EnumCard.Count

    var eachCard: [UILabel] = []
    
    var eachButton: [UIButton] = []

    func put(i: Int) {
        var card = 0
        let randInt = Int.random(in: 0 ..< count)
        for i in 0 ... randInt {
            while check[card] {
                card += 1
            }
            if i < randInt {
                card += 1
            }
        }
        check[card] = true
        count -= 1
        var strCard: String
        if card == 52 {
            strCard = "JK"
        } else {
            strCard = mark[card / 13] + number[card % 13]
        }
        eachCard[i].text = strCard
        eachCard[i].tag = card
    }

    func yaku() -> Int {
        var ck = 0
        for i in 0 ..< 5 {
            for j in i + 1 ..< 5 {
                if eachCard[i].tag % 13 == eachCard[j].tag % 13 {
                    ck += 1
                }
            }
        }
        var mul = 0
        if ck > 0 {
            switch ck {
            case 1:
                mul = 1
            case 2:
                mul = 2
            case 3:
                mul = 3
            case 4:
                mul = 6
            case 6:
                mul = 8
            default:
                mul = 0
            }
        } else {
            var chk = true
            var mark: Int = eachCard[0].tag / 13
            for i in 1 ..< 5 {
                if mark != eachCard[i].tag / 13 {
                    chk = false
                    break
                }
            }
            var min = 0
            var max = 0
            min = eachCard[0].tag % 13
            max = eachCard[0].tag % 13
            var isAce = false
            var isKing = false
            for i in 0 ..< 5 {
                if eachCard[i].tag % 13 == 0 {
                    isAce = true
                }
                if eachCard[i].tag % 13 == 12 {
                    isKing = true
                }
            }
            let up = isAce && isKing
            for i in 1 ..< 5 {
                var val = eachCard[i].tag % 13
                if up {
                    if val < 4 {
                        val = val + 13
                    }
                }
                if val < min {
                    min = val
                }
                if max < val {
                    max = val
                }
            }
            if max - min == 4 {
                if max == 13 {
                    if chk {
                        mul = 10
                    } else {
                        mul = 9
                    }
                } else {
                    if chk {
                        mul = 7
                    } else {
                        mul = 4
                    }
                }
            } else {
                if chk {
                    mul = 5
                } else {
                    mul = 0
                }
            }
        }
        return mul
    }
    
    func flush() {
        var title: String
        var msg: String = ""
        var mul = yaku()

        switch mul {
        case 1:
            msg = "ワンペア"
        case 2:
            msg = "ツーペア"
        case 3:
            msg = "スリーカード"
        case 6:
            msg = "フルハウス"
        case 8:
            msg = "フォーカード"
        case 10:
            msg = "ロイヤルストレートフラッシュ"
        case 9:
            msg = "ロイヤルストレート"
        case 7:
            msg = "ストレートフラッシュ"
        case 4:
            msg = "ストレート"
        case 5:
            msg = "フラッシュ"
        case 0:
            msg = "ブタ"
        default:
            msg = ""
        }
        title = msg
        var realMul: Int
        realMul = mul - beforeMul
        if realMul < 0 { 
            realMul = 0
        }
        point = point + betPoint * realMul
        betPoint = 0

        if point == 0 {
            title = "ゲームオーバー "
            msg = "ゲームオーバー "
            point = 10
        }
        let alert = UIAlertController()
        alert.title = title
        alert.message = msg + "です"
        alert.addAction(UIAlertAction(title: "OK", style: .default))
        present(alert, animated: true, completion: nil)
        display()
    }

    var beforeMul = 0

    @IBAction func btnGoTouch(_ sender: Any) {
        for i in 0 ..< EnumCard.Count {
            check[i] = false
        }
        count = EnumCard.Count
        for i in 0 ..< 5 {
            put(i: i)
        }
        btnRe.isEnabled = true
        beforeMul = yaku()
        lblBefore.text = "基準" + beforeMul.description
    }
    
    @IBAction func btnReTouch(_ sender: Any) {
        btnRe.isEnabled = false
        for i in 0 ..< 5 {
            if eachButton[i].currentTitle == "on" {
                put(i: i)
                eachButton[i].setTitle("off", for: .normal)
            }
        }
        flush()
    }

    var point = 0
    var betPoint = 0
    
    func display() {
        lblPoint.text = point.description
        lblBet.text = betPoint.description
    }
    
    @IBAction func btnPlusTouch(_ sender: Any) {
        if point > 0 {
            point -= 1
            betPoint += 1
        }
        display()
    }
    
    @IBAction func btnMinusTouch(_ sender: Any) {
        if betPoint > 0 {
            betPoint -= 1
            point += 1
        }
        display()
    }
}

 ゲームの難易度が高くなり緊張感が出て来ました。さて次回はyaku関数で得点の他に役名を返すようにしたいと思います。

 バグがありました。第23回「ポーカー8」の最後の方を参照して下さい。

目次 解説編

コメントを残す

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

CAPTCHA