新Swiftで行こう…第76回「ポーカー14解説」 田部井保

目次 通常版

 yaku関数で、得点の他に役名を返すようにします。

    ///役判定関数
    func yaku() -> (Int, String) {
        //チェック変数
        var ck = 0
        //基準カード
        for i in 0 ..< 4 {
            //比較カード
            for j in i + 1 ..< 5 {
                //ナンバーが同じなら
                if eachCard[i].tag % 13 == eachCard[j].tag % 13 {
                    //チェック変数を+1する
                    ck += 1
                }
            }
        }
        //リターン倍率
        var mul = 0
        //役名
        var msg:String = ""
        //ペアなら
        if ck > 0 {
            //チェック変数の値によりペア名を指定する
            switch ck {
            case 1:
                //ワンペア
                mul = 1
                msg = "ワンペア"
            case 2:
                //ツーペア
                mul = 2
                msg = "ツーペア"
            case 3:
                //スリーカード
                mul = 3
                msg = "スリーカード"
            case 4:
                //フルハウス
                mul = 6
                msg = "フルハウス"
            case 6:
                //フォーカード
                mul = 8
                msg = "フォーカード"
            default:
                mul = 0
            }
        //ペア以外
        } else {
            //フラッシュ変数とりあえずフラッシュ
            var chk = true
            //1番目(0の位置)のマークを取得(0〜3)
            let mark: Int = eachCard[0].tag / 13
            //2番目から5番目の位置のマークと比較
            for i in 1 ..< 5 {
                //1番目のマークと2〜5番目のマークを比較して違っていたら
                if mark != eachCard[i].tag / 13 {
                    //フラッシュ変数をfalse(フラッシュではない)に
                    chk = false
                    //ループを終了
                    break
                }
            }
            //エースがあるか
            var isAce = false
            //キングがあるか
            var isKing = false
            //5枚のカードについて調べる
            for i in 0 ..< 5 {
                //エースがあったら
                if eachCard[i].tag % 13 == 0 {
                    isAce = true
                }
                //キングがあったら
                if eachCard[i].tag % 13 == 12 {
                    isKing = true
                }
            }
            //エースとキング両方あったらup変数をtrueに
            let up = isAce && isKing
            //最小値変数を宣言
            var min = 0
            //最大値変数を宣言
            var max = 0
            //1番目から5番目までループ
            for i in 0 ..< 5 {
                //変数にそのカードのナンバーを入れる
                var val = eachCard[i].tag % 13
                //エースとキング両方があった場合
                if up {
                    //4以下のカードに
                    if val < 4 {
                        //13加える
                        val = val + 13
                    }
                }
                //1番目ならmin,maxにvalを入れる
                if i == 0 {
                    min = val
                    max = val
                //2番目以降
                } else {
                    //変数が最小値より小さい時
                    if val < min {
                        //最小値を変数に
                        min = val
                    }
                    //変数が最大値より大きい時
                    if max < val {
                        //最大値を変数に
                        max = val
                    }
                }
            }
            //ストレートなら
            if max - min == 4 {
                //ロイヤルなら
                if max == 13 {
                    //フラッシュなら
                    if chk {
                        mul = 10
                        msg = "ロイヤルストレートフラッシュ"
                    //フラッシュでない
                    } else {
                        mul = 9
                        msg = "ロイヤルストレート"
                    }
                //ロイヤルでない
                } else {
                    //フラッシュなら
                    if chk {
                        mul = 7
                        msg = "ストレートフラッシュ"
                    //フラッシュでない
                    } else {
                        mul = 4
                        msg = "ストレート"
                    }
                }
            //ストレートでない
            } else {
                //フラッシュなら
                if chk {
                    mul = 5
                    msg = "フラッシュ"
                //フラッシュでない
                } else {
                    //ブタ
                    mul = 0
                    msg = "ブタ"
                }
            }
        }
        //倍率を返す
        return (mul, msg)
    }
    
    ///点数計算関数
    func flush() {
        //リターン倍率
        var mul = 0
        //メッセージ保持変数
        var msg: String
        //リターン倍率
        (mul, msg) = yaku()
        //タイトル保持変数
        var title: String
        //メッセージをタイトルに入れる
        title = msg
        //実際の倍率(リターン倍率 ー 配った時の役)
        var realMul = mul - beforeMul
        //マイナスは無い
        if realMul < 0 {
            realMul = 0
        }
        //ポイントに賭け点×実際の倍率を足す
        point = point + betPoint * realMul
        //賭け点0
        betPoint = 0

        //ポイントが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
        }
        //残り枚数52枚
        count = EnumCard.Count
        //5枚引く
        for i in 0 ..< 5 {
            //カードを引いてiの位置に出力する
            put(i: i)
        }
        //役判定
        //flush()
        //再配布ボタン有効
        btnRe.isEnabled = true
        //役名
        var msg:String
        //配った時の役を取得
        (beforeMul, msg) = yaku()
        //基準の役名、倍率を表示
        lblBefore.text = "基準:" + msg + ":" +  beforeMul.description
    }

 2行目で、Int型と String型を返す事を宣言しています。

    func yaku() -> (Int, String) {

 154行目で、倍率と役名を返しています。

        return (mul, msg)

 164行目で

        (mul, msg) = yaku()

 221行目で

        (beforeMul, msg) = yaku()

という様に、倍率と役名を受け取っています。

目次 通常版

コメントを残す

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

CAPTCHA