Установка значения переменной в значение другой переменной - PullRequest
0 голосов
/ 19 февраля 2019

Я приведу пример того, чего я пытаюсь достичь.

Используя twine2 (с чего я начинал), я мог программно устанавливать и манипулировать переменными, напрямую ссылаясь на другие переменные как таковые (я будунемного объясните синтаксис для тех, кто не знаком с бечевкой).

Инициализируйте и установите мои переменные

  // data map is equivalent to dict
$Inv = (dm: potion, 0, bomb, 0, gold, 0);
  // array
$PossibleRewards =(a: potion, bomb, gold);
  // string
$Reward "";

Затем

set $Reward to (shuffled... $PossibleReward's 1st);
set $Inv's $Reward to it +1;

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

Конечно, вы можете пропустить строку и просто перейти

set $Inv's (shuffled... $PossibleReward's 1st to ot +1

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

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Если PossibleRewards является просто дубликатом значений Dictionary.Keys, то вам это может не понадобиться.Вы можете использовать класс Random, чтобы получить случайный элемент в словаре, используя метод словаря ElementAt (который возвращает KeyValuePair), установить Reward в Value этого элемента, а затем увеличить его.Value этого элемента в словаре:

Random rnd = new Random(); // Note: you typically only need one instance of Random in a class

// Create a dictionary of rewards and quantity
Dictionary<string, int> inventory = new Dictionary<string, int> 
    {{"potion", 0}, {"bomb", 0}, {"gold", 0}};

// Grab the Key of a random item in the dictionary for the reward
string reward = inventory.ElementAt(rnd.Next(inventory.Count)).Key;

// Increment the value at that Key
inventory[reward]++;

В противном случае, если список необходим (например, если Rewards является общим списком между экземплярами разных классов), тоиндивидуальный словарь инвентаря может быть инициализирован на основе списка.Самый простой способ - использовать метод расширения System.Linq, ToDictionary:

private static readonly Random Random = new Random();
private static readonly List<string> Rewards = new List<string> {"potion", "bomb", "gold"};

private static void Main()
{
    // Initialize an inventory dictionary based on the shared list of rewards
    var inventory = Rewards.ToDictionary(key => key, value => 0);

    // Grab the Key of a random item in the dictionary for the reward
    var reward = inventory.ElementAt(Random.Next(inventory.Count)).Key;

    // Increment the value at that Key
    inventory[reward]++;
}
0 голосов
/ 19 февраля 2019

Вот пост, в котором описывается перетасовка массива в C #: Лучший способ рандомизировать массив с помощью .NET .В ответах есть несколько вариантов.

Если у вас есть Dictionary<string, int> для вашего инвентаря (уже заполненного всеми возможными наградами), вы можете просто назначить его как inventory[possibleRewards[0]] += 1 или inventory[possibleRewards[0]]++

Однако я не буду перетасовывать массив каждый раз.Вместо этого я бы сгенерировал случайное число и использовал бы его для выбора индекса в массиве, например

var rand = new Random(); // do this once, e.g. in startup
// initialize possibleRewards array 

// in your reward method
var index = rand.Next(numberOfRewards);
inventory[possibleRewards[index]] += 1;

Если Twine2 пока что является вашим единственным знакомством с программированием, я бы предложил вводное руководство по C #хорошо вложено.

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