#2 撲克牌(桌遊) App:抽鬼牌

Flexolk
海大 SwiftUI iOS / Flutter App 程式設計
5 min readMar 22, 2021

(一)操作畫面GIF

win game
操作影片

(二) 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 = ""}}

--

--