骰子賭大小 App

Yi Cheng Chiang
Aug 26, 2017 · 9 min read

這個主題有點類似“亂數”結合 “瘋狂購物”的app概念,不過在購物網站有一些coding上得問題,利用畫面的設計把他避掉了,一般有一種是先選擇好數量,然後再按總和(button)得到最後總額,這個在瘋狂購物這個作業卡關了,所以當初設計就把buuton去掉,直接在輸入數量的時候,總額會直接計算出來並顯示在總額欄(text)裡面,就coding上當然變數越少越好寫,但就UI/UX 來說,應該有討論的空間。

不過在這次的作業,同樣的問題還是會發生,而且是無法避掉的。首先,描述畫面如下,第一行的下面3個黃色格子就是代表3個骰子擲出來的數字結果; play使用button代表擲骰子。第二行黑色字都使用label來表示文字含義,第一排的三個黃色為要下注金額,使用stepper增加或減少金額;第二排的黃色為目前所擁有的金額。第三排為得到的結果“賺錢啦“ ”請加油“ 分別代表賺錢或輸錢,而”輸光了“ 代表目前金額賭光了(為0),當然這是不會有負數的。

接下來描述程式碼部分,首先說三個stepper的部分,把它全部連到同一個active。遇到幾個困難,第一個是function裡面計算完的值,要暫時不能影響外面的值,而且裡面的值計算完後,也要看以被拿到外面計算,因此在這裡額外用tempPresentMoney 儲存這個值,最後計算完再把這個值還給presentMoney,有想過是不是要用return,但是應該不是這樣用。第二個是當下注金額,到0的時候,讓stepper不再的值不再增加,不然目前金額會出現不合理的現象 - “負值”。原本是在找stepper裡面的function有沒有可以讓他暫時沒有反應的功能,有找到accssibilty之類的功能,但是好像沒用,不知道是沒寫好還是那個function不是這樣用的,最後想到當金額為0的時候,三個stepper的最大值為當時下注的值,即可以解決此問題,當然更動了最大值,還要再把它改回來,所有又補了else,這個可以想到還蠻不容易的….。

再來是play的部分,有三種狀況,大 小 豹子通殺,所有用if else來處理。這個重點有兩個,就是在第二次下注,必須是跟第一次下注的初始條件是一樣的,因此要把全部的值該歸零要歸零,再來是stepper的最大值也要改回原來的100。還有最後全部輸光的時候,stepper的最大值要改為0,不然也會出現負值,以及play鍵讓他無法使用(enable)。
這個app沒有想像的簡單,要一直開模擬器試那裡有bug,超級耗能….。而且上述的解法都試了好久在想到的方法。有更好的解法歡迎交流。

@IBAction func playDeckButton(_ sender: UIButton) {var deckNumber = [1,2,3,4,5,6]let randomDistribution = GKRandomDistribution(lowestValue: 0, highestValue: 5)let deck1Number = deckNumber[randomDistribution.nextInt()]let deck2Number = deckNumber[randomDistribution.nextInt()]let deck3Number = deckNumber[randomDistribution.nextInt()]deck1Label.text = "\(deck1Number)"deck2Label.text = "\(deck2Number)"deck3Label.text = "\(deck3Number)"let totalDeckNumber = deck1Number+deck2Number+deck3Numberlet compareMoney = presentMoneyif deck1Number == deck2Number && deck2Number==deck3Number  {presentMoney = compareMoney + 29 * item3Money - item2Money - item1MoneytotalMoney.text = "\(presentMoney)"bettingItem1.text = "0"bettingItem2.text = "0"bettingItem3.text = "0"bettingStepper1.value = 0bettingStepper2.value = 0bettingStepper3.value = 0item1Money = 0item2Money = 0item3Money = 0// 因為在moneyStepper 當 presentMoney==0 時 會 stepper.maxivalue的值 = 0,在某些情況會出現bugbettingStepper1.maximumValue = 100bettingStepper2.maximumValue = 100bettingStepper3.maximumValue = 100} else if totalDeckNumber <= 9{presentMoney = compareMoney + item2Money - item1Money - item3MoneytotalMoney.text = "\(presentMoney)"bettingItem1.text = "0"bettingItem2.text = "0"bettingItem3.text = "0"bettingStepper1.value = 0bettingStepper2.value = 0bettingStepper3.value = 0item1Money = 0item2Money = 0item3Money = 0bettingStepper1.maximumValue = 100bettingStepper2.maximumValue = 100bettingStepper3.maximumValue = 100} else {presentMoney = compareMoney +  item1Money - item2Money - item3MoneytotalMoney.text = "\(presentMoney)"bettingItem1.text = "0"bettingItem2.text = "0"bettingItem3.text = "0"bettingStepper1.value = 0bettingStepper2.value = 0bettingStepper3.value = 0item1Money = 0item2Money = 0item3Money = 0bettingStepper1.maximumValue = 100bettingStepper2.maximumValue = 100bettingStepper3.maximumValue = 100}if presentMoney > compareMoney {result1Label .isHidden = falseresult2Label.isHidden = true} else {result1Label.isHidden = trueresult2Label.isHidden = false}if presentMoney == 0 {result1Label.isHidden = trueresult2Label.isHidden = trueresult3Label.isHidden = false// 要讓stepper的值歸零 不然會出現負值bettingStepper1.maximumValue = 0bettingStepper2.maximumValue = 0bettingStepper3.maximumValue = 0// 當目前金額歸0的時候,play鍵的enable會無法使用playButton.isEnabled = false}}

最後畫面做得沒很好,數字可以改成直接出現骰子的畫面,不知道可不可以用unicode直接顯示,而不用數字顯示或是圖片。再進階一點就是play的時候會出現骰子的動畫,這樣會有讓使用者真的在丟骰子的感覺。

彼得潘的 Swift iOS App 開發教室

學習 Swift iOS App 開發的學生作品集

)

    Yi Cheng Chiang

    Written by

    彼得潘的 Swift iOS App 開發教室

    學習 Swift iOS App 開發的學生作品集

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade