Увеличение значения в массиве словарей

Я пытаюсь подсчитать, сколько раз определенное число выбрасывается в наборе из шести шестигранных игральных костей, чтобы определить, есть ли у меня три одинаковых, четыре одинаковых и т. д.

Я могу получить номинальную стоимость каждого брошенного кубика и сравнить его с гранями на 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] = []

Все это можно проработать, но вы должны объяснить свои структуры данных (в частности, currentDieFaceArray как массив словарей?). Вероятно, их можно было бы упростить до структур/классов с членами Int, и вам было бы легче увидеть, что происходит. Также было бы более эффективно обновлять количество в функции rollDice, где у вас уже есть выпавшее значение и доступ к правильным данным currentDieData.

Chris Shaw 20.02.2019 00:40

Я обдумывал идею структур/классов, не могли бы вы дать какое-то направление относительно того, как это можно сделать. Классы против структур? Я программист из далеких 90-х, но не занимался программированием около 25 лет, как вы можете себе представить, все немного изменилось, лол. У меня был первый цветной ноутбук в колледже, в котором я учился, если это вам что-то говорит.

Zbud68 20.02.2019 01:05

Хорошее введение находится в основной книге Swift: docs.swift.org/swift-book/LanguageGuide/…

Rob Napier 20.02.2019 01:27
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
3
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы рекомендовал отказаться от словарей, если они вам действительно не нужны, поскольку вы действительно имеете дело только со свойствами структуры/класса. Я предполагаю, что вы используете метод 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)") }
}

ценю помощь и совет. Спасибо, что нашли время.

Zbud68 20.02.2019 02:44

Без проблем. К вашему сведению, я не думаю, что ноутбуки существовали, когда я учился в колледже.

Chris Shaw 20.02.2019 02:49

Другие вопросы по теме