带有一维数组的 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 的这个实现中,单元格网格表示为一维数组。此函数的任务现在是获取坐标(row
和 column
)并围绕该坐标的邻居进行迭代。因为数组只是一维的,所以任务需要 delta_row
和 delta_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
之前的行(边缘环绕)。
现在我正在用 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 的这个实现中,单元格网格表示为一维数组。此函数的任务现在是获取坐标(row
和 column
)并围绕该坐标的邻居进行迭代。因为数组只是一维的,所以任务需要 delta_row
和 delta_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
之前的行(边缘环绕)。