Каков общий способ помещения в текст различного количества переменных?

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

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

например, игрок получает больше урона от «заполнителя» и наносит больше урона от «заполнителя». (две переменные). Затем у класса черт есть список из двух чисел, которые я буду использовать для замены этого слова «заполнителя».

например, игрок получает меньше критического урона «заполнителя», наносит больше урона «заполнителю» и имеет больше шанса критического удара «заполнителя». (три переменные)

Я использую String.Split() и перебираю список, чтобы найти каждое слово-заполнитель, а затем заменяю их каждым значением переменной.

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

попробуйте что-нибудь вроде int high = 100; int low = 0; Debug.Log($"I want to test {high} and {low} numbers");

BugFinder 03.07.2024 12:27

вам не нужен общий способ сделать это, а просто использовать ООП-механику, а именно: у Player есть количество живых (вероятно, число), у него / нее есть Name (обычно string) и раздает немного Damage (опять число). Если у вас есть эти свойства, вы можете объединить их, например, с помощью строковой интерполяции.

MakePeaceGreatAgain 03.07.2024 12:32

Интерполяция строк @BugFinder работает для одного конкретного текста, скажем, у меня есть два элемента с 2 модификаторами и 10 модификаторами, могу ли я использовать для этого одну функцию?

Haotian Song 03.07.2024 12:38

вы можете использовать функции или что-то еще внутри {}

BugFinder 03.07.2024 13:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Подход «Заполнитель» является правильным. Его лучше назвать «Замещающие переменные». Определите общий синтаксис для идентификации замещающих переменных. Вы можете использовать что-то вроде {{replacement_variable_name}}.

Затем вместо использования String.Split() вы можете использовать Regex, чтобы найти все заменяющие переменные и заменить их фактическими значениями.

Вот пример

public string GetResultantString(string input)
{
    var tokens = Regex.Matches(input, @"{{[\w\s]+}}");
    return ReplaceTokens(input, tokens);
}

private string ReplaceTokens(string input, MatchCollection tokens)
{
    for(int i = 0; i < tokens.Count; i++)
    {
        var token = tokens[i].Value;
        var tokenName = token.Replace("{{", "").Replace("}}", "");

        var tokenValue = GetTokenValue(device, tokenName);
        input = input.Replace(token, tokenValue);
    }

    return input;
}

private string GetTokenValue(string tokenName)
{
    switch(tokenName)
    {
        case "DamageTaken": //return the damage taken
        case "DamageDealt": //return the damage dealt
        ...and so on
    }
}

Тогда ваша входная строка будет выглядеть как player takes {{DamageTaken}} more damage and deals {{DamageDealt}} more damage.

на самом деле это не совсем правильный подход. Локализация намного лучше, потому что она позволяет выполнять более сложные преобразования, а также упрощает последующий перевод на другие языки. Все хорошие фреймворки имеют встроенную поддержку локализации.

phuclv 08.07.2024 11:38

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