我正在Xcode中开发一个非常基本的程序。我正在尝试写一个"抽吸管"的应用程序,最后一个被选中的人是失败者。有几件事我想做。首先,看看下面的代码:
import UIKit
let players = 4
var playerNames: [String] = ["John", "Tyler", "Pete", "Dave"]
var draw = Int(arc4random_uniform(4))
playerNames.removeAtIndex(draw)
print(playerNames)
let round2 = playerNames.count
var draw2 = Int(arc4random_uniform(2))
playerNames.removeAtIndex(draw2)
print(playerNames)
let round3 = playerNames.count
var draw3 = Int(arc4random_uniform(1))
playerNames.removeAtIndex(draw3)
print(playerNames)
第一件错误的事情是,我目前正在对var draw = Int(arc4random_uniform(4))
中绘制的随机整数进行硬编码。当我尝试引用players
而不是只键入4
时,我会得到一个错误。有人能帮忙解释一下那里的问题吗?
我现在就到此为止,看看我是否能解决这个问题,我会等到问题解决后再发布新问题。非常感谢。
函数arc4random_uuniform()接受一个UInt32,因此您需要将变量播放器声明为UInt32
let players: UInt32 = 4
var draw = (arc4random_uniform(players))
为了处理舍入变量,您可以将计数强制转换为UInt32。
let round2 = UInt32(playerNames.count)
你也可以重构你的代码
let players: UInt32 = 4
var playerNames: [String] = ["John", "Tyler", "Pete", "Dave"]
println(playerNames)
for loop in 1...players {
RemovePlayer(&playerNames)
println(playerNames)
}
以及RemovePlayer
功能的代码
func RemovePlayer(inout names: [String]) {
// get the number of names in the array
var maxNames = UInt32(names.count)
var draw = Int((arc4random_uniform(maxNames)))
names.removeAtIndex(draw)
}
如Blackfrog所述,您的随机化函数需要UInt32
既然你说你刚开始编程,我想给你一些其他建议。您的代码可以写成:
var playerNames = ["John", "Tyler", "Pete", "Dave"]
for var index = playerNames.count ; index > 1 ; index -= 1{
var random:Int = Int(arc4random_uniform(UInt32(index)))
playerNames.removeAtIndex(random)
}
println(playerNames[0])
这有几个优点。目前,您正在对加入一个游戏的玩家数量进行硬编码。如果你想添加一个播放器,你需要重写不必要的代码量。
让我们看看上面的代码是做什么的:
我们从声明playerNames
开始,添加[String]
的类型声明是不必要的,swift已经通过其初始值知道它是这种类型。
for var index = playerNames.count; index > 1 ; index -= 1{
我们创建了一个名为index
的新变量,该变量将被设置为playerNames
数组中的项目数量(在本例中为4)
之后,我们将声明,只要我们的index
大于1
,我们就需要循环,这将使它运行3次,并确保我们的数组中只剩下1个项目index -=1
将在循环的每次迭代后从index
中减去1
。
var random:Int = Int(arc4random_uniform(UInt32(index)))
在这里,我们声明一个新的变量random
,它将是Integer类型。让我们从内到外工作。UIt32(index)
将把Int
类型的index
转换为UInt32
类型,这是必需的,因为我们的随机函数需要UInt32
接下来我们请求一个位于index
和0
之间(因此位于数组边界之间)的随机值。我们想要移除数组中属于该随机值的玩家。要做到这一点,我们需要将我们的随机Uint32
转换回Int
,我们可以通过使用Int()
来实现。
接下来,我们使用移除index
上的播放器
playerNames.removeAtIndex(random)
最后,我们使用打印数组中剩下的第一个(也是唯一一个)项目
println(playerNames[0])