动态if语句?

我正在开发一个生命游戏克隆(无法链接维基,因为它已经失效)。 基本function已完成,但我想让用户也可以选择定义自己的规则。 标准的生命游戏规则是:

有2或3个邻居的牢房继续生活。

具有0-1和4-8个邻居的小区死亡。

有3个邻居的死细胞变得活着。

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

与1-3或5-7邻居的细胞保持生活。

细胞与另一个数字死亡。

有2或4个邻居的死细胞变得活着。

我如何在if语句中实现它? 我可以使用某种列表进行检查吗?

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

我可能会有一个窗口,我问How many neighbors to stay alive?How many neighbours to become alive when dead? ,有一些文本框。 这些也将检查输入是否有效。

(这是Unity3D中的C#)

我只会检查会导致细胞死亡的条件。 我会沿着这条线构建我的function:

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

尝试解决方案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]; 

我定义了一个值为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: ///// } 

好吧,主要问题是“Cell with another number _ ”子句。 有两种选择。

– 只允许使用该子句,并使用户准确指定数字的作用。

– 将该子句作为特殊情况处理,并为其分配任何当前未分配的值。

我实现它的方式是使用#neighbours => IAction(IAction是Same,Kill或Grow之一)的数组。 由于您只有非常有限数量的可能邻居计数,您可以轻松地从给定数据填充映射,然后您甚至不需要任何if语句,只需在索引处直接调用IAction(如果数组关联)与目前的邻居数量。

这是更多的OO和设计模式问题。 在这里你需要类似于策略模式的东西。

http://www.oodesign.com/strategy-pattern.html

你应该拥有的东西就像一堂课

 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; } } 

您可以选择具有规则优先级,并根据规则取代另一规则对其进行排序

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

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