新Swiftで行こう…第31回「ポーカー16」 田部井保
今回はCardクラスのジョーカー対応です。
以下ソースコードです。
Cardクラス
//
// CardClass.swift
// Poker
//
// Created by 保 Tabei on 2024/09/15.
//
import Foundation
class Card {
let mark: [String] = ["♣️","♦️","❤️","♠️"]
let number: [String] = ["A","2","3","4","5","6","7","8","9","T","J","Q","K"]
enum EnumCard: Int {
case nonJoker = 52
case joker = 53
}
var cardCount = 0
var check: [Bool] = []
var count = 0
init(cdCnt: EnumCard) {
cardCount = cdCnt.rawValue
for _ in 0 ..< cardCount {
check += [false]
}
count = cardCount
}
func reset() {
for i in 0 ..< cardCount {
check[i] = false
}
count = cardCount
}
func put() -> (String?, Int) {
var card = 0
let randInt = Int.random(in: 0 ..< count)
for i in 0 ... randInt {
while check[card] {
card += 1
}
if i < randInt {
card += 1
}
}
check[card] = true
count -= 1
var strCard: String?
if card == 52 {
strCard = "JK"
} else {
strCard = mark[card / 13] + number[card % 13]
}
return(strCard, card)
}
func disp(card: Int) -> String {
var strCard: String
if card == 52 {
strCard = "JK"
} else {
strCard = mark[card / 13] + number[card % 13]
}
return strCard
}
}
メインクラス
//
// ViewController.swift
// Poker
//
// Created by 保 Tabei on 2024/09/09.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var btnRe: UIButton!
@IBOutlet weak var lblPoint: UILabel!
@IBOutlet weak var lblBet: UILabel!
@IBOutlet weak var btnPlus: UIButton!
@IBOutlet weak var btnMinus: UIButton!
@IBOutlet weak var lblBefore: UILabel!
var cardObj:Card = Card(cdCnt: Card.EnumCard.nonJoker)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
point = 10
betPoint = 0
display()
for i in 0 ..< 5 {
let lbl = UILabel(frame: CGRectMake(0, 0, 50, 21))
lbl.center = CGPointMake(100 + 50 * CGFloat(i), 250)
lbl.textAlignment = NSTextAlignment.center
lbl.text = "⬛️"
eachCard += [lbl]
self.view.addSubview(lbl)
let btn = UIButton(frame: CGRectMake(0, 0, 50, 21)) as UIButton
btn.center = CGPointMake(100 + 50 * CGFloat(i), 300)
btn.setTitle("off", for: .normal)
btn.setTitleColor(UIColor.systemGray, for: .normal)
btn.addTarget(self, action: #selector(btnTapped), for: .touchUpInside)
btn.tag = i
eachButton += [btn]
self.view.addSubview(btn)
}
}
@objc func btnTapped(sender: UIButton) {
if sender.currentTitle == "off" {
sender.setTitle("on", for: .normal)
eachCard[sender.tag].text = "⬛️"
} else {
sender.setTitle("off", for: .normal)
let card = eachCard[sender.tag].tag
var strCard: String
if card == 52 {
strCard = "JK"
} else {
strCard = cardObj.disp(card: card)
}
eachCard[sender.tag].text = strCard
}
}
var eachCard: [UILabel] = []
var eachButton: [UIButton] = []
func yaku() -> (Int, String) {
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
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
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:Bool = false
var isKing:Bool = 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
}
}
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: Int
realMul = mul - beforeMul
if realMul < 0 {
realMul = 0
}
point = point + betPoint * realMul
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()
}
var beforeMul = 0
@IBAction func btnGoTouch(_ sender: Any) {
cardObj.reset()
for i in 0 ..< 5 {
(eachCard[i].text, eachCard[i].tag) = cardObj.put()
}
btnRe.isEnabled = true
var msg:String
(beforeMul, msg) = yaku()
lblBefore.text = "基準:" + msg + ":" + beforeMul.description
}
@IBAction func btnReTouch(_ sender: Any) {
btnRe.isEnabled = false
for i in 0 ..< 5 {
if eachButton[i].currentTitle == "on" {
(eachCard[i].text, eachCard[i].tag) = cardObj.put()
eachButton[i].setTitle("off", for: .normal)
}
}
flush()
}
var point = 0
var betPoint = 0
func display() {
lblPoint.text = point.description
lblBet.text = betPoint.description
}
@IBAction func btnPlusTouch(_ sender: Any) {
if point > 0 {
point -= 1
betPoint += 1
}
display()
}
@IBAction func btnMinusTouch(_ sender: Any) {
if betPoint > 0 {
betPoint -= 1
point += 1
}
display()
}
}
さて、続いてポーカーゲームのジョーカー対応と行きたい所ですが、これは結構難しいと思われるので、次回からはポーカーを離れてババ抜きに行きたいと思います。Cardクラスのジョーカー対応をしたので、このクラスを使って実現したいと思います。
バグがありました。第23回「ポーカー8」の最後の方を参照して下さい。