Python создает игру жизни Конвея - PullRequest
0 голосов
/ 30 апреля 2019

Итак, я пишу код для имитации «Игры жизни» Конвея.Мне удалось в основном реализовать игру, однако есть еще один шаг, который я пропускаю

Я обработал все, кроме логики для определения, жива или нет клетка.Мы используем числовые массивы для хранения 1 и 0, где 1 считается живым, а 0 - мертвым.

Есть ли какой-нибудь способ, которым я мог бы перебрать массив и напечатать, является ли ячейка живой или мертвой?или это какая-то форма?

Вот мой код.

Для первоначального создания.

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import clear_output
from time import sleep

def update_plot(array, figsize=(7,5), title=''):
    clear_output(wait=False)
    plt.figure(figsize=figsize)
    plt.imshow(array,cmap="gray")
    plt.title(title)
    #plt.grid(True)
    plt.xlabel('Remember alive is white, dead is black')
    plt.show();

Тогда это для запуска игры.

def startup(random_percent=None):
    size_to_build = input("enter the size of your game of life\n")
    dimension = int(size_to_build)
    ##Build the game board, bias is an optional parameter you can pass the function
    if random_percent==None:
        game_board = np.random.randint(2,size=(dimension,dimension))
    else:
        game_board = np.arange(dimension**2)
        #In place shuffle
        np.random.shuffle(game_board)
        #Grab number we should make alive
        alive = int(np.floor(len(game_board)*random_percent))
        #Set those elements to be alive
        zeros = np.zeros(dimension**2)
        alive_cells = game_board[0:alive:1]
        zeros[alive_cells]=1
        game_board = zeros.reshape(dimension,-1)
    return game_board

И это для запуска игры.

def game_of_life():
    start_board = startup()
    board = start_board
    count = 1
    not_stable = True

    while not_stable:
        title_plot="This is iteration number: " + str(count)
        update_plot(board,title=title_plot)
        board_prev = board
        board = update_game_board(board)
        if np.array_equal(board_prev,board):
            not_stable = False
        sleep(2)
        count+=1
    print("Stable game conditions reached after:",count,"iterations")

Это функция, которую я пытаюсь уточнить.

def update_game_board(input_board):

for element in input_board:
     print("Alive Or Dead")





    return np.logical_not(input_board)*1

Как бы я получил доступ к "мертвым"и "Живые" элементы в массиве?

Я довольно новичок в numpy и python и почти не работал с ним. Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 11 июня 2019

Самый простой способ достичь этого для начинающих - это циклически проходить по массиву NumPy по одному элементу за раз и вычислять сумму его соседних элементов.Вы не указали граничные условия, поэтому я принял периодические границы (то есть мир вращается сверху / снизу и слева / справа).

Вы можете получить доступ к форме массива, используя функцию NumPy «shape», которая сообщит вам, сколько строк и столбцов (хотя они равны в вашей спецификации) находятся в массиве.Вы также можете создать массив всех нулей одинакового размера с помощью функции NumPy "zeros_like".

def update_game_board(board):

    new_board = np.zeros_like(board)
    r, r = np.shape(board)

    for i in range(r):
        for j in range(r):

            neighbors = [[i,j],
                         [i,j+1],
                         [i,j-1],
                         [i+1,j],
                         [i-1,j],
                         [i+1,j+1],
                         [i+1,j-1],
                         [i-1,j+1],
                         [i-1,j-1]]

            neighbor_sum = 0

            # Let's count all of the living neighbors
            for n in neighbors:

                x = n[0] % r
                y = n[1] % r

                neighbor_sum += board[x,y]

            if board[i,j] == 1:
                if neighbor_sum in [2,3]:
                    new_board[i,j] = 1
            else:
                if neighbor_sum == 3:
                    new_board[i,j] = 1

    return new_board

Как только вы освоитесь с массивами Python и NumPy, вы можете играть с различными граничными условиями или с более эффективнымиспособы вычисления обновленной платы.

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