[英]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和设计模式问题。 在这里你需要类似于策略模式的东西。
好吧,如果允许用户定义无限数量的规则,您可能需要翻译,并验证用户定义并创建包含类的C#代码文件,并通过C#的CodeDom提供程序运行它,编译成程序集,然后执行。 如果从User定义生成的Statetments,此文件应返回所有结果。
如果选项数量有限,您可以保存一个文件,在该文件中保存Vector,其中包含导致死机的所有组合的二进制数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.