新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()
という様に、倍率と役名を受け取っています。