作業 BlackJack 遊戲製作
Published in
11 min readMar 28, 2023
Blackjack 在賭場為了防止人算牌,其實不只用一副牌,可能是四副,所以判斷式可能要依用牌數去決定。因為昨天已經做過卡牌10點半,今天就延用同一個場景,主要的功能改用 class 製作。
主要規則先各發二張牌,莊家只秀一張,玩家補到爆就莊家勝,誰拿到Blackjack誰就勝不必補,一起拿到Blackjack就平手,莊家至少要到17點才可以跟玩家,分數高的就 Winner!
//
// BlackJack
// 0327Storyboard21
//
// Created by RickKikiDevelope on 2023/3/27.
//
import UIKit
class HandOfCards {
let MaxCard = 7
let MinRequire = 17
var cardIndex = 0
var cards = Array<Int?>(repeating:nil , count: 7)
var isBlackJack = false
func GetACard() -> Int { // 以後要檢查不重覆的牌
return Int.random(in: 1...52)
}
func resetAll() {
isBlackJack = false
cards.removeAll()
cards = Array<Int?>(repeating:nil , count: 7)
cardIndex = 0
}
func AutoAdd() {
while (!isBusted() && (bestScore() < MinRequire) && (cardIndex < MaxCard) ) {
cards[cardIndex] = GetACard()
cardIndex += 1
}
}
func GetFirst2Cards() {
resetAll()
cards[0] = GetACard()
cards[1] = GetACard()
cardIndex = 2
if (point(cards[0]!) == 1 && point(cards[1]!) == 10) || (point(cards[0]!) == 10 && point(cards[1]!) == 1) {
isBlackJack = true
}
}
func point(_ card : Int) -> Int {
let n = card % 13
switch n {
case 0,10,11,12 :
return 10
default :
return n
}
}
func getOne () {
if cardIndex < MaxCard {
cards[cardIndex] = GetACard()
cardIndex += 1
}
}
func bestScore() -> Int {
let points = Points()
var score = 0
for point in points { // 任一個點數少於21就可以
if (score < point) && (point <= 21) {
score = point
}
}
return score
}
func isBusted() -> Bool {
let points = Points()
var bust = true
for point in points { // 任一個點數少於21就可以
bust = bust && (point>21)
}
return bust
}
func Points () -> [Int] {
var pointArray : [Int] = []
var index = 1
var single : Int = 0
var aced = false
pointArray.append(0)
for i in 0 ..< cardIndex {
for j in 0 ..< index {
if let card=cards[i] {
single = point (card)
pointArray[j] += single
if single == 1 && !aced {
aced = true
pointArray.append(pointArray[j] + 10)
index += 1
}
}
}
}
return pointArray
}
}
class ViewController: UIViewController {
let DealerHand = HandOfCards()
let PlayerHand = HandOfCards()
@IBOutlet weak var DealerScore: UILabel!
@IBOutlet weak var PlayerScore: UILabel!
@IBOutlet var CardHomeImages: [UIImageView]!
@IBOutlet var CardBossImages: [UIImageView]!
@IBOutlet weak var CombatButton: UIButton!
@IBOutlet weak var MoreCard: UIButton!
@IBOutlet weak var NewGameButton: UIButton!
@IBOutlet weak var HomeInfo: UILabel!
@IBOutlet weak var BossInfo: UILabel!
func combat() {
autoAddBossCards()
ShowDealerCards(hideOne: false, cards: DealerHand.cards)
let dealerScore = DealerHand.bestScore()
let playerScore = PlayerHand.bestScore()
if dealerScore == playerScore {
HomeInfo.text = " Tie "
} else if dealerScore > playerScore {
HomeInfo.text = " Dealer wins!"
} else {
HomeInfo.text = " Player wins!"
}
NewGameButton.isEnabled = true
CombatButton.isEnabled = false
MoreCard.isEnabled = false
}
@IBAction func Combat(_ sender: Any) {
combat()
}
func autoAddBossCards() {
DealerHand.AutoAdd()
}
func ResetAll () {
CombatButton.isEnabled = false
MoreCard.isEnabled = false
NewGameButton.isEnabled = true
}
override func viewDidLoad() {
super.viewDidLoad()
ResetAll()
}
@IBAction func MoreCard(_ sender: Any) {
PlayerHand.getOne()
ShowPlayerCards(cards: PlayerHand.cards)
if PlayerHand.isBusted() {
HomeInfo.text = " Busted "
MoreCard.isEnabled = false
CombatButton.isEnabled = false
NewGameButton.isEnabled = true
ShowDealerCards(hideOne : false, cards: DealerHand.cards)
} else {
if PlayerHand.bestScore() == 21 {
combat()
} else {
PlayerScore.text! = "\(PlayerHand.bestScore())"
}
}
}
func ShowDealerCards ( hideOne : Bool, cards: [Int?]) {
for i in 0 ..< cards.count {
if let card = cards[i] {
if hideOne && i == 0 {
CardBossImages[i].image = UIImage(named: "53") //
} else {
CardBossImages[i].image = UIImage(named: "\(card)")
}
}
}
if hideOne {
DealerScore.text = ""
} else {
if DealerHand.isBusted() {
DealerScore.text = "Busted"
} else {
DealerScore.text = "\(DealerHand.bestScore())"
}
}
}
func ShowPlayerCards ( cards: [Int?]) {
for i in 0 ..< cards.count {
if let card = cards[i] {
CardHomeImages[i].image = UIImage(named: "\(card)")
}
}
PlayerScore.text = "\(PlayerHand.bestScore())"
}
func ClearScreen (){
for i in 0 ..< CardHomeImages.count {
CardHomeImages[i].image = UIImage()
}
for i in 0 ..< CardBossImages.count {
CardBossImages[i].image = UIImage()
}
HomeInfo.text = "Player"
BossInfo.text = "Dealer"
DealerScore.text = ""
PlayerScore.text = ""
}
@IBAction func NewGame(_ sender: Any) {
DealerHand.GetFirst2Cards()
PlayerHand.GetFirst2Cards()
ClearScreen()
ShowDealerCards(hideOne : true, cards: DealerHand.cards)
ShowPlayerCards(cards: PlayerHand.cards)
if DealerHand.isBlackJack {
DealerScore.text! = " Blackjack "
ShowDealerCards(hideOne: false, cards: DealerHand.cards)
if PlayerHand.isBlackJack {
PlayerScore.text! = " Blackjack "
HomeInfo.text = "Tie"
} else {
BossInfo.text = " Dealer Wins!"
}
} else if PlayerHand.isBlackJack {
PlayerScore.text! = " Blackjack "
ShowDealerCards(hideOne: false, cards: DealerHand.cards)
HomeInfo.text = " Player Wins!"
} else {
MoreCard.isEnabled = true
CombatButton.isEnabled = true
NewGameButton.isEnabled = false
}
}
}