繁体   English   中英

动态if语句?

[英]Dynamic if-statement?

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

有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#)

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

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

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

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 another number _ ”子句。 有两种选择。

- 只允许使用该子句,并让用户准确指定哪些数字做什么。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM