#2 撲克牌(桌遊) App:抽鬼牌
Published in
5 min readMar 22, 2021
(一)操作畫面GIF
(二) Github連結
(三)文字說明
這次的作業我選的是抽鬼牌這個卡牌遊戲,用到了許多在課堂上教到的SwitftUI的語法和新的元件,也額外加入了動畫和背景音樂,雖然抽鬼牌的邏輯看似不難,但一些邏輯像是選擇下個抽牌玩家,判斷輸贏,棄牌演算法等還是需要一些時間來撰寫的,此作業也花了我不少時間來完成,算是有挑戰性的題目。
(四)重點程式碼講解
抽排Delay函式
func delay(_ delay:Double, closure:@escaping ()->()) { DispatchQueue.main.asyncAfter( deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)}
//NSEC_PER_SEC ios的一秒
背景音樂
if let filePath = Bundle.main.path(forResource: "background_music", ofType: "mp3"){let fileUrl = URL(fileURLWithPath: filePath)let player = AVQueuePlayer()let item = AVPlayerItem(url: fileUrl)self.looper = AVPlayerLooper(player: player, templateItem: item)player.play()}
類型結構
struct Card : Identifiable,Hashable{ let id = UUID() let suit:String //花色 let rank:String //數字 var c = 1.0 //卡牌透明度 var f = 0 //卡牌位移值}struct Player{ var id :Int var isNoCard = false //玩家如果為false遊戲結束 var cardList = [Card]()}//兩兩個相同數字的牌struct DropCard{ var card1:Card var card2:Card}let suits = ["clubs","diamonds","hearts","spades"]let ranks = ["ace", "2", "3", "4", "5", "6", "7", "8", "9", "10","jack","queen", "king"]
有限狀態機
.onChange(of: gaming, perform: { newValue inswitch newValue{case 0: message = "開始遊戲"case 1: message = "棄牌"playerList[0].isNoCard = falseplayerList[1].isNoCard = falseplayerList[2].isNoCard = falseplayerList[3].isNoCard = falsegamerChooseComputer = 1order = 0washCard()dropCard1()case 2:if playerList[1].isNoCard == true && playerList[2].isNoCard == true && playerList[3].isNoCard == true {gaming = 6return}if playerList[0].isNoCard == true{gaming = 5return}message = "玩家抽牌"gamerChooseComputer = selectNextPlayer(current: 0)showGetCard = truecase 3:showGetCard = falsemessage = "抽牌"chooseAndDrop(player1: 0, player2: gamerChooseComputer, card: selectedCard, nextStep: {gaming = 4})case 4:showGetCard = falsemessage = "電腦抽牌"let next = selectNextPlayer(current: 0)if next == 4{gaming = 6return}let nextDrop = selectNextPlayer(current: next)if nextDrop == 4{gaming = 6return}print("next:\(next)")print("nextdrop:\(nextDrop)")computerChooseCard(i: next, next: nextDrop)case 5:money = money + 10showGetCard = falsemessage = "勝利"isShowGameWin = truecase 6:money = money - 50if money <= 0{gaming = 7return}showGetCard = falsemessage = "失敗"isShowGameLose = truecase 7:showGetCard = falsemessage = "遊戲結束"default: message = ""}}