新Swiftで行こう…第73回「ポーカー11解説」 田部井保
得点獲得部分です。
///役判定関数
func flush() {
//チェック変数
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
//チェック変数の値によりペア名を指定する
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 = ""
}
//ペアなら
if ck > 0 {
//ペアダイアログを表示
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
//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
}
}
}
//ストレート変数とりあえずストレートでない
var chk2 = false
//ロイヤル判定とりあえずロイヤルでない
var chk3 = false
//最大値と最小値の差が丁度4の時
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
}
}
//フラッシュ変数がtrueまたはストレート変数がtrue
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
//賭け点0
betPoint = 0
//点数表示
display()
}
ストレート、フラッシュの部分を分かり易くしました。
///役判定関数
func flush() {
//チェック変数
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
//チェック変数の値によりペア名を指定する
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 = ""
}
//ペアなら
if ck > 0 {
//ペアダイアログを表示
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
//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
}
}
}
//ストレート変数とりあえずストレートでない
var chk2 = false
//ロイヤル判定とりあえずロイヤルでない
var chk3 = false
//最大値と最小値の差が丁度4の時
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
}
//フラッシュ変数がtrueまたはストレート変数がtrue
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
//賭け点0
betPoint = 0
//点数表示
display()
}
分かり易くなりましたね。
もう少し変更しました。
///役判定関数
func flush() {
//チェック変数
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
//チェック変数の値によりペア名を指定する
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 = ""
}
//ペアなら
if ck > 0 {
//ペアダイアログを表示
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
//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
}
}
}
//メッセージ保持変数
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
}
//ストレート、フラッシュダイアログを表示
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
//賭け点0
betPoint = 0
//点数表示
display()
}
今回もそんなに難しくないと思います。