动态if语句?

时间:2012-01-18 14:01:27

标签: c# 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#)

7 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

你应该拥有的东西就像一个类

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

您可以选择优先处理规则,并根据规则取代另一个规则对其进行排序

答案 4 :(得分:0)

嗯,主要问题是" Cell与另一个号码 _ "条款。有两种选择。

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

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

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