011 完善 App

作者: ErlichLiu | 来源:发表于2017-10-24 20:02 被阅读21次

    上一节

    目前来看,我们的程序已经可以正常的运行了,甚至没什么 bug,但仍然有很多可以提升的空间。显然这个 App 看上去还不够美观,只是刚刚可以运行了而已,与此同时,这里还有几个小的错误可以调整一下。

    首先是在弹出框中还是显式的是「Hello World」,实际上应该是「Bull's Eye」,但是我有个更好的想法,这个提示是根据玩家的表现来变化的。如果玩家把滑块正好放在目标值上,提示的就是「Perfect!」,如果玩家已经很接近目标值了,就显示「You almost had it!」,如果玩家离得太远就显示「Not even close...」等等,这样可以给玩家更好的反馈。

    想象一下你是如何完成这个步骤的,要将这些逻辑语句放在那里?并且怎么编写程序?

    改变这些东西最好的地方就是在showAlert()方法中了,因为这就是主管 UIAlertController的地方。你以前就做过根据一些计算信息来显示消息的语句,现在你应该很熟悉怎么操作了。

    • 这里是showAlert()方法的完整结构:
    @IBAction func showAlert() {
    
    let difference = abs(targetValue - currentValue) 
    let points = 100 - difference score += points 
    // 添加这一行
    let title: String if difference == 0 {
    title = "Perfect!"
    } else if difference < 5 {
    title = "You almost had it!" } else if difference < 10 {
    title = "Pretty good!" } else {
    title = "Not even close..." }
    let message = "You scored \(points) points"
    let alert = UIAlertController(title: title,
    // 这里要变
    message: message, preferredStyle: .alert)
    let action = UIAlertAction(title: "OK", style: .default, handler: nil) alert.addAction(action) 
    present(alert, animated: true, completion: nil)
    
    startNewRound() 
    updateLabels()
    }
    

    你创建了一个新的本地字符串 title,这个变量用来存储弹出框的 title 文本,这个 title 本身也没多少值。title 会显示什么值,取决于滑块的值和目标值之间的差值有多大。

    • 如果玩家能精准的让差值为 0,那么 title 的值会显示出「Perfect!」
    • 如果差值能小于 5 ,那么 title 的值会显示出「You almost had it!」
    • 如果差值小于 10 ,那么 title 的值会显示出「Pretty good!」
    • 其它情况下都会显示「Not even close...」

    那么你能跟得上这个逻辑吗?这就是一大堆的 if 语句,判断一些不同的情况,然后选择合适的来响应。

    运行 App ,然后玩一小会,你会发现现在的 title 就会按照你的提示表现给你不同的反馈了。


    思考:如何激励玩家更加认真的玩游戏,尽最大可能让滑块摆放的更加精准,我们打算奖励给把滑块摆放的更加精准的人给予双倍的奖励,让那些得到100分的人能再额外的得到100分奖励。

    所以以下是我的改变:

    @IBAction func showAlert() {
      let difference = abs(targetValue - currentValue) 
      var points = 100 - difference  // change let to var
      let title: String if difference == 0 { 
      title = "Perfect!"
      points += 100 
      } else if difference < 5 { 
        title = "You almost had it!" 
        if difference == 1 { 
        points += 50 
      }
    } else if difference < 10 { 
      title = "Pretty good!"
    } else {
      title = "Not even close..." 
    } 
    score += points . . .
    }
    
    • 首先你注意到了在花括号内添加了新的代码句,当差值为 0 的时候,你不仅要修改标题为「Perfect」,还要额外奖励玩家 100 分。

    • 其二 if 语句也改变了,现在 if 语句中还有一个 if 语句,这并不会产生什么错误!你想处理分数为 1 的情况,如果只差 1 ,那么就奖励玩家 50 分。

    • 正是因为要给玩家额外的分数,那么分数就不是一个常量了;所以它需要是一个变量,这就是为什么你要将 let 更改为 var。

    • 最后一点变化, score += points 被更改到 if 语句后,这是必要的,因为你要在 if 语句中可能给玩家奖励分数,所以要等到奖励分数加完后再累计分数。
      如果你的做法有所不同,没有关系,只要它可以正常运行就没有问题,一个想法可以有多种方式来表达,而程序只是一种步骤,不同的实现方式最后可能会是一样的结果。

    • 运行程序查看一下吧,看看你是否可以拿到额外的奖励!

    本地变量总结


    在之前我们也提到过本地变量和实例变量的问题,现在你应该了解这些,本地变量的生命周期只在声明它的方法内有效;实例变量则要长得多,它的生命周期跟 View Controller 对象的生命周期一样长,因为实例变量是属于对象的。

    在 showAlert() 方法中,有 6 个本地变量,和 3 个实例变量。

    let difference = abs(targetValue - currentValue) 
    var points = 100 - difference 
    let title = . . .
    score += points 
    let message = . . .
    let alert = . . .
    let action = . . .
    

    练习:指出那些是本地的,那些是实例变量,在本地的中,那些是变量,那些又是常量?

    答案:本地的是很好识别出来,因为它们第一次被用于方法中,在名称前都有 let 和 var:

    let difference = . . . 
    var points = . . .
    let title = . . .
    let message = . . . 
    let alert = . . .
    let action = . . .
    

    此语法创建的是一个变量(var)或者常量(let),以为这些变量和常量都是在方法内部被声明的,所以都是本地化的。

    difference、points、title、message、alert 和 action 这 6 个都被限制在 showAlert() 方法内部,在方法外部是不能使用的,并且当 showAlert() 方法执行完毕,这几个本地化属性也将不存在。

    这一个小节就先讲到这啦,赶快回顾一下这一小节讲了什么吧,下一个小节我们将继续优化 App。
    下一节

    相关文章

      网友评论

        本文标题:011 完善 App

        本文链接:https://www.haomeiwen.com/subject/feixpxtx.html