Ролевая игра / Генератор зелий в Swift - PullRequest
0 голосов
/ 28 ноября 2018

Прежде всего, извините за мой (иногда) плохой английский, я француз.Я на самом деле работаю над проектом ролевой игры.Цель состоит в том, чтобы создать небольшое программное обеспечение macOS (генератор) с использованием Swift и Xcode, которые могут создавать зелье (эффект, связанный с потенцией) (например, «Fortify Speed ​​7/10») из нескольких параметров.Приложение позволяет пользователю вводить два параметра: ингредиенты (выбираются во всплывающих меню) и бросок кубиков (помещается в текстовое поле).Если эти два (или более) ингредиента имеют общий эффект, то софт добавляет к сумме значение обоих эффектов и возвращает это значение: "" общий эффект "+ (значение эффекта 1-го ингредиента + значение эффекта 2-го ингредиента)».Результат может измениться во время операции в зависимости от броска костей, но здесь это не имеет значения.Вот пример, чтобы понять, что я говорю:

1-й ингредиент: "Кора когтя кошки" -> Сопротивление молнии (4/10);Сопротивление Психике (3/10);Кислотный ущерб (3/10);Страх (3/10);Невидимость (1/10). || 2-й ингредиент: "Виноградный падуб" -> Болезнь исцеления (5/10);Сопротивление холоду (4/10);Повышенная медицина (4/10; Сопротивление молнии (3/10); Силовой урон (2/10.

). Поскольку оба компонента имеют общий эффект (Сопротивление молнии), мягкий эффект возвращает этот эффект с добавлениемсила этих двух эффектов. Так что возвращается: «Resist Lightning (7/10)»

Вот мой первый вопрос: как я могу преобразовать это в код Swift? Я пробовал много способов, но ничего полезногоЯ пытался использовать массивы, словари, массивы в словарях, но я все еще сталкиваюсь с той же проблемой: как я могу приписать несколько параметров (в данном случае эффектов) и типы (String для имени эффекта и Int для его эффективности)) к экземпляру? (Если это правильный вопрос). Мой второй вопрос: Как я могу сравнить ключи (не значения) словаря, чтобы соответствовать результату?

Может быть, так, используя словарь, ноМне нужно отобразить в результате не только значение ключа в словаре, но и сам ключ. Кроме того, мне нужно сравнить ключи, а не значения:

let grapeHolly: [String: Int] = ["Cure Disease": 5, "Resist Cold": 4, "Heighten Medicine": 4, "Resist Lightning": 3, "Force Damage": 2]

И, делая это, я получаю сообщение об ошибке «Не удается использовать элемент экземпляра grapeHolly в свойстве инициализатора свойства».И если я помещу эту строку в тело функции 'viewDidLoad ()', она не распознается кодом, который не находится внутри функции.

Пользовательский интерфейс приложения

Чтобы быть понятным и понятным, я хочу, чтобы, когда пользователь выбирает два или более ингредиента из второго всплывающего меню (первая строка всплывающих окон предназначена для классификации ингредиентов на три категории "Common / Uncommon / Rare "), и когда он нажимает кнопку" Сделать зелье ", текстовое поле результата отображает результат комбинации значений обоих эффектов, если они, конечно, имеют общий эффект.

Скажите, если вам нужно, чтобы я был более точным, я буду очень рад найти помощь:)

Вот код (не заботится о длине списка ингредиентов):

import Cocoa

class ViewController: NSViewController {

@IBOutlet weak var ingredientRarityNorthlands: NSPopUpButton!
@IBOutlet weak var ingredientListNorthlands: NSPopUpButton!

    @IBAction func ingredientRarityNorthlands(_ sender: NSPopUpButton) {
    if ingredientRarityNorthlands.titleOfSelectedItem == "Common" {
        ingredientListNorthlands.removeAllItems()
        ingredientListNorthlands.addItems(withTitles: ingredientListNorthlandsCommon)
    }
    if  ingredientRarityNorthlands.titleOfSelectedItem == "Uncommon" {
        ingredientListNorthlands.removeAllItems()
        ingredientListNorthlands.addItems(withTitles: ingredientListNorthlandsUncommon)
    }
    if ingredientRarityNorthlands.titleOfSelectedItem == "Rare" {
        ingredientListNorthlands.removeAllItems()
        ingredientListNorthlands.addItems(withTitles: ingredientListNorthlandsRare)
    }
}

let ingredientListNorthlandsCommon = ["Black Pepper", "Bolean Violet", "Brittlebush Flower", "Brittlebush Resin", "Butterfly Moss", "Cardamom", "Cinnamon",  "Cloves", "Colic Yellowcress", "Comb Mint", "Coriander (Leaves)", "Coriander (Seeds)", "Cork Tree Bark", "Crow Hood", "Cumin (Seeds)", "Desert Shrub", "Eucalyptus (Oil)", "Eucalyptus (Gum)", "Eucalyptus (Leaves)", "Eucalyptus (Seeds)", "Fire Itchweed", "Four-Leafed Colwort", "Frukmoot", "Ginger (Root)", "Jasmine (Flower)", "Life's Collard", "Lotus (Petals)", "Lotus (Seeds)", "Mango (Leaves)", "Mango (Taproot)", "Marigold (Flower)", "Marigold (Leaves)", "Mustard (Flower)", "Mustard (Greens)", "Mustard (Seeds)", "Nutmeg (Oil)", "Nutmeg (Seed)", "Radiant Azolla", "Red Chili (Seeds)", "Wall Snakeberry"]
let ingredientListNorthlandsUncommon = ["Aloe Vera", "Ash Gallberry", "Baby Zinnia", "Black Salt", "Buzzard Bile", "Corea Mint", "Dead Sage", "Dog Tongue", "Fennec Fox Droppings", "Giant Lizard Venom", "Marsupial Wolf Blood", "Noxious Laurel", "Ocort", "Orange Thyme", "Pale Penny Gilliflower", "Phoenix Briar", "Pocan Hemp", "Prickly Cane", "Serpent Rye", "Shivering Laurel", "Snage", "Two-Tongued Scorpion Tail", "Viper Venom"]
let ingredientListNorthlandsRare = ["Blackheart Flower", "Burrowing Vee Spider", "Jee Redzin Scorpion Eggs", "Kreetlee Leaves", "Olaart Buds", "Smouse Oil", "Wretch Salts", "Zettin Seeds"]


    @IBAction func makeAPotion(_ sender: NSButton) {
    if potionButton.isEnabled {
        resultField.stringValue = result()
    }

}

func result() -> String {
    return "\(effect) \(value)"
}
}

Ps: я думаю, что в этом нет необходимости, но я поставил здесь систему бросков костей:

var firstEffect = 10..<12
var secondEffect = 12..<15
var thirdEffect = 15..<20
var fourthEffect = 20..<25
var fifthEffect = 25...

var firstEffectEnabler: Bool = false
var secondEffectEnabler: Bool = false
var thirdEffectEnabler: Bool = false
var fourthEffectEnabler: Bool = false
var fifthEffectEnabler: Bool = false

@IBAction func diceRoll(_ sender: NSTextField) {
    if diceRoll.stringValue == "\(firstEffect)" {
        firstEffectEnabler = true
    }
    if diceRoll.stringValue == "\(secondEffect)" {
        secondEffectEnabler = true
    }
    if diceRoll.stringValue == "\(thirdEffect)" {
        thirdEffectEnabler = true
    }
    if diceRoll.stringValue == "\(fourthEffect)" {
        fourthEffectEnabler = true
    }
    if diceRoll.stringValue == "\(fifthEffect)" {
        fifthEffectEnabler = true
    }
}

РЕДАКТИРОВАТЬ: Так что я попробовал это, но я думаю, что это немного грязно и не очень оптимизировано, иЯ действительно не знаю, может ли это сработать.Кроме того, есть еще две проблемы: я не знаю, как отобразить строку «Grape Holly» в массиве списка ингредиентов и во всплывающем меню вместо «grapeHolly», и как исправить «потенцию = grapeHolly [?] "строка:

lazy var grapeHolly = ["Cure Disease": 5, "Resist Cold": 4, "Heighten Medicine": 4, "Resist Lightning": 3, "Force Damage": 2]

lazy var effect = Array(grapeHolly.keys)
var result: String = ""
lazy var potency = grapeHolly[]

func compare()  {
func resultNorthlands() {
    if ingredientListNorthlands.selectedItem?.doesContain(effect) == ((ingredientListMettina.selectedItem?.doesContain(effect))! || (ingredientListIsjord.selectedItem?.doesContain(effect))! || (ingredientListKaedmyr.selectedItem?.doesContain(effect))! || (ingredientListCouchant.selectedItem?.doesContain(effect))! || (ingredientListBlastlands.selectedItem?.doesContain(effect))!) {
        var result = "\(effect)"
    }
}

Я думаю, что-то может работать, но я получаю ошибку " Невозможно добавить значение типа '[String: Int]' с индексом типа '[String] '" на " ленивая переменная сила = grapeHolly [эффект] ".Я не очень понимаю, почему ... "dictionary [ключ]" - это не способ получить значение ключа в словаре?Кроме того, мне нужно ввести "grapeHolly" вместо "Grape Holly" в моем списке ингредиентов, кто-нибудь знает способ исправить это?(Я создал словарь 'grapeHollys' с орфографическими ошибками, за исключением эффекта "Cure Disease", чтобы сопоставить обе линии эффектов, как показано в функции 'compare ()' )

О функции 'compare ()' : я повторил столько же раз, сколько и список ингредиентов, но изменил имя первого списка ингредиентов (в этом случае attributeListNorthlands) для каждого повторения функции,сравнивать каждый список ингредиентов перед оператором '==' с другими списками, так что он немного длинный и повторяющийся, и я знаю, что программист не имеет привычки повторяться, но это все, что япока не нашел.

Но сейчас я не могу собрать из-за ошибки, поэтому я не могу проверить эффективность кода, поэтому я прошу вас немного помочь :) Здесьэто код:

//Properties
var result: String = ""
lazy var potency = grapeHolly[effect]
lazy var effect = Array(grapeHolly.keys)

lazy var grapeHolly = ["Cure Disease": 5, "Resist Cold": 4, "Heighten     Medicine": 4, "Resist Lightning": 3, "Force Damage": 2]
lazy var grapeHollys = ["Cure Disease": 5, "Resist Cld": 4, "Heighten Mediine":     4, "Resist Lightnng": 3, "Force Damge": 2]

// Compare Function
func compare()  {
func resultNorthlands() {
    if ingredientListNorthlands.selectedItem?.doesContain(effect) == ((ingredientListMettina.selectedItem?.doesContain(effect))! || (ingredientListIsjord.selectedItem?.doesContain(effect))! || (ingredientListKaedmyr.selectedItem?.doesContain(effect))! || (ingredientListCouchant.selectedItem?.doesContain(effect))! || (ingredientListBlastlands.selectedItem?.doesContain(effect))!) {
        var result = "\(effect) \(potency1 + potency2)"

    }
}

    //Potion Button
@IBAction func makeAPotion(_ sender: NSButton) {
    compare()
    if potionButton.isEnabled {
        resultField.stringValue = result
    }

}

1 Ответ

0 голосов
/ 20 декабря 2018

Проблема решена!Решение было настолько очевидным, что я не думал об этом напрямую, о циклах for-in!Я надеюсь, что это поможет всем, кто сталкивается с той же проблемой.Вот соответствующий код:

var selection = [
    catClawBark: ["Resist Lightning": 5, "Resist Damage": 8],
    grapeHolly: ["Resist Lightning": 6, "Resist Damage": 2]
]

for (ingredient, keys) in selection {
for key in keys {
    for (ingredient2, keys2) in selection {
        for key2 in keys2 {
            if ingredient != ingredient2 {
                if key.key == key2.key {
                    result = "You created a potion !\n---> \(key.key) \(key.value + key2.value) <---"
                }
                else {
                    result = "No match. Check the ingredients selected or retry when you have more !"
                }
            }
        }
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...