rust 一维阵列的康韦生命博弈

vyu0f0g1  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(129)

现在我正在用Rust为WebAssembly编写tutorial。任务是在Rust中实现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]数组进行迭代。
我已经试着把迭代值打印出来,并在纸上画出网格来形象化这个过程,现在我还试着实现一个自己编写的函数,以便更好地理解上面函数的选择。
也许你已经解决了这个或类似的问题,可以给予我一个提示是怎么回事。
谢谢你的阅读,祝你周末愉快!

tvokkenx

tvokkenx1#

由于无符号整数(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之前的行(在边缘处具有回绕)。

lb3vh1jj

lb3vh1jj2#

输入:
| self.height| self.width|行|管柱|
| - ------| - ------| - ------| - ------|
| 六十四|六十四|四个|六个|
最初,delta_row创建一个数组,该数组将包含[64 - 1 = 63,0,1],并且它将在每次迭代中将delta_row替换为一个值,因此迭代将如下所示:
| 增量行|增量列|相邻行|内博尔科尔|idx公司|
| - ------| - ------| - ------| - ------| - ------|
| 六十三|六十三|4 + 63% 64 = 3| 6 + 63% 64 = 5|获取索引(3,5)|
| 六十三|无|三个|六个|获取索引(3,6)|
| 六十三|1个|三个|七|获取索引(3,7)|
| 无|六十三|四个|五个|获取索引(4,5)|
| 无|无|续|续|续|
| 无|1个|四个|七|获取索引(4,7)|
| 1个|六十三|五个|五个|获取索引(5,5)|
| 1个|无|五个|六个|获取索引(5,6)|
| 1个|1个|五个|七|获取索引(5,7)|
看看它是怎么在你的行和列周围画出一个空心的正方形的,计数是由self.cells [idx]增加的,self.cells [idx]总是0或者1,由枚举定义,所以那些活着的会增加计数。

相关问题