5
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 等等。

因此,在我将案例 10 一直到 99 之前,有没有更好的方法可以解决这个问题?也许有一系列 ifs 只是改变特定楼层的阵列?或者有什么完全不同的东西,我没有想到。

任何想法将不胜感激:)

编辑1:感谢大家的投入,真的帮助我解决了我的问题,也感谢所有的快速回复。

我决定简单地将我的 int[] 保存在我的 GameData 中,并仅使用开关在特定楼层进行更改。再次感谢!

4

5 回答 5

3

假设调用中的六个参数中的每CreateItems一个的值都是01(取决于 的值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);

使用数组会使代码更优雅,您甚至可以将“截止”级别放在另一个数组中,然后使用如下代码进行循环:

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]);
于 2020-02-26T12:54:24.353 回答
2

实际上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 比较。

于 2020-02-26T13:19:27.933 回答
0

我个人认为,硬编码这些值是错误的想法。

如果潜在级别数很高,解决此问题的最佳方法是某种通用公式,它将根据级别数计算每个参数。

于 2020-02-26T13:29:34.857 回答
0

使用 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
}

不确定,如果我更喜欢这个选项而不是简单的 ifs 或类似的东西

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;
于 2020-02-26T14:00:47.787 回答
0

基本上,您可能希望将 level:items 对存储到配置文件中,可能是 json 或 xml,并在运行时根据 level 和 floor 读取配置

于 2020-02-26T12:43:33.670 回答