Я пытаюсь подсчитать, сколько раз определенное число выбрасывается в наборе из шести шестигранных игральных костей, чтобы определить, есть ли у меня три одинаковых, четыре одинаковых и т. д.
Я могу получить номинальную стоимость каждого брошенного кубика и сравнить его с гранями на 6-гранном кубике, но не могу получить ключ/значение «qtyRolled» для увеличения.
func rollDice() {
currentRoll.removeAll()
for _ in currentDiceArray {
let num: UInt32 = arc4random_uniform(UInt32(currentDieFaceArray.count))
let currentDieData = currentDieFaceArray[Int(num)]
let faceValue = currentDieData["faceValue"]
currentRoll.append(faceValue as! Int)
}
print(currentRoll)
getQtyOfDieFaces()
//checkForScoringCombos()
}
func getQtyOfDieFaces() {
for die in currentRoll {
for dieData in currentDieFaceArray {
var currentDieData = dieData
let qtyRolled = currentDieData["qtyRolled"] as! Int
let faceValue = currentDieData["faceValue"] as! Int
print("faceValue: \(faceValue)")
print("Die: \(die)")
if faceValue == die {
currentDieData["qtyRolled"] = qtyRolled + 1 as AnyObject
}
}
}
for currentDieData in currentDieFaceArray {
print(currentDieData["qtyRolled"]!)
}
}
Вот мои структуры данных
var currentDieFaceArray = [[String:AnyObject]]()
var currentDiceArray:[[String:AnyObject]] = [[:]]
var currentRoll: [Int] = []
Я обдумывал идею структур/классов, не могли бы вы дать какое-то направление относительно того, как это можно сделать. Классы против структур? Я программист из далеких 90-х, но не занимался программированием около 25 лет, как вы можете себе представить, все немного изменилось, лол. У меня был первый цветной ноутбук в колледже, в котором я учился, если это вам что-то говорит.
Хорошее введение находится в основной книге Swift: docs.swift.org/swift-book/LanguageGuide/…



Я бы рекомендовал отказаться от словарей, если они вам действительно не нужны, поскольку вы действительно имеете дело только со свойствами структуры/класса. Я предполагаю, что вы используете метод currentDieFaceArray, чтобы вы могли сделать его универсальным для нелинейных граней игральных костей других размеров (например, у вас может быть четырехгранная игральная кость с номиналами [1, 4, 6, 8]). Если это не так, вы можете еще больше упростить, я уверен, с помощью простого массива счетчиков. Но вот пример с вашим методом (возможно, есть и другие возможные оптимизации).
class DieFaceDefn
{
let faceValue : Int
var countThisRoll : Int = 0
init(faceValue: Int)
{
self.faceValue = faceValue
}
}
var diceFaces: [DieFaceDefn] = []
let numberOfCurrentDice = 5
func setupDice()
{
diceFaces.append(DieFaceDefn(faceValue: 1))
diceFaces.append(DieFaceDefn(faceValue: 2))
...
}
var currentRoll: [Int] = []
func rollDice()
{
currentRoll.removeAll()
diceFaces.forEach { $0.countThisRoll = 0 }
for _ in 0..<numberOfCurrentDice
{
let num: UInt32 = arc4random_uniform(UInt32(diceFaces.count))
let currentDieData = diceFaces[Int(num)]
let faceValue = currentDieData.faceValue
currentRoll.append(faceValue)
currentDieData.countThisRoll += 1
}
print(currentRoll)
diceFaces.forEach { print("\($0.faceValue): \($0.countThisRoll)") }
}
ценю помощь и совет. Спасибо, что нашли время.
Без проблем. К вашему сведению, я не думаю, что ноутбуки существовали, когда я учился в колледже.
Все это можно проработать, но вы должны объяснить свои структуры данных (в частности, currentDieFaceArray как массив словарей?). Вероятно, их можно было бы упростить до структур/классов с членами Int, и вам было бы легче увидеть, что происходит. Также было бы более эффективно обновлять количество в функции rollDice, где у вас уже есть выпавшее значение и доступ к правильным данным currentDieData.