康威生命游戏:如何初始化方格?

2024-05-19 00:01:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个函数nextGen,它接受一个参数(当前网格),然后计算但不打印新网格。基本上,我不知道如何进行检查位,它检查周围的9个单元格。首先,我想我可以创建一个完全由0组成的基本网格,它比当前网格大2行2列,这样它就会成为一个0的边界,但是我不知道如何将初始网格的值放入基础网格中。我目前的代码是:

def initlist(positions,initval):
    newlist = []
    for i in range(0,positions):
        newlist.append(initval)
    return newlist

def init2DTableV3(rows,cols,initval):
    newrow = initlist(cols,initval)
    table = initlist(rows,newrow)
    return table

def nextGen(current_grid):
    rows = len(current_grid)
    cols = len(current_grid[0])
    base_value = 0
    base_grid = init2DTableV3(rows + 2, cols + 2, base_value)
    import copy
    init_newgrid = copy.deepcopy(current_grid)

有人能帮我吗?我是Python的初学者,如果有人能解释如何使用基本的Python函数来生成nextGen,那就太好了。在


Tags: 函数网格basereturndefcurrentgridrows
2条回答

另一种方法是使用已经存在的内容,而不是添加额外的元素。在

我最近用javascript写了一个Life的副本,但是想法是一样的。每个单元由其坐标标识,并用其相邻坐标的对象(Python:dictionary)初始化。在

makeCell(x, y) {
    let div = $('<div></div>');
    let id = "x" + x + "y" + y;

    let neighbors = this.getNeighbors(x, y);

    let attributes = {
                "id": id,
                "data-entity": _entity.id
        }

    $("#grid").append(div);
}

function getNeighbors(x, y) {
    let leftX =     x - 1;
    let rightX =    x + 1;
    let topY =      y - 1;
    let bottomY =   y + 1;

    // neighbor positions
    let neighbors = [
        "#x" + leftX + "y" + topY,
        "#x" + x + "y" + topY,
        "#x" + rightX + "y" + topY,
        "#x" + leftX + "y" + y,
        "#x" + rightX + "y" + y,
        "#x" + leftX + "y" + bottomY,
        "#x" + x + "y" + bottomY,
        "#x" + rightX + "y" + bottomY,
    ];
    return neighbors;
}

最后,所有的活细胞都被存储在一个列表中。每一个活细胞和它的每一个邻居都被检查来计算它各自的活邻居细胞。在

^{pr2}$

以及生命的检查条件:

this.setNextLife = function(_count) {
    if (this.alive) {

        if (_count == 2 || _count == 3) {
            return this.age++;
        } else {
            changes.push(this);
            return;
        }

    } else {
        changes.push(this);
    }
}

其中changes是要切换的单元格列表bool活动/死亡。在

如果我理解正确的话,你有一个基本的网格,你不知道如何在边上加上0,对吗?在

有时候,先在一维中考虑问题,然后再看看是否有可能将其扩展到二维,这样一来,一维网格看起来像

1 0 0 1 0 0 0 0 1 0 1

如果你想在数组的每一端加一个0,它看起来应该是

^{pr2}$

假设您只使用标准的Python列表,这很容易做到。您只需使用^{}在开头插入,使用.insert()或{}在结尾插入。在

>>> L = [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1]
>>> L.insert(0,0)
>>> L.append(0)
>>> L
[0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0]

所以让我们用2D列表来做同样的事情,看看会发生什么:

>>> M = [[1,1],[1,1]]
>>> M.insert(0,[0,0])
>>> M.append([0,0])
>>> M
[[0, 0], [1, 1], [1, 1], [0, 0]]

所以,这在顶部和底部给出了一行0,但是我们没有左边和右边。我们马上处理。当我添加顶行和底行时,我显式地给了它所需的零数(即[0,0])。但是,只需使用行的长度就可以轻松地自动执行此操作:

>>> M = [[1,1],[1,1]]
>>> M.insert(0,[0]*len(M[0]))
>>> M.append([0]*len(M[0]))
>>> M
[[0, 0], [1, 1], [1, 1], [0, 0]]

现在,每个行向量的长度只有2,但应该是4。一种简单而明确的方法是循环子列表并插入并追加0:

>>> for r in M:
...     r.insert(0,0)
...     r.append(0)
... 
>>> M
[[0, 0, 0, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0]]

你会给你填好的2D列表。在


但是,一般来说,我建议在这些任务中使用numpy,因为您可以简单地在2D numpy数组上使用^{},但是更复杂的操作也会更快,并且数组更容易索引,等等

相关问题 更多 >

    热门问题