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