新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」の最後の方を参照して下さい。