我正在开发一个生命游戏克隆(无法链接维基,因为它已经失效)。基本功能已完成,但我想让用户也可以选择定义自己的规则。标准的生命游戏规则是:
有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#)
答案 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和设计模式问题。在这里你需要类似于策略模式的东西。
答案 6 :(得分:0)
如果允许用户定义您可能需要翻译的无限数量的规则,并验证用户定义并创建包含类的C#代码文件,并通过C#的CodeDom提供程序运行它,编译成程序集,并执行。如果从用户定义生成的状态,则此文件应返回所有结果。
如果选项数量有限,您可以保存一个文件,在该文件中保存Vector,其中包含导致死亡的所有组合的二进制数组。