При проверке ячеек вокруг одной ячейки в двумерном массиве код всегда возвращает 1 или 0 для всех ячеек. - PullRequest
0 голосов
/ 13 сентября 2018

Используя следующий код:

import random
import pygame
mw = 165  # Matrix width
mh = 165  # Matrix height
margin = 0
newmatrix = []
finished = False

pygame.init()

matrix = []
for i in range(mw):    # This block of code just creates a new 2d array and fill it with either a 1 or a 0 in each cell
    matrix.append([])
    for j in range(mh):
         matrix[i].append(random.randint(0, 1))

def neighborchecker():    
"""This long block of code checks the 8 cells around matrix[r][c] and checks if it is a 0
    or 1, and based on that assigns that cell true or false, adding each cell up to
    see how many cells are 1s or 0s and then assigning matrix[r][c] based on its 
    neighbors"""
    for r in range(mw):
        for c in range(mh):
            try:
                if matrix[r - 1][c] == 0:
                    left = False
                else:
                    left = True
                if matrix[r - 1][c - 1] == 0:
                    botleft = False
                else:
                    botleft = True
                if matrix[r][c - 1] == 0:
                    bot = False
                else:
                    bot = True
                if matrix[r + 1][c + 1] == 0:
                    botright = False
                else:
                    botright = True
                if matrix[r + 1][c] == 0:
                    right = False
                else:
                    right = True
                if matrix[r + 1][c + 1] == 0:
                    topright = False
                else:
                    topright = True
                if matrix[r][c - 1] == 0:
                    top = False
                else:
                    top = True
                if matrix[r - 1][c + 1] == 0:
                    topleft = False
                else:
                    topleft = True
            except IndexError:
                pass
            allneighbor = sum([left, botleft, bot, botright, right, topright, top, topleft])
            if allneighbor < 2 or allneighbor > 3:
                return 0
            if allneighbor == 3:
                return 1


def createnewmatrix(): # This block creates a new matrix with new values based on what neighborchecker() returns
    for x in range(mw):
        newmatrix.append([])
        for y in range(mh):
            newmatrix[x].append(neighborchecker())
    print(newmatrix)

while not finished:
    createnewmatrix()

В каждом блоке кода есть комментарий о том, что каждый из них делает / по крайней мере должен делать

То, что я ожидаю получить, это язапустите его, получите матрицу, полную 1 и 0, затем бросьте ее в цикл, чтобы проверить соседей каждой ячейки, и измените соответствующую ячейку на 'newmatrix', основываясь на этом.Тогда это также входит в цикл, чтобы продолжать обновлять newmatrix.

Если вы знакомы, я пытаюсь реализовать «Игру жизни» Конвея по-своему, и я понимаю, что это грязно, но когда я запускаю это - каждая ячейка newmatrix - 2-мерный массив около 27 тысяч значенийлибо ВСЕ 1, либо ВСЕ 0 меняются случайным образом, когда я его запускаю, что не имеет смысла для меня.

1 Ответ

0 голосов
/ 13 сентября 2018

Есть три основные проблемы и пара вещей, которые вы должны исправить.

  • Вы проверяете if matrix[r - 1][c] == 0:, даже если r равно 0 (и то же самое)идет за c).Это означает, что вы проверяете matrix[-1][0].В Python это не даст IndexError, как вы, кажется, думаете, учитывая, что вы пытаетесь / поймать, но вернет элемент в последнем индексе.Например, если у вас a = [1, 2, 3, 4, 5] с использованием a[-1], будет возвращено 5.

  • В createnewmatrix вы постоянно добавляете к newmatrix, но вам необходимо сброситьэто сначала в пустое состояние.Перед циклом for у вас должно быть newmatrix = [], что также означает ...

  • ... Вы должны хранить два массива.Создайте начальный случайным образом, на его основе создайте новый, а затем самый простой способ - скопировать новый в исходный и повторить.

Общие вещи, которые вы должны исправить:

  • Нет необходимости хранить все эти переменные (left, topleft и т. Д.).Просто оставьте одну переменную со счетчиком и добавьте одну в случае, если условие выполнено.

  • Вы должны начать с инициализации своей матрицы НЕ случайным образом.В игре жизни Конвея есть некоторые известные образцы.Начните с одной из них, чтобы она длилась более нескольких итераций.

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