作業 BlackJack 遊戲製作

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
}

}

}

--

--