作業:骰子賭大小

遊戲規則:

  1. 選擇要下多少賭注(也可以選擇不下賭注,即賭注為0),若所選籌碼超過本金會提示本金不足。
  2. 選好後要按押注鈕,鎖定金額後不可在操作下注相關按鈕,然後按開始遊戲
  3. 可以選買小(3~10)或買大(11~18)(只能擇一)
  4. 破產後可重新開始遊戲,本金回到3000

程式碼:

import UIKit
import AVFoundation
class ViewController: UIViewController {@IBOutlet weak var playerMoneyLable: UILabel!
@IBOutlet weak var betLable: UILabel!
@IBOutlet weak var bigSmallControl: UISegmentedControl!
@IBOutlet var diceViews: [UIImageView]!
@IBOutlet weak var startBetBtn: UIButton!
@IBOutlet weak var cancelBtn: UIButton!
@IBOutlet weak var allInBtn: UIButton!
@IBOutlet var chipsBtns: [UIButton]!
var player: AVPlayer?
//骰子點數
let diceNumbers = Array(1...6)
//下注金額
var bet = 0
//玩家本金
var playerMoney = 3000
//骰子總點數
var diceTotal = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
betLable.text = "下注:\(bet)"
playerMoneyLable.text = "$:\(playerMoney)"
}
//跳出訊息的Function
func addAlert(title: String, message: String, btnTitle: String = "OK"){
let controler = UIAlertController(title: title, message: message, preferredStyle: .alert)
let okAction = UIAlertAction(title: btnTitle, style: .default)
controler.addAction(okAction)
present(controler, animated: true)
}
//加入選轉動畫的Function
func addAnimation(diceImageView: UIImageView){
let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation")
rotateAnimation.fromValue = 0
rotateAnimation.toValue = CGFloat.pi * 4
rotateAnimation.duration = 0.5
diceImageView.layer.add(rotateAnimation, forKey: nil)
}
//加入音效的Function
func voice(){
let url = Bundle.main.url(forResource: "骰子聲", withExtension: "mp3")!
player = AVPlayer(url: url)
player?.play()
}
//切換按鈕能否操作的Function
func btnEnableChange(choose: Bool){
startBetBtn.isEnabled = choose
cancelBtn.isEnabled = choose
allInBtn.isEnabled = choose
for i in 0...2{
chipsBtns[i].isEnabled = choose
}
}
//確定押注
@IBAction func startBet(_ sender: Any) {
//確定下注,玩家本金扣除下注金額
playerMoney = playerMoney - bet
//押注後不可操作籌碼相關按鈕
btnEnableChange(choose: false)
//顯示玩家剩餘本金
playerMoneyLable.text = "$:\(playerMoney)"
}
//取消(用於玩家下錯籌碼時)
@IBAction func cancel(_ sender: Any) {
bet = 0
betLable.text = "下注:\(bet)"
}
//籌碼按鈕
@IBAction func chips(_ sender: UIButton) {
//判斷本金不得小於下注籌碼
if bet + sender.tag <= playerMoney{
bet = bet + sender.tag
betLable.text = "下注:\(bet)"
}else{
//小於時,跳出警告視窗
addAlert(title: "本金不足!", message: "請重試!")
}

}
//All In
@IBAction func allIn(_ sender: UIButton) {
bet = playerMoney
betLable.text = "下注:\(bet)"
}

//開始按鈕
@IBAction func startBtn(_ sender: Any) {
var resultTitle = ""
var resultMessage = ""
//先判斷是否押注完成,未完成,跳出警告
if startBetBtn.isEnabled == true{
addAlert(title: "抱歉!", message: "您尚未押注,無法進行遊戲")
}else{
voice()
//迴圈產生隨機點數
for diceView in diceViews{
addAnimation(diceImageView: diceView)
let diceNumber = diceNumbers.randomElement()!
diceView.image = UIImage(named: "dice\(diceNumber)")
//計算骰子總點數
diceTotal += diceNumber
}
//玩家賭大的情況
if bigSmallControl.selectedSegmentIndex == 0 {
//小於11點判斷為輸
if diceTotal < 11 {
resultTitle = "哎呀!"
resultMessage = "\(diceTotal)點小,輸了\(bet)"
bet = 0
}else{
//大於等於11判斷為贏
resultTitle = "恭喜!"
resultMessage = "\(diceTotal)點大,贏了\(bet)"
bet *= 2
}

//玩家賭小的情況
}else if bigSmallControl.selectedSegmentIndex == 1{
//小於11點判斷為贏
if diceTotal < 11 {
resultTitle = "恭喜!"
resultMessage = "\(diceTotal)點小,贏了\(bet)"
bet *= 2
}else{
//大於等於11點判斷為輸
resultTitle = "哎呀!"
resultMessage = "\(diceTotal)點大,輸了\(bet)"
bet = 0
}
}
playerMoney += bet

//判斷玩家本金歸零時顯示破產,並重新開始
if playerMoney == 0 {
addAlert(title: "GAME OVER", message: "\(resultMessage)!破產了QQ!", btnTitle: "重新開始")
playerMoney = 3000
}else{
addAlert(title: resultTitle, message: resultMessage)
}

//每局結束,賭金歸零,更新玩家本金,重計骰子總點數,切換按鈕
bet = 0
playerMoneyLable.text = "$:\(playerMoney)"
betLable.text = "下注:\(bet)"
diceTotal = 0
btnEnableChange(choose: true)
}

}

}

在判斷本金是否歸零的部分,應該有個比較合理的寫法,就是關於UIAlert按下重新開始按鈕會執行閉包內程式的寫法,但我目前還看不太懂,所以暫時先跳過😅

Github:

參考文章:

--

--