非常感谢所有帮助,非常感谢大家。这是一个很棒的社区
答案 0 :(得分:1)
看起来你只使用一个网格,你需要第二个网格,将细胞放在下一个状态......
答案 1 :(得分:1)
我注意到两个问题:
你的缩进已经关闭,}
放错了位置。重新格式化后,可以清楚地看到您没有覆盖所有情况,因此有些单元格没有获得新值。例如,如果一个单元格处于活动状态,则只处理具有2个或3个邻居的情况,但是else
没有if
,因此,活动单元格为1或4或者更多邻居永远不会更新。
你可能会认为,在某种程度上,代码会落入一般的“其他”,但事实上,它永远不会到达那里。所有单元格值都是“活着”或“死亡”。所以构造如:
if ( cell == aliveColor ) {
// Handle alive cell
} else if ( cell == deadColor ) {
// Handle dead cell
} else {
// Handle all other cases - but there are none!
}
相当于:
if ( cell == aliveColor ) {
// Handle alive cell
} else {
// Handle dead cell
}
原来的“其他”永远不会到达,因为除了“aliveColor”和“deadColor”之外没有其他情况。
回复您的修改:
if (cell == aliveColor)
{
if (aliveNeighbors == 2 || aliveNeighbors == 3){
val =1;
grid.setPos(row, column,val);
}
if (aliveNeighbors ==1 || aliveNeighbors == 4){
val = 0;
grid.setPos(row,column,val);
}
}
出于某种原因,您似乎认为每个细胞最多可能有4个邻居。再次查看实验室文档中的示例单元格:
⬜︎⬜︎⬛︎ ⬛︎⬜︎⬛︎ ⬛︎⬛︎⬜︎
这个细胞有 5 死邻居,还有3个活着的邻居。事实上,每个小区最多可以有8个邻居 - 对角线邻居也可以计算!
但你的规则是:
- 如果x是活着的并且恰好有2或3个活的邻居,则x存活到下一代。否则就会死。
- 如果x已经死了并且正好有3个活的邻居,那么x在下一代中是活着的。否则它仍然死了
醇>
此否则直接转换为编程中的else
。因此,不要让第二个if
具有互补条件(如果有1,4,5,6,7或8个活的邻居......),只需给出第一个else
:< / p>
if (aliveNeighbors == 2 || aliveNeighbors == 3) {
grid.setPos(row, column, aliveColor);
} else {
grid.setPos(row, column, deadColor);
}
当然,同样适用于死细胞的规则。
(请注意,我也删除了val=1
并且直接使用了这个值,val
是多余的。我还使用了解释值是什么而不是1和0的名称(如果你怎么办?想要改变游戏以使用绿色和红色)?)。
之前我没有注意到的一件重要事情:
do
{
row = 0;
column = 0;
generation = 0;
while (row <= gridSize-1){
while (column <= gridSize-1){
在行循环之前,将行和列初始化为零。
这意味着在第一行的末尾,column
保持gridSize-1
并且不会再次设置为零。所以实际上你只更新了一行,然后只更新了每一行的最后一列。
应该是:
do
{
row = 0;
generation = 0;
while (row <= gridSize-1){
column = 0;
while (column <= gridSize-1){
或者您可以使用for循环:
for ( row = 0; row < gridSize; row++ ) {
for ( column = 0; column < gridSize; column++ ) {
...
如果您选择这样做,请不要忘记从循环体内删除row++
和column++
,这样它们就不会增加两次。