C# 动态if语句?

C# 动态if语句?,c#,if-statement,C#,If Statement,我正在制作一个生命克隆游戏(无法链接wiki,因为它已关闭)。基本功能已经完成,但我想让用户也可以选择定义自己的规则。生活游戏的标准规则是: 有两个或三个邻居的牢房还活着 具有0-1和4-8个邻居的单元死亡 有3个邻居的死细胞变为活细胞 使用2个if语句很容易做到这一点。但用户也可以定义如下内容: 有1-3或5-7个邻居的细胞继续存活 另一个号码的细胞死亡 有2个或4个邻居的死细胞变为活细胞 如何在if语句中实现这一点?我能用一些清单来核对一下吗 编辑:我在这里看到了一些很棒的解决方案。必须确定

我正在制作一个生命克隆游戏(无法链接wiki,因为它已关闭)。基本功能已经完成,但我想让用户也可以选择定义自己的规则。生活游戏的标准规则是:

有两个或三个邻居的牢房还活着

具有0-1和4-8个邻居的单元死亡

有3个邻居的死细胞变为活细胞

使用2个if语句很容易做到这一点。但用户也可以定义如下内容:

有1-3或5-7个邻居的细胞继续存活

另一个号码的细胞死亡

有2个或4个邻居的死细胞变为活细胞

如何在if语句中实现这一点?我能用一些清单来核对一下吗

编辑:我在这里看到了一些很棒的解决方案。必须确定什么最适合我的代码。对于仍然回答这个问题的人:我可以正确处理用户输入,不用担心;)

我可能会有一个窗口,在那里我会问
有多少邻居还活着?
有多少邻居死后还活着?
,还有一些文本框。这些还将检查输入是否有效


(这是Unity3D中的C)

我要用Propogate、Die、NoChange等值定义一个枚举

然后创建一个列表/数组,每个可能的邻居数(0到8)对应一个该类型的元素。然后,用户可以通过某种方式设置此列表(可能是一个逗号分隔的枚举列表,作为字符串,拆分后转换为枚举类型)

然后你所要做的就是数一数邻居,然后执行查找并相应地采取行动

var UserActionList =
    "Die, Die, NoChange, NoChange, Propogate, Propogate, Die, Die, Die"
    .Split(',').Select(s => Enum.Parse(typeof(CellAction), s).ToArray();

// Count neighbours

swtich(UserActionList[NeighboursCount])
{
    case Die:
    /////

    case Propogate:
    /////
}

你应该有一门课

class DyingRule
{

   enum RuleResult{ Neutral , Death , Lives}; 

   //evaluates if according to this rule
   //death occurs.. pass parameter as needed
   RuleResult Evaluate();
}
在代码的某个地方,您维护了它们的向量。用户可以自由附加向量并添加自己的规则

你把他们评价为

foreach ( currentRule in Rules )
   {
          RuleResult r = currentRule.Evaluate();
           if ( r ==  Death )
           {
                 ProcessDeath();
                 break;
           }
          else if ( r == Lives )
          {
                ProcessLiving();
                break;
          }
   } 

或者,您可以对规则具有优先级,并根据规则取代另一规则对其进行排序。好的,主要问题是“Cell with other number”子句。有两种选择

-只是不允许使用该子句,并让用户确切地指定数字的用途

-最后将该子句作为特例处理,并为其指定任何当前未指定的值

我实现它的方法是使用一个#neights=>IAction数组(IAction是相同的,Kill或Grow)。由于可能的邻居计数数量非常有限,因此可以很容易地从给定数据填充映射,然后甚至不需要任何if语句,只要直接调用索引处的IAction(如果数组与当前邻居数关联)。

尝试解决方案matix

bool life[] = new bool[] {false, false, true, true, false, false, false, false, false};
bool die[] = new bool[] {true, true, false, false, true, true, true, true, true};
bool alive[] = new bool[] {false, false, false, true, false, false, false, false, false};

bool shouldLife=live[count];
bool shouldDie=die[count];
bool getAlive=alive[count];

这更多的是面向对象和设计模式问题。在这里,您需要类似于策略模式的东西


我只会检查那些会导致细胞死亡的情况。我将按照以下思路构建我的职能:

bool CalculateIfDead(Cell c, int[] deadlyCountRules)
{       
   foreach(int n in deadlyCountRules)
   {
      if(c.NeighbourCount == n)
      {
         return true;
      }
   }
   return false;
}

如果允许用户定义无限数量的规则,您可能需要翻译、验证用户定义并创建一个包含类的C#代码文件,并通过C#的CodeDom提供程序运行它,编译成程序集,然后执行。此文件应返回从用户定义生成的所有if语句的结果


如果选项数量有限,您可以保存一个文件,其中保存一个向量,该向量包含导致死亡的所有组合的二进制数组。

用户可以定义多少个不同的选项?它是有限的还是无限的选择?关于维基百科被关闭;这只是该网站的英文版。您可以通过另一个版本(即西班牙语版本)访问它,并使用Google Chrome的翻译功能查看它。或者,你可以通过谷歌的缓存系统访问几天以前的英文页面缓存版本。最后,如果在浏览器中禁用JavaScript,则可以访问英文版本。@O.D:选项数量有限。每个单元格都有8个邻居,规则是基于这8个邻居中的一些是否还活着。@SimonVerbeke:没错,这就是为什么有一个相当简单的解决方案。(一个长度为9的数组(处理0个邻居),指示在每种情况下要采取的操作)。很好的解决方案。每次调用第一行都有点不雅观。这只是用户输入的一个例子。您可以在用户输入发生更改时创建数组,并进行错误检查等。这似乎是目前最好的解决方案,不过需要对我的代码进行一些修改:)您还需要另一种方法,允许它决定是传播还是什么都不做,以及检查没有多少邻居将这两个函数计算为true。