我有一个struct
用于创建,改组和发牌的定制游戏。
struct Card {
let pip : Pip
let suit : Suit
var isFaceCard : Bool {
return pip.rawValue > 10
}
var color : CardColor {
return suit.color
}
}
其次,我有一个球员字典,每个球员都有一张纸牌收藏。
var Players = ["Scott": [Card](), "Bob": [Card](), "John": [Card]()]
为了有效地从已经洗牌的牌组中进行处理,我计划遍历玩家的词典两次,每次都发一张卡,就像实况一样。
是否可以简单地将Card类型附加到Card集合中?我的尝试似乎没有奏效。d
作为一个洗牌甲板(集)的卡类型。
Players["Scott"].append(d.deal())
通过为每个玩家使用结构,我添加了这个
struct Player {
let name : String
var cards : [Card]
}
var Players = [Player]()
Players.append(Player(name:"Scott"))
我必须在初始化时给玩家他们的“卡”,还是可以在以后发给他们?由于上面的代码会产生错误。
Players.append(Player(name:"Scott", cards: [Card]()))
以上是正确的吗?
直接回答:
如果玩家可以拥有一组纸牌,则“玩家”应该是一个结构,并且该结构应包含一组纸牌作为属性。我建议在这里完全不使用字典。
编辑后:
您走在正确的轨道上。
你不必有,如果你初始化自己创建一个为你的结构让玩家自己的卡在初始化:
struct Player {
let name : String
var cards : [Card] = []
init(name: String) {
self.name = name
}
}
这样做会取消自动生成成员初始化器,只有您的初始化器可用。
但是,如果要保留自动的成员初始化程序,则可以在初始化时传递一个空的卡数组,如下所示:
struct Player {
let name : String
var cards : [Card]
}
let joe = Player(name: "Joe", cards: [])
发表评论后:
如果将所有播放器都放在一个数组中,则可以使用indexOf
闭包谓词来获取特定播放器,例如:
struct Player {
let name : String
var cards : [Card] = []
init(name: String) {
self.name = name
}
func fold() {
print("\(name) just folded")
}
}
var players = [Player]()
players.append(Player(name: "Joe"))
players.append(Player(name: "Jane"))
players.append(Player(name: "Jack"))
players.append(Player(name: "Janice"))
if let janeIndex = players.indexOf({ $0.name == "Jane" }) {
players[janeIndex].fold()
}
假设您希望所有玩家弃牌,但其中一位可以使用filter
:
let notJack = players.filter { $0.name != "Jack" }
notJack.forEach { $0.fold() }
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句