新Swiftで行こう…第27回「ポーカー12」 田部井保
さて、ゲームオーバーの表示ですが、僕は最初、単純にflush関数の最後に入れました。するとゲームオーバーと出た後にブタと出てしまいます。そこでdisplay関数にいれようと思い入れてみると、点を賭けている時に元の点が0になるとゲームオーバーの表示が出てしまいます。考えてみれば当たり前ですね。馬鹿な事をしました。そこでflush関数のメッセージ表示部分、ペアとペア以外で分かれていますが、これを一つにして、ここでゲームオーバーも表示するようにする事にしました。この改造をやってみると、結構すっきりしました。そもそもメッセージ表示部分が二つに分かれていたのが問題でした。これは順番にまずフラッシュを入れて、ペアを入れてとやったので2つに分かれていました。
以下flush関数のソースコードです。
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 title: String
var msg: String = ""
var mul = 0
if ck > 0 {
//var msg: String
title = "ペア"
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 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)
title = msg
}
point = point + betPoint * mul
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()
}
さて、これでゲームをやってみると判るのですが、配られた時に既にワンペアが出来ていた場合、ワンペアの所を残せば、賭け点を全部賭けても必ず還ってくるので絶対に損はしません。もっと大きな役が出来ていたら必ず得をします。そこで、最初配られたカードで出来ていた役を0倍として、それより上の役が出来たらその倍数から、配られたカードで出来ていた役の倍数を引いて得点とするようにします。分かりにくいので例を示すと、最初ツーペアが出来ていて、1枚替えてフルハウスになったとします。ツーペアの倍数は2、フルハウスの倍数は6なので、6から2を引いて4倍となります。この改造をやってみて下さい。
バグがありました。第23回「ポーカー8」の最後の方を参照して下さい。