Что я могу использовать вместо (Switch) здесь? - PullRequest
5 голосов
/ 26 февраля 2020
public int[] Level1Items(int floor)
{
    switch (floor) 
    {
        case 0:
        case 1:
        case 2:
        case 3:
        case 4: return CreateItems(0, 0, 0, 0, 0, 0);
        case 5:
        case 6: return CreateItems(1, 0, 0, 0, 0, 0);
        case 7:
        case 8:
        case 9: return CreateItems(1, 1, 0, 0, 0, 0);

    }
    return generationItems;
}

В основном у меня есть метод генерации уровней, при котором на определенных уровнях генерация будет меняться, и при этом будут появляться различные предметы. Уровни 0-4 не будут иметь дополнительного нереста, уровень 5-6 будет иметь 1 дополнительный X, а уровни 7-9 будут иметь 1X и 1Y и т. Д. c ..

Итак, прежде чем я go и сделаю дела От 10 до 99, есть ли лучший способ, которым я мог бы заняться этим? Может быть, с серией ifs, которые просто изменяют массив на указанных c этажах? Или есть что-то совсем другое, о чем я не задумывался.

Любые идеи были бы очень признательны:)

Редактировать 1: Спасибо всем за ваш вклад, действительно помог мне решить мою проблему и спасибо за все быстрые ответы тоже.

Я решил просто сохранить my int [] в моих GameData и использовать переключатель только для изменения его на указанных c этажах. Еще раз спасибо!

Ответы [ 5 ]

3 голосов
/ 26 февраля 2020

Если предположить, что каждый из шести параметров в вызове CreateItems будет иметь значение 0 или 1 (в зависимости от значения floor), то вы можете просто определить их значения следующим образом:

  1. Деление floor на требуемый уровень «отсечки» (целочисленное деление даст ноль для всего, что меньше этого уровня, и нецелое для всего, что равно или выше).
  2. Преобразуйте все ненулевые значения в 1 (оставив все нулевые значения без изменений).

Так, например, если мы используем временные переменные, p0 - p5 для параметров ( Вы также можете использовать массив), затем:

p0 = (floor / 5 > 0) ? 1 : 0;
p1 = (floor / 7 > 0) ? 1 : 0;
//... and so forth for the other 4 parameters/levels
return CreateItems(p0, p1, p2, p3, p4, p5);

Использование массива сделает код более элегантным, и вы даже можете поместить свои «обрезанные» уровни в другой массив, а затем получить al oop с таким кодом:

for (int i = 0; i < 6; i++) p[i] = (floor / cutoff[i] > 0) ? 1 : 0;
return CreateItems(p[0], p[1], p[2], p[3], p[4], p[5]);
2 голосов
/ 26 февраля 2020

На самом деле switch довольно эффективен, поскольку он компилируется в тип доступа «Словарь» (HashMap) и, следовательно, представляет собой единый доступ.


Конечно, вы также можете просто использовать if здесь как

public int[] Level1Items(int floor)
{
    if(floor <= 4) return CreateItems(0, 0, 0, 0, 0, 0);

    if(floor <= 6) return CreateItems(1, 0, 0, 0, 0, 0);

    if(floor <= 9) return CreateItems(1, 1, 0, 0, 0, 0);

    return generationItems;
}

, но для этого, отличного от switch, теперь требуется 3 int сравнения в худшем случае.

0 голосов
/ 26 февраля 2020

Используя оператор switch, вы могли бы написать его (C# 8) примерно так:

public int[] Level1Items(int floor) => floor switch
{
  var i when i <= 4 => CreateItems(0, 0, 0, 0, 0, 0),
  var i when i <= 6 => CreateItems(1, 0, 0, 0, 0, 0),
  var i when i <= 9 => CreateItems(1, 1, 0, 0, 0, 0),
  _ => generationItems
}

Не уверен, предпочел бы я эту опцию простым if или что-то вроде этого

public int[] Level1Items(int floor) =>
    (i <= 4) ? CreateItems(0, 0, 0, 0, 0, 0) :
    (i <= 6) ? CreateItems(1, 0, 0, 0, 0, 0) :
    (i <= 9) ? CreateItems(1, 1, 0, 0, 0, 0) :
    generationItems;
0 голосов
/ 26 февраля 2020

Лично я считаю, что жесткое кодирование этих значений - неправильная идея.

Если потенциальное число уровней велико, лучший способ решить эту проблему - это некая обобщенная формула c, которая вычислит каждый параметр основан на номере уровня.

0 голосов
/ 26 февраля 2020

Обычно вы можете сохранить уровень: элементы соединяются в файл конфигурации, может быть json или xml, и читать конфигурацию во время выполнения на основе уровня и пола

...