延續上個猜拳App,我們來擴增這個App的完整度,來新增玩家名稱、判斷輸贏。
所以這次要用到的東西有:
從元件表直接拖曳一個View Controller進Main.storyboard
將檔案命名為"ReadyToStartVC",繼承UIViewController,語言當然是選swift
點選新建立的(ReadyToStartVC)View Controller,並在右側"Identity"頁面選擇剛剛的檔案"ReadyToStartVC"
點選新建立的(ReadyToStartVC)View Controller,接著在上方工具列點選"Editor/Embed In/ Navigation Controller"
加完之後,Main.storyboard就變成這樣
點選Navigation Controller接著在右側"Attributes"屬性頁面將"Is Initial View Controller"打勾
Main.storyboard中可以看到起始箭頭移到Navigation Controller了
點選(ReadyToStartVC)View Controller上放灰色色塊,接著在右側"Attributes"屬性頁面設定Title
將(ReadyToStart)View Controller中的按鈕按右鍵拉藍線拉到(rps)View Controller,出現選單後選擇"Show"
點選兩個View Controll中間的連結線,並在右側的"Attributes"屬性頁面中為此segue定義名稱segue_home_to_rps
新增一個Label,拖曳藍線到View Controller.swift中,取名為winnerLabel,另外也將player1 & player2的label拖曳藍線加入View Controller.swift。
加入之後在新增兩個變數name1 & name2,這兩個變數將用來存放玩家名稱
@IBOutlet weak var player1Name: UILabel!
@IBOutlet weak var player2Name: UILabel!
@IBOutlet weak var winnerLabel: UILabel!
var name1: String? = nil
var name2: String? = nil
@IBOutlet weak var player1TextField: UITextField!
@IBOutlet weak var player2TextField: UITextField!
這是一個當segue啟動時會呼叫的函數,透過參數segue的destination屬性就可以得到下一個View Contorller(亦即rps的View Controller)的實體。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segue_home_to_rps" { //確認我們的動作頁面是切到rps View Controller
let rps_VC = segue.destination as! ViewController //向下轉型
if player1TextField.text == "" {
rps_VC.name1 = "player1"
}else {
rps_VC.name1 = player1TextField.text
}
if player2TextField.text == "" {
rps_VC.name2 = "player2"
}else {
rps_VC.name2 = player2TextField.text
}
其中我們宣告了一個rps_VC向下轉型成(rps)View Controller,以便我們調用該檔案裡面的name1 & name2變數
let rps_VC = segue.destination as! ViewController //向下轉型
在func viewDidLoad()中加入
player1Name.text = name1
player2Name.text = name2
這樣玩家名稱就可依照輸入的字串顯示在畫面上
每次按下start按鈕後,會重新比賽,也會決定輸贏,因此我們將輸贏的判斷方法寫在@IBAction func start(_ sender: UIButton)中
let checkWinner = (player1Index, player2Index)
switch checkWinner {
case let (x, y) where x == y:
return winnerLabel.text = "平手"
case (0, 1):
return winnerLabel.text = "\(name1!)獲勝"
case (0, 2):
return winnerLabel.text = "\(name2!)獲勝"
case (1, 0):
return winnerLabel.text = "\(name2!)獲勝"
case (1, 2):
return winnerLabel.text = "\(name1!)獲勝"
case (2, 0):
return winnerLabel.text = "\(name1!)獲勝"
case (2, 1):
return winnerLabel.text = "\(name2!)獲勝"
case (_, _): return
}
判斷邏輯很簡單,因為我們是用索引值取出rps = ["paper", "rock", "scissors"]中的值,也就是0 = paper,1 = rock,2 = scissors,我這邊先將兩個索引值存入一個叫checkWinner(x, y),藉由Switch去判斷誰贏。