2016年6月15日 星期三

SWIFT物件規劃 & 實作範例 - 終極密碼

終極密碼-遊戲規劃 & 實作
[需求]
1.
程式會亂數產 個介於 1 ~ 100的數值作為答案
2. 玩家所輸 數字如果就是答案,程式會終 並輸出輸 次數與答案。 3. 玩家必須玩到猜對為 。
4. 玩家所輸 數字如果不是答案,程式會提 範圍(Message Prompt)
Ex: Answer = 51
User entered Message Prompt

1st : 33 34 ~ 100 2nd : 75 34 ~ 74

[領域分析]Domain Analysis
1.
程式會亂數產 個介於 1 ~ 100的數值作為答案
int answer;
2.
玩家所輸 數字如果就是答案,程式會終 並輸出輸 次數與答案。
String inputStr; int count; 3. 玩家必須玩到猜對為 。
4. 玩家所輸 數字如果不是答案,程式會提 範圍(Message Prompt)
ex Answer = 51
User entered Message Prompt

1st : 33
2nd : 75 3rd : 79
34 ~ 100
int lowerbound; int upperBound ;

34 ~ 74 34 ~ 74

[流程分析] //產 亂數做為解答 //提 訊息含上下邊界 //讀取玩家輸
//轉型 & count++ // 對成功,輸出次數與解答 // 對失敗,調整上下邊界

[類別分析]
  1. //產 亂數做為解答(GameData)
  2. //提 訊息含上下邊(GameFlow)
  3. //讀取玩家輸 (GameFlow)
  4. //轉型 & count++(GameData)
  5. // 對成功(GameData),輸出次數與解答(GameFlow)
  6. // 對失敗,調整上下邊界(GameData)
[類別設計]:功能導向
1. 資料處理(GameData):

2. 流程處理:
    ● 初始化邏輯(GameData)
    寫在建構函式中
    ● 對流程(compare Method, GameData):
    public bool compare(String inputStr)
    //次數加1    //String --> int (casting error return false)    //compare to answer    //if true, return true    //if false, update lowerBound or upperBound, and return false
    ● 遊戲主流程(GameFlow): //產 遊戲資料
    //提 訊息含上下邊界
    //讀取玩家輸 Call GameData’s compare Method
    // 對成功,輸出次數與解答 // 對失敗,遊戲繼續執  


Swift 實作
types.swift
 main.swift



[Code程式區 - types.swift]

class GameData{
    //1: 屬性宣告
    var answer : Int
    var count : Int
    var upperBound : Int
    var lowerBound : Int
    
    init(){
        //2: 變數初始化
        count = 0
        upperBound = 100
        lowerBound = 1
        //產生亂數做為解答
        answer = Int(arc4random()) % (upperBound - lowerBound + 1)  + lowerBound
    }
    
    // 3. 比對邏輯
    func compare(userInputStr: NSString)->Bool{
        //轉型 & count++
        count += 1
        let userInput = userInputStr.integerValue
        if answer == userInput{
            //比對成功,輸出次數與解答
            //print("ANSWER: \(answer), COUNT : \(count).")
            //break
            return true
        }else{
            //比對失敗,調整上下邊界
            if userInput < answer && userInput >= lowerBound {
                lowerBound = userInput + 1
            }else if userInput > answer && userInput <= upperBound{
                upperBound = userInput - 1
            }
        }
        return false
    }
}


struct  GameFlow {
    // 4: 屬性宣告
    var data = GameData()
    
    // 5: 讀取使用者輸入
    func getInput() -> NSString {
        let keyboard = NSFileHandle.fileHandleWithStandardInput()
        let inputData = keyboard.availableData
        return NSString(data: inputData, encoding:NSUTF8StringEncoding)!
    }
    
    // 6: 主要流程
    func play(){
        while true{
            //提示訊息含上下邊界
            print("OO Please enter a number between \(data.lowerBound) ~ \(data.upperBound):")
            //讀取玩家輸入
            let userInputStr = getInput()
            if data.compare(userInputStr){
                // 比對成功, 輸出次數與解答
                print("OO Answer: \(data.answer), Count: \(data.count).")
                break
            }
            
        }
    }

}

[Code程式區 - main.swift]

// 7:程式執行
let game = GameFlow()
game.play()




George Huang 烤蕃薯@Taipei 2016


沒有留言: