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

目次 解説編

 得点獲得部分です。
 得点案です。

ワンペア…1倍
ツーペア…2倍
スリーカード…3倍
ストレート…4倍
フラッシュ…5倍
フルハウス…6倍
ストレートフラッシュ…7倍
フォーカード…8倍
ロイヤルストレート…9倍
ロイヤルストレートフラッシュ…10倍

以下、変更部分のソースコードです。

    func flush() {
        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 {
            var msg: String
            switch ck {
            case 1:
                msg = "ワンペア"
                mul = 1
            case 2:
                msg = "ツーペア"
                mul = 2
            case 3:
                msg = "スリーカード"
                mul = 3
            case 4:
                msg = "フルハウス"
                mul = 6
            case 6:
                msg = "フォーカード"
                mul = 8
            default:
                msg = ""
            }
            let alert = UIAlertController()
            alert.title = "ペア"
            alert.message = msg + "です"
            alert.addAction(UIAlertAction(title: "OK", style: .default))
            present(alert, animated: true, completion: nil)
        } else {
            var chk = true
            let 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
                }
            }
            var chk2 = false
            var chk3 = false
            if max - min == 4 {
                chk2 = true
                if max == 13 {
                    chk3 = true
                }
            }
            var msg: String = ""
            if chk3 {
                msg = "ロイヤル"
            }
            if chk2 {
                msg += "ストレート"
            }
            if chk {
                msg += "フラッシュ"
            }
            if chk2 { 
                if chk {
                    if chk3 {
                        mul = 10
                    } else {
                        mul = 7
                    }
                } else {
                    if chk3 {
                        mul = 9
                    } else {
                        mul = 4
                    }
                }
            } else {
                if chk {
                    mul = 5
                }
            }
            if (chk || chk2) {
                let alert = UIAlertController()
                alert.title = msg
                alert.message = msg + "です"
                alert.addAction(UIAlertAction(title: "OK", style: .default))
                present(alert, animated: true, completion: nil)
            }
        }
        point = point + betPoint * mul 
        betPoint = 0
        display()
    }

 ここで、ペアの判定は良かったのですが、ストレート、フラッシュの判定で、コードが短くなるようにした工夫が結局分かりにくくなってしまいました。分かり易く直します。 以下問題の部分のソースコードです。

    func flush() {
        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 {
            var msg: String
            switch ck {
            case 1:
                msg = "ワンペア"
                mul = 1
            case 2:
                msg = "ツーペア"
                mul = 2
            case 3:
                msg = "スリーカード"
                mul = 3
            case 4:
                msg = "フルハウス"
                mul = 6
            case 6:
                msg = "フォーカード"
                mul = 8
            default:
                msg = ""
            }
            let alert = UIAlertController()
            alert.title = "ペア"
            alert.message = msg + "です"
            alert.addAction(UIAlertAction(title: "OK", style: .default))
            present(alert, animated: true, completion: nil)
        } else {
            var chk = true
            let 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
                }
            }
            var chk2 = false
            var chk3 = false
            if max - min == 4 {
                chk2 = true
                if max == 13 {
                    chk3 = true
                }
            }
            var msg: String = ""
            if chk3 {
                msg = "ロイヤル"
            }
            if chk2 {
                msg += "ストレート"
            }
            if chk {
                msg += "フラッシュ"
            }
            if msg == "ストレート" {
                mul = 4
            } else if msg == "フラッシュ" {
                mul = 5
            } else if msg == "ストレートフラッシュ" {
                mul = 7
            } else if msg == "ロイヤルストレート" {
                mul = 9
            } else if msg == "ロイヤルストレートフラッシュ" {
                mul = 10
            }
            if (chk || chk2) {
                let alert = UIAlertController()
                alert.title = msg
                alert.message = msg + "です"
                alert.addAction(UIAlertAction(title: "OK", style: .default))
                present(alert, animated: true, completion: nil)
            }
        }
        point = point + betPoint * mul 
        betPoint = 0
        display()
    }

 ソースコードを見ていたら、chk2、chk3を使わなくても済みそうです。それから役が出来なかった時に”ブタ”と表示した方が良さそうです。以下ソースコードです。

    func flush() {
        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 {
            var msg: String
            switch ck {
            case 1:
                msg = "ワンペア"
                mul = 1
            case 2:
                msg = "ツーペア"
                mul = 2
            case 3:
                msg = "スリーカード"
                mul = 3
            case 4:
                msg = "フルハウス"
                mul = 6
            case 6:
                msg = "フォーカード"
                mul = 8
            default:
                msg = ""
            }
            let alert = UIAlertController()
            alert.title = "ペア"
            alert.message = msg + "です"
            alert.addAction(UIAlertAction(title: "OK", style: .default))
            present(alert, animated: true, completion: nil)
        } else {
            var chk = true
            let 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
                }
            }
            //var chk2 = false
            //var chk3 = false
            //if max - min == 4 {
            //    chk2 = true
            //    if max == 13 {
            //        chk3 = true
            //    }
            //}
            var msg: String = ""
            if max - min == 4 && max == 13 {
                msg = "ロイヤル"
            }
            if max - min == 4 {
                msg += "ストレート"
            }
            if chk {
                msg += "フラッシュ"
            }
            if msg == "ストレート" {
                mul = 4
            } else if msg == "フラッシュ" {
                mul = 5
            } else if msg == "ストレートフラッシュ" {
                mul = 7
            } else if msg == "ロイヤルストレート" {
                mul = 9
            } else if msg == "ロイヤルストレートフラッシュ" {
                mul = 10
            } else {
                msg = "ブタ"
                mul = 0
            }
            //if (chk || chk2) {
                let alert = UIAlertController()
                alert.title = msg
                alert.message = msg + "です"
                alert.addAction(UIAlertAction(title: "OK", style: .default))
                present(alert, animated: true, completion: nil)
            //}
        }
        point = point + betPoint * mul 
        betPoint = 0
        display()
    }

 これで結構完成度が高くなりました。後は、得点が0になったらゲームオーバーとするくらいでしょうか。試しにゲームオーバーを入れてみたら、色々問題がありそうです。何とか上手く入れる方法を考えてみて下さい。

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

目次 解説編

コメントを残す

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

CAPTCHA