(想不出更好的标题,随意将其编辑成更能描述问题的标题)
我有以下方法:
bool CalculateNewState(int adjacent, bool currentState)
{
if (currentState == true)
{
foreach (int n in liveRule)
{
if (adjacent == n)
{
return true;
}
}
return false;
}
else
{
foreach (int n in becomeAliveRule)
{
if (adjacent == n)
{
return true;
}
}
return false;
}
}
这是针对game of life克隆的。我想要实现的是用户可以制定自己的规则。
bool currentState
告诉方法细胞是否存活。 int adjacent
告诉方法该单元有多少个活着的邻居。
我想要实现的是当用户说:
2,3 and 5 neighbors keep the cell alive
。它会遍历一个包含liveRule
的数组(2,3 and 5
)。如果发生任何匹配,则应返回true
,否则返回false
。
这里发生的是,在返回true之后,它会继续迭代并最终返回liveRule
中的最后一个元素是否匹配。
我需要做什么,在匹配发生后停止迭代?
我当然可能采取错误的方法解决这个问题。我从建议here开始。
(试图尽我所能描述它,但似乎还不太清楚)
这是Unity3D中的C#。
答案 0 :(得分:6)
您实施的代码说“如果相邻不等于2,3或5中的任何一个,则返回”。显然邻近不能等于所有!
重新开始。重命名您的方法,使它们更清晰。布尔应该回答一个真/假的问题,所以选择提出问题的名字:
bool IsCellAlive(int adjacentCount, bool isAlive)
{
if (isAlive)
return liveRule.Contains(adjacentCount);
else
return deadRule.Contains(adjacentCount);
}
“Contains”比foreach循环慢,因此可能会导致性能问题。现在不要担心;你还没有得到代码正确。编写代码,使其明显正确,然后使用分析器找到慢点,如果它不够快。
记住:让它正确,然后说清楚,然后快速。
答案 1 :(得分:1)
您的return
语句会立即退出CalculateNewState
方法。如果您发现迭代仍在继续,则要么您没有点击return
语句(adjacent == n
永远不会出现),或者可能会从代码中的其他位置重复调用CalculateNewState
。 / p>
您可以更简单地将其重写为:
if (currentState)
return liveRule.Contains(adjacent);
return becomeAliveRule.Contains(adjacent);
答案 2 :(得分:1)
你可以随时使用“break”语句来终止循环。做类似的事情:
bool CalculateNewState(int adjacent, bool currentState)
{
if(currentState)
{
return IsStateMatch(adjacent, liveRule);
}
else
{
return IsStateMatch(adjacent, becomeAliveRule);
}
}
bool IsStateMatch(int adjacent, int[] rules)
{
bool finalState = false;
if(rules != null)
{
for(int i = 0; i < rules.length; i++)
{
if(adjacent == rules[i])
{
finalState = true;
break;
}
}
}
return finalState;
}
为了便于阅读,我把方法分解了一点,但我认为这是基本的想法。现在,我同意其他海报关于可能发生的事情。如果你的循环在中断/返回语句之后继续,那么你很可能在其他地方错误地调用该方法的错误代码。
答案 3 :(得分:0)
看起来你的平等测试是罪魁祸首......你不应该测试adjacent == n
而不是adjacent != n
吗?这样,它将为匹配返回true,如果不匹配则仅返回false。
返回退出循环后,迭代器不会继续。
答案 4 :(得分:0)
你可以使用for循环代替foreach和其他变量吗?
bool CalculateNewState(int adjacent, bool currentState)
{
if (currentState == true)
{
bool match = false;
for(int n = 0; n < liveRule.length && !match; n++)
{
if (adjacent != n)
{
match = true;
}
}
return match;
}
else
{
bool match = false;
for(int n = 0; n < becomeAliveRule.length && !match; n++)
{
if (adjacent != n)
{
match = true;
}
}
return match;
}
}