基本Xcode-随机数生成器中的引用不起作用



我正在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
接下来我们请求一个位于index0之间(因此位于数组边界之间)的随机值。我们想要移除数组中属于该随机值的玩家。要做到这一点,我们需要将我们的随机Uint32转换回Int,我们可以通过使用Int()来实现。

接下来,我们使用移除index上的播放器

playerNames.removeAtIndex(random)

最后,我们使用打印数组中剩下的第一个(也是唯一一个)项目

println(playerNames[0])

最新更新