我正在研究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
时,我收到错误消息。有人可以帮忙解释那里的问题吗?
我现在停在那里,看看能不能解决这个问题,我会等到修好之后再发布一个新问题。谢谢。
答案 0 :(得分:2)
函数arc4random_uniform()采用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)
}
答案 1 :(得分:0)
正如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
将从1
中减去index
。
var random:Int = Int(arc4random_uniform(UInt32(index)))
这里我们声明一个新变量random
,它将是Integer类型。让我们从内到外工作。 UIt32(index)
会将类型为index
的{{1}}转换为Int
类型,这是必需的,因为我们的随机函数需要UInt32
接下来,我们请求一个随机值,它将位于UInt32
和index
之间(因此在数组的边界之间)。我们想删除属于我们数组中此随机值的播放器。为此,我们需要将随机0
转换回Uint32
我们可以使用Int
执行此操作。
接下来,我们使用
删除Int()
处的播放器
index
最后,我们使用
打印数组中剩下的第一个(也是唯一的)项目playerNames.removeAtIndex(random)