作業#20 射龍門. 在最後一堂課的時候Peter問我說想做怎樣的撲克牌遊戲,我就想到自己很喜歡玩的射… by 語音學家-初育城 彼得潘的 Swift iOS / Flutter App 開發教室 Medium

在最後一堂課的時候Peter問我說想做怎樣的撲克牌遊戲,我就想到自己很喜歡玩的射龍門,原本想說過年的期間可以把它做出來!結果,計劃趕不上變化。過年忙著打牌,就拖到禮拜一才開始動手寫作業,經過了5天的腦力激盪,終於把作業做出來了! 這邊我是用Struct的方式分類,本來想要用For-In Loop的方式。但是我對For-In… 語音學家-初育城12 min read·Feb 12, 2022
--
Share
這邊因為我都是用一個ViewController來做,所以對我來說顯示的先後順序很重要。這邊我把規則的放在最上面,這樣點開來才不會被其他元件遮住。
Zoom image will be displayed
2.用Struct做好撲克牌的分類。
這邊我是用Struct的方式分類,本來想要用For-In Loop的方式。但是我對For-In Loop還不是很熟悉,所以用之前就會的方式,雖然感覺比較耗時間。但是我覺得這樣子比較好記錄每張撲克牌的圖片跟相對應的點數。
Zoom image will be displayed看起來很多,打起來其實也沒有很久 撲克牌的圖片我是用Peter提供的網站下載的,我覺得非常好用!一次下載什麼52張牌都有!名稱也不用修改!
The F2E - 前端 & UI 修練精神時光屋
六角學習地圖. 課程購買後不知從哪邊開始上嗎? 我們這邊提供一張學習地圖給同學做參考。 對於前端還有不了解的地方,可以參考前端開發者技能樹!或是直接與 …
challenge.thef2e.com
六角學習地圖. 課程購買後不知從哪邊開始上嗎? 我們這邊提供一張學習地圖給同學做參考。 對於前端還有不了解的地方,可以參考前端開發者技能樹!或是直接與 …
challenge.thef2e.com
拉好圖片後打他們的名稱到Struct裡面
3.宣告變數
這邊我思考了蠻久的,在想有哪些東西需要儲存的。最後再做一個Struct來儲存賭金的。
Zoom image will be displayed
4.建立需要使用的Func
這邊我其實只有建立四個函示,先是洗牌後取出三張牌,如果取出的牌太相近,會再重新取牌一次。
// 遊戲開始時要跑的函式func gameStar(){// 把全部的卡片打亂allCard.shuffle()// 取第一張fristCardIV.image = UIImage(named: allCard0.cardIV)// 取第二張secCardIV.image = UIImage(named: allCard1.cardIV)// 取第三張thirdCardIV.image = UIImage(named: allCard2.cardIV)fristcardsNum = allCard0.cardNumsecondCardsNum = allCard1.cardNumthridCardsNum = allCard2.cardNum}// 如果有順序太相近的func cardReturn(){// 把卡片的index歸零cardIndex = 0// 卡片全部隱藏secCardIV.isHidden = truefristCardIV.isHidden = truethirdCardIV.isHidden = trueresultLabel.text = “順序太近重發一次!”}
以及如果沒有打你池底的金額還有下注金額時需要跑出提醒的Alert。
這邊我是參考Peter的文章,用簡單的Alert!
顯示警告訊息和選單的 UIAlertController
使用 iOS App 時,我們時常看到兩種視窗。
medium.com
使用 iOS App 時,我們時常看到兩種視窗。
medium.com
大概是長這樣~ // 用alert跑出提示字func typePullMoney(){let moneyAlert = UIAlertController(title: “尚未輸入池底金額!”, message: “請輸入您池底金額!”, preferredStyle: .alert)let okType = UIAlertAction(title: “了解”, style: .default, handler: nil)moneyAlert.addAction(okType)present(moneyAlert, animated: true, completion: nil)}// 用alert跑出提示字func typeBetMoney(){let moneyAlert = UIAlertController(title: “尚未輸入賭注金額!”, message: “請輸入您賭注金額!”, preferredStyle: .alert)let okType = UIAlertAction(title: “了解”, style: .default, handler: nil)moneyAlert.addAction(okType)present(moneyAlert, animated: true, completion: nil)}// 用alert跑出提示字func pullMoneyEnought(){let moneyAlert = UIAlertController(title: “池底金額不足!”, message: “您輸入的賭注金額高於池底!”, preferredStyle: .alert)let okType = UIAlertAction(title: “了解”, style: .default, handler: nil)moneyAlert.addAction(okType)present(moneyAlert, animated: true, completion: nil)}
5.開始打你的每個Button的指令
這邊我做了六個Button,分別是 發牌、下注池底、下注金額、顯示遊戲規則、重新一局、All In。
先從簡單的開始講起。
顯示規則
非常簡的的方式,記得要把你的TextView放到最上層。才不會被你其他的元件擋住。
Zoom image will be displayed@IBActionfunc pokeRule(_ sender: Any) {// 按一下就會讓Index+1ruleIndex += 1// 等於1的時候規則就會顯示if ruleIndex == 1 {pokeRuleTV.isHidden = falseruleIndex += 1// 大於2就會隱藏}elseif ruleIndex > 2 {pokeRuleTV.isHidden = trueruleIndex = 0}}重新一局
這個也是比較簡單的,把原本有的都歸零跟重新。
@IBActionfunc resetGame(_ sender: UIButton) {// 重新洗牌再取三張gameStar()// 把撲克隱藏sentYourPullMoneyTF.isHidden = falsefristCardIV.isHidden = truethirdCardIV.isHidden = truesecCardIV.isHidden = truehitCardIV.isHidden = true// 金額歸零pullmoney.INpullMoney = 0// 把輸入的值都清空sentYourPullMoneyTF.text = ““moneyLabel.text = ““moneyTF.text = ““yourBetLb.text = “"}All IN
這也是比較簡單的部分只是讀取你現在池底的金額,再把他變成你要下注的金額。
@IBActionfunc allIN(_ sender: UIButton) {// 讓你的標題變文字resultLabel.text = “All In啦!臉色特變!”// 你的金額 = 你全部的金額moneyTF.text = “\(pullmoney.INpullMoney)”// 你下注的金額 = 你全部的金額yourBetLb.text = “\(pullmoney.INpullMoney)"}你的底池金額
本來我是打算打在發牌那邊,但發現我的水平,會沒辦法儲存底池金額,所以我就再加一個按鍵,來輸入你底池的金額。以及如果你沒有打金額的話會跑出提示字(上面的影片)。
@IBActionfunc sentPullMoney(_ sender: UIButton) {// 先宣告一個你池底金額let checkMyPull = Int(sentYourPullMoneyTF.text!)// 如果他是空值的話if checkMyPull == nil{// 跑出提示typePullMoney()} else {// 如果他有值的話,把他的TextField隱藏sentYourPullMoneyTF.isHidden = true// 輸入的金額 = 你池底的金額pullmoney.INpullMoney = checkMyPull!// 顯示你的金額moneyLabel.text = “\(Int(pullmoney.INpullMoney))”}}下注金額
這邊也是差不多的東西,只是加上了如果下注金額大於池底的錢,會跑出提示字。
@IBActionfunc sentMoney(_ sender: UIButton) {//先宣告一個下注金額let moneyCount = Int(moneyTF.text!)// 如果他是空值的話if moneyCount == nil{// 跑出提示字typeBetMoney()}else{// 如果不是會顯示你下注的金額yourBetLb.text = “\(moneyCount!)”}// 如果你下注的金額大於你池底的金額if moneyCount! > pullmoney.INpullMoney {// 跑出提示字pullMoneyEnought()}}Zoom image will be displayed發牌
最難的就放在最後講!
這邊我也是苦惱了很久,原本要全部都用if-else寫完,但是發現好像太麻煩,最後決定用Switch Case + If-else完成
當按下按鈕的時候,就會先跑這邊,這邊也是聽從Peter跟帥哥學長的建議要善用print來確定的迴圈有沒有被跑到。
先來講解一下,原本是想打 = nil就不會跑,但其實池底金額跟下注金額,都可以為空值,所以變成要判斷,如果池底金額跟下注金額就要=0。
當池底金額跟下注金額 = 0,就會判斷他們沒下注,才會跑出提示字。
Zoom image will be displayed在你看到牌前已經跑了三圈了 接下來是當看到第二張牌時,要確認是否與第一張牌一樣或是連號,如果是的話,會重新洗牌發牌,如果沒有才會開始跑到第三張牌,這邊看到我用了很多Print來確認我的牌是否有跟一開始的不一樣。
Zoom image will be displayed最後就是最困難的地方啦!原本以為已經想好用Switch的方式但是發現Swich Case的範圍只能由小到大,如果是由大到小,程式就會崩潰。
跑出你的值超出你的判斷範圍
Fatal error: Range requires lowerBound <= upperBound
像下面圖
Zoom image will be displayed最後還是靠帥哥學長教我的方法。 所以這邊要在跑到Switch Case時先用if-else判斷他的範圍,再把他調整到由小到大的範圍。
Zoom image will be displayed這邊用完之後就是最後的一局結束要換到下一局的方法了!
最後就比較簡單,就是當你的cardindex大於4時讓他歸零,再重新開始就可以啦!還有寫一個如果池底沒錢時就要再讓大家丟錢的迴圈。
Zoom image will be displayed
成品展示
做完真的蠻有成就感的!自己盡然完成了一個遊戲!雖然還是有請教我的帥哥學長 Tommy 有他的幫忙才可以這麼快寫完><
之後要好好來研究for-in迴圈了。
GitHub - ChuGoGo/ShootDragonDoor
You can’t perform that action at this time. You signed in with another tab or window. You signed out in another tab or…
github.com
You can’t perform that action at this time. You signed in with another tab or window. You signed out in another tab or…
github.com
參考作品
#22 二十一點亞洲慈善撲克王大賽
燃燒你的小宇宙,開發二十一點 App,成為亞洲慈善撲克王大賽的冠軍 !
medium.com
燃燒你的小宇宙,開發二十一點 App,成為亞洲慈善撲克王大賽的冠軍 !
medium.com
作業#41 Black Jack 21點 — 撲克牌遊戲
目的:練習做出能夠與電腦對戰的21點撲克牌遊戲
medium.com
目的:練習做出能夠與電腦對戰的21點撲克牌遊戲
medium.com
#27 Blackjack 21 🃏🃏🃏🃏🃏
做這種卡牌遊戲根本就是邏輯大考驗,寫到最後發現自己竟然寫了四層 if ,真的是很燒腦,昨天寫完決定先放空一下,今天再來上傳 Medium。先來看看成品動畫~
medium.com
做這種卡牌遊戲根本就是邏輯大考驗,寫到最後發現自己竟然寫了四層 if ,真的是很燒腦,昨天寫完決定先放空一下,今天再來上傳 Medium。先來看看成品動畫~
medium.com
FAQ
射龍門要怎麼玩?
射龍門,是撲克牌中的一種玩法,玩家先拿到兩張牌,依據第三張牌與前兩張牌的點數關係決定輸贏;若第三牌點數介於前兩張牌點數之間算贏,否則算輸。 猶
撲克牌還可以玩什麼?
撲克牌射龍門小道具推薦,玩起來更順手! 小編推薦這台半自動洗牌機,一次可以洗兩副撲克牌(只想洗一副也可以分兩半照洗),手壓下去三秒OK,馬上繼
躍龍門怎麼玩?
射龍門,是撲克牌中的一種玩法,玩家先拿到兩張牌,依據第三張牌與前兩張牌的點數關係決定輸贏;若第三牌點數介於前兩張牌點數之間算贏,否則算輸。 猶
射龍門棄牌要丟錢嗎?
開局後,發牌者會依序發給每個玩家2張牌,之後再依照發牌順序詢問玩家是否要補第3張牌: 👉【不補】:玩家在此輪棄權,無法拿回檯面上自己付的彩金。
射龍門可以洗牌嗎?
射龍門道具1:撲克牌自動洗牌機 或是一次要洗兩副牌,那操作,喔真是超麻煩的! 小編推薦這台半自動洗牌機,一次可以洗兩副撲克牌(只想洗一副也可以分
射龍門一開始怎麼玩?
玩法:不算花色,僅看數字。 每位玩家發兩張牌當「龍門」(球門),第三張牌點數為「球」,「球」點數在於「龍門」內則得分;不在龍門內則沒分;第三張
射龍門要怎麼玩?
射龍門,是撲克牌中的一種玩法,玩家先拿到兩張牌,依據第三張牌與前兩張牌的點數關係決定輸贏;若第三牌點數介於前兩張牌點數之間算贏,否則算輸。 猶
年和親朋好友必玩的撲克牌遊戲「射龍門」,在近年來越來越熱門,初次嘗試射龍門的你還搞不清楚射龍門怎麼玩、射龍門規則有哪些?編輯整理了射龍門玩法、撞柱賠法,並統整出3個新手必學的射龍門技巧,讓大家在掌握玩法的同時,也能精進自己的射龍門技術,一起成為射門高手,開心贏獎金
本網站僅收集相關文章。如需查看原文,請複製並打開以下連結:作業#20 射龍門. 在最後一堂課的時候Peter問我說想做怎樣的撲克牌遊戲,我就想到自己很喜歡玩的射… by 語音學家-初育城 彼得潘的 Swift iOS / Flutter App 開發教室 Medium




