2D список не рассчитывается должным образом - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь сделать игру жизни. Есть такая странная ошибка, которую я не могу исправить, потому что не знаю, в чем проблема? Я предполагаю, что это в l oop? Я действительно не знаю. Я попытался отладить его с помощью печати if total> 0 (total), а всего было 2, когда это должно было быть 3. Извините, если я объясняю это сбивающим с толку, потому что я тоже запутался.

def test():
    board = [[0, 0, 0, 0, 0],
             [0, 0, 1, 0, 0],
             [0, 0, 1, 0, 0],
             [0, 0, 1, 0, 0],
             [0, 0, 0, 0, 0]]

    #Tracking the neighbor, it shows that there is 3 alive neighbors in 
    #here.
    print(board[2][1])
    print(board[2-1][1+1])
    print(board[2][1+1])
    print(board[2+1][1+1])

    return board

def update(grid, N):
    newGrid = grid.copy()
    for i in range(N):
        if i == 0 or i == 4:
            continue
        for j in range(N):
            if j == 0 or j == 4:
                continue
            total = 0
            total = total + grid[i][j-1] #
            total = total + grid[i][j+1] #
            total = total + grid[i-1][j] #
            total = total + grid[i+1][j] #
            total = total + grid[i-1][j-1] #
            total = total + grid[i-1][j+1] #
            total = total + grid[i+1][j-1] #
            total = total + grid[i+1][j+1] #

            # In here it only states that there's only 2 alive neighbors 
            # when there should've been 3
            if total > 0:
                print(total)

            # apply Conway's rules 
            if grid[i][j] == 1: 
                if (total < 2) or (total > 3): 
                    newGrid[i][j] = 0 
                elif total == 3:
                    newGrid[i][j] = 1
            else:
                if total == 3: 
                    newGrid[i][j] = 1

    grid[:] = newGrid[:]
    return(grid)

f = 0

zboard = test()
while f <= 3:
    print("Generation: " + str(f))
    gen = update(zboard, 5)
    for i in gen:
        print(i)
        f += 1

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Вам необходимо использовать deepcopy .

Когда вы делаете newGrid = grid.copy(), так как у вас есть 2D-список, подсписки в newGrid не будут независимы от подсписков из grid. Ваша проблема заключалась в том, что grid обновлялось при каждом обновлении newGrid.

Вам необходимо заменить это:

newGrid = grid.copy()

на следующее:

import copy
newGrid = copy.deepcopy(grid)

Вот пример, чтобы показать вам, что происходит. cop_1 является зависимой копией, тогда как cop_2 является независимой:

board = [[0, 0],
        [0, 0]]
cop_1 = board.copy()

import copy
cop_2 = copy.deepcopy(board)

board[0][0] = 3 # change a value of board

print("cop_1[0][0] =", cop_1[0][0])
# cop_1[0][0] = 3
print("cop_2[0][0] =", cop_2[0][0])
# cop_2[0][0] = 0
0 голосов
/ 02 марта 2020

Если вы запустите код, как вы написали, вы получите ошибку, потому что вы не делали отступ после строки def test(): до return board

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...