This is not Blackjack…

while, switch, 回傳東西的function, nested loop, struct, AVPlayerLooper, shuffle, array, alert…

Monica
彼得潘的 Swift iOS / Flutter App 開發教室
14 min readJun 22, 2021

--

成品:對於無法完成完整玩法而屈服的自己深感遺憾…😔

▲但本來就不打算(也不知怎)做八副牌混合與使牌減少,一樣不完整啦😅
▲Blackjack屬一澳洲特別回憶,路人還分紅道謝因他壓我會拿到對😂
▲簡化版沒Split, Double, Insurance, Five card Charlie, 除Blackjack, A算1點
▲玩家 Blackjack 莊家不是時莊家馬上輸不用至 17 點,因沒別的玩家要比
▲非美式 Blackjack 所以無蓋牌,使用 PUSH 因字數比 Stand off 少較合圖
▲決定放棄後難度瞬間大跌,如有神助迅速完成!結果網誌卡好久😑

其實我有用音樂但懶得錄, 可點下面Youtube邊聽邊看😉 歌詞也和賭博有關喔!
(左) 金額 = 0 ,(右) 0 < 金額 < 10 出現畫面
(左)一起Blackjack也太難得! (右) 過五關機率不低,難怪除特殊玩法外賭場都不給贏了!

前置作業

▲找教我玩的朋友把規則再搞清楚一次順便回味一起在澳洲發生的事😂
▲找什麼圖都不滿意,除那三行弧形文字和手,全用keynote自己做(累)
▲Storyboard 版面配置
▲較特別是按籌碼後想它出現在下注圓圈內,因此放很多 ImageView

新增 Swift File struct定義 Card 型別 :花色與點數設為字串

重複放音樂:彼得完整教學於此

▲加入 AVFoundation 函式庫
▲利用 AVPlayerLooper 重複播放
▲下 5 行寫於 ViewDidLoad 內
➞生成 AVQueuePlayer 物件
➞利用 Bundle.man 取得APP資料夾內音樂檔(之前我們匯入的)彼得教學
➞利用 AVPlayerItem 生成要播放的音樂
➞生成 AVPlayerLooper,傳入剛生成的 player & item
➞開始播放音樂

拉 IBOutlet,其中莊家 5 張牌是拉 Outlet Collection為陣列

▲紅線部份本為空行,但太長照不起來便以刪空行畫紅線來呈現
▲取名時第一個字不能為數字…只好採用英文序數

52 張撲克牌製成:巢狀迴圈 ,並於 ViewDidLoad 內寫此 function

其餘變數:count 為按籌碼按鈕次數,index 為檯面上牌的張數

定義各 function

▲下注金額為 10-100,依各情形鎖住按鈕,本想用switch但有個是≥🤦🏻‍♀️

▲依總金額不同鎖不同按鈕

▲每按 1 次 10/20/50 籌碼相對應之結果,此只舉例 10 元籌碼

▲反悔下注金額未按發牌前及判斷輸贏後皆以此恢復初始值 / 畫面

▲贏 / 輸 / 平手 / 爆各情形,此只舉例贏且非 Blackjack 贏時

▲生成莊家第 2 張牌 (陣列為 1 總牌數則因不同情形不同) 並計算點數

▲莊家 Blackjack 時的不同結果 (實質是 11 點所以不算點數用字串判斷)

▲莊家牌超過 16 點後判斷輸贏結果

▲莊家有第 5 張牌時所有牌之位置調整

⭐ 回傳東西的 function:回傳東西: point,型別: Int (特設AJQK點數)

拉 IBAction

▲ 新技巧 switch可省多次 if else 更簡潔,default 如無設定填 break 即可
➞按任一籌碼按鈕 count 皆 +1, 而因 count 次數不同對應不同 case 反應
➞按 1 次出現 1 小籌碼圖,下注及總金額改變 (此只舉例 50 元籌碼按鈕)

▲ 如沒加第 2 個 func,餘額< 50 又反悔按 ⨂ 時會發現每個鈕都可按 😵

之後 Action都超長,註解在完整程式碼裡好了 !名稱取很完整應不難懂

其中 while 也是新學技巧還是註記一下
➞和 for in loop 不同處為無次數限定,依設定條件決定
➞條件沒設好的話,可能有無限循環或根本不會跑情況產生
➞此例為莊家點數未超過 16 點時莊家繼續加牌,但第 5 張出現後則停止
➞莊家第 3 張牌會因檯面上張數不同改變,因此 index-2 / -3 / -4皆有可能
➞如最後無 index += 1,此 while 就只會一直更換莊家第 3 張牌

完整程式碼 + 後半段解釋
上半為 Card (struct),下半為 ViewController

--

--