带有一维数组的 Conways 生命游戏

Conways game of Life with 1D array

现在我正在用 Rust tutorial for WebAssembly with Rust. The task is to implement Conways Game of Life 做这个。编写像 Rust 这样的低级语言对我来说是新的,但根据我以前的编码经验,我理解大部分语法。

我遇到的问题是关于这个函数的逻辑:

    fn live_neighbor_count(&self, row: u32, column: u32) -> u8 {
        let mut count = 0;
        for delta_row in [self.height - 1, 0, 1].iter().cloned() {
            for delta_col in [self.width - 1, 0, 1].iter().cloned() {
                if delta_row == 0 && delta_col == 0 {
                    continue;
                }

                let neighbor_row = (row + delta_row) % self.height;
                let neighbor_col = (column + delta_col) % self.width;
                let idx = self.get_index(neighbor_row, neighbor_col);
                count += self.cells[idx] as u8;
            }
        }
        count
    }

Conways Game of Life 的这个实现中,单元格网格表示为一维数组。此函数的任务现在是获取坐标(rowcolumn)并围绕该坐标的邻居进行迭代。因为数组只是一维的,所以任务需要 delta_rowdelta_col 迭代数组以计算邻居。

我现在的问题是理解为什么选择这些数组 [self.height - 1, 0, 1][self.height - 1, 0, 1] 进行迭代。

我已经尝试打印出迭代值并在一张纸上绘制网格以可视化该过程。现在我也尝试实现一个自己编写的函数,以便更好地理解上述函数的选择。

也许你已经解决了这个或类似的问题,可以给我一些提示。

感谢阅读,祝周末愉快!

由于无符号整数 (u32) 的限制,最终看起来有点奇怪。我们要写的是

for delta_row in [-1, 0, 1]

它给出了我们原来的 1 以内的每一行,但是我们不能使用 -1 因为它有一个符号。稍后注意我们

let neighbor_row = (row + delta_row) % self.height;

所以我们实际上是在有效地使用整数模 self.height。在本例中,-1 = self.height - 1,因此我们可以自由替换后者(这对于 u32 是合法的)。

查看此内容的一种简单方法是稍后替换它。在 delta_row = self.height - 1 的迭代中,我们正在做

let neighbor_row = (row + self.height - 1) % self.height;
                 = (row - 1) % self.height - self.height % self.height;
                 = (row - 1) % self.height;

这是 row 之前的行(边缘环绕)。