第二週Swift總結

saman0發表於2017-12-14

##猜拳遊戲


import UIKit

class ViewController: UIViewController {
    
    var thyAnswer = 0
    
    @IBOutlet weak var cloth: UIButton!
    
    @IBAction func showCloth(sender: AnyObject) {
        cloth.backgroundColor = UIColor.blackColor()
        thyAnswer = 3
    }

    @IBAction func showStone(sender: AnyObject) {
        thyAnswer = 2
    }

    @IBAction func showScissor(sender: AnyObject) {
        thyAnswer = 1
    }

    @IBAction func okAction(sender: AnyObject) {
        
        let cp = Int(arc4random_uniform(4)) + 1   
        if thyAnswer == 1 && cp == 2 || thyAnswer == 2 && cp == 3 || thyAnswer == 3 && cp == 1{
            if thyAnswer == 1{
                overLabel("你輸了,你出的剪刀,電腦出的石頭")
            }else if thyAnswer == 2{
                overLabel("你輸了,你出的石頭,電腦出的布")
            }else{
                overLabel("你輸了,你出的布,電腦出的剪刀")
            }
        }
        else if thyAnswer == cp{
            overLabel("和,你們出的一樣的")
        }
        else if thyAnswer == 0{
            overLabel("請做出你要出的選擇")
        }
        else{
            if thyAnswer == 1{
                overLabel("你贏了,你出的剪刀,電腦出的布")
            }else if thyAnswer == 2{
                overLabel("你贏了,你出的石頭,電腦出的剪刀")
            }else {
                overLabel("你贏了,你出的布,電腦出的石頭")
            }
        }
    }
    func overLabel(stl:String){
        showEnd.text = stl
    }

    @IBOutlet weak var showEnd: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        showEnd.adjustsFontSizeToFitWidth = true
        
    }

}
複製程式碼

-以上就是程式碼,個人總結就是將if的靈活運用,if與if的多重巢狀,當然也可以用swith case 這個,個人錯的地方比較多的地方就是考慮if的各種情況不全面,有漏掉的地方,比如這個的thyAnswer == 0就容易漏掉。最後還有小地方就是注意showEnd.adjustsFontSizeToFitWidth = true動態變化,就是框框隨著文字變動而變動。 ##骰子賭博

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        lastWager.adjustsFontSizeToFitWidth = true
        lastWager.text = "\(money)"
    }
    
    
    @IBOutlet weak var rightDice: UILabel!
    
    
    @IBOutlet weak var leftDice: UILabel!
    var money = 1000000
    var debt = 0
    var isJuge = 0
    @IBAction func okAction(sender: AnyObject) {


        while isJuge == 0 || isJuge == 1{
            debt = Int(showWager.text!)!
            while  debt <= 0 || debt > money{
                alertAlert("請選擇你要下的賭注", msg: "你是否繼續遊戲")
            }
            let firstPoint = roll() + roll()
            if firstPoint == 7 || firstPoint == 11{
                
                alertAlert("你贏了", msg: "你是否繼續遊戲")
            money += debt
                isJuge = 2
            }
            else if firstPoint == 2 || firstPoint == 3 || firstPoint == 12{
                alertAlert("你輸了", msg: "你是否繼續遊戲")
                money -= debt
                isJuge = 2
            }else{
                isJuge = 1
            }
            while isJuge == 1{
                    let current = roll() + roll()
                    if current == 7{
                alertAlert("你輸了", msg: "你是否繼續遊戲")
                    money -= debt
                        isJuge = 2
                }
                else if current == firstPoint{
                alertAlert("你贏了", msg: "你是否繼續遊戲")
                    money += debt
                        isJuge = 2
                }
           }
            lastWager.text = "\(money)"
            if money <= 0{
                alertAlert("你的餘額不足,請補足再繼續遊戲", msg: "你是否繼續遊戲")
                isJuge = 2
            }
        }

    }
    func roll() -> Int{
        return Int(arc4random_uniform(6)) + 1
    }
    func alertAlert(tl:String,msg:String){
        let alertController = UIAlertController(title: tl, message: msg, preferredStyle: .Alert)
        
        let yAction = UIAlertAction(title: "確定", style: .Default, handler: {
            action in
            self.isJuge = 0
            
            
        })
        let nAction = UIAlertAction(title: "取消", style: .Default, handler: {
            action in
            self.isJuge = 2
        })
        alertController.addAction(nAction)
        alertController.addAction(yAction)
        self.presentViewController(alertController, animated: true, completion: nil)
    }
    
    @IBOutlet weak var showWager: UITextField!
    
    @IBOutlet weak var lastWager: UILabel!
    
}
複製程式碼

做這個做了好久,不過總體還是做出來了,其實後面還可以在新增一些功能,比如充值,本來想用老師的repeat while 的,但是用起來感覺還是沒有while 順手就沒有用了,出現的問題就是在第二次和之後的丟骰子的時候沒有退出迴圈,一直在遊戲中迴圈,然後我沒用老師的bool型別 我直接的是isJuge賦值0 1 2

螢幕快照 2016-08-06 上午10.36.16.png

螢幕快照 2016-08-06 上午10.36.42.png
##百錢百雞

for x in 0...20{
    for y in 0...33{
            let z = 100 - x - y
            if  5*x+3*y+z/3==100 && z%3==0{
                print("公雞:\(x),母雞:\(y),小雞:\(z)")
            }
    }
}
複製程式碼

這裡就是三重迴圈,之前我在吃飯的時候和幾個學安卓的同學交流了一下,他們表示三重迴圈運算沒問題,直接就可以得到答案,但是我用swift就會報錯,但是沒關係,解決辦法利用他們之間的函式關係替代第三個變數,就變成二重迴圈,這裡需要注意一個隱含的條件能被三整除小雞的數量。 ##排序 陣列的排序在swift語言中已經幫我們弄了一些方法了,生序降序,刪除陣列中的一些元素,sort(),sortInplace(),remove()方便了程式設計師的操作,就是有了這些等等方便的方法與大眾化,才能有某些老師大膽的推測未來20年的霸主語言。

1.氣泡排序

var arry = [34,56,2134,2,32345,34,45,12,23,]
//冒泡,兩兩比較,前面的元素比後面的元素大就交換位置
for i in 0..<arry.count - 1{
    var swapped = false
    for j in 0..<arry.count - 1 - i{
        if arry[j] > arry[j + 1]{
            (arry[j],arry[j + 1]) = (arry[j + 1],arry[j])
            swapped = true
        }
    }
    if swapped == false{
        break
    }
}
print(arry)
複製程式碼

氣泡排序就是最前面的與後面依次做比較,如果是比較大,最裡面的for迴圈就是拿出最前面的與後面依次做比較,外層的for迴圈就是需要迴圈的總次數,當然這裡還是比較簡單的,值得注意的是對於陣列的值的一個標記,這裡的true和false就是這個目的,以後如果想用幾個以上的標記可以1,2,3...這些來表示,就有點像玩遊戲的頂點傳送,如果是1就把人傳送到哪裡,是2就傳送到另外一個地方,在後面的練習中會有大量的出現,不僅有這個好處,還有可以停止while迴圈的好處,比如while isPonit = true{ isPoint = false }比用break優雅一些。 引伸一下知識點,如果要我們刪除陣列中相同的數值怎麼辦。

let array = [34,56,2134,2,32345,34,45,12,23,45,23]
var dictInts = Dictionary<String, Int>()

for number in array {
    dictInts[String(number)] = number
}
print(dictInts)

var result = [Int]()
for value in dictInts.values {
    result.append(value)
    print(result)
}
print(result)
複製程式碼

想了半天,本來不想用字典的,就只想用陣列解決的,但是設計到在迴圈中不能刪除相同的數值,在迴圈之外去刪除設計到陣列的index的提取,如果是一個還好解決,如果設計到幾個,個人覺得又要用陣列來記錄所提取的值,感覺很麻煩,用字典就很容易解決。如果有直接陣列解決的同學可以私我。