2016-11-13 5 views
-1

Итак, я должен сделать игры Конвея жизни с этими 5 правил ниже:Конвея жизни не изменяя ничего

  1. Клетка, которая имеет меньше двух живых соседей умирает
  2. клетки, которая более 3 живых соседей умирает
  3. клетка, которая умерла и имеет ровно три живых соседей оживает
  4. Все краевые клетки остаться 0
  5. Все остальные клетки сохраняют свое состояние

    Пример:

    >>> A = [ [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]] 
    
    >>> printBoard(A) 
    00000 
    00100 
    00100 
    00100 
    00000 
    
    >>> A2 = next_life_generation(A) 
    >>> printBoard(A2) 
    00000 
    00000 
    01110 
    00000 
    00000 
    
    >>> A3 = next_life_generation(A2) 
    >>> printBoard(A3) 
    00000 
    00100 
    00100 
    00100 
    00000 
    

    и так далее ....

Обратите внимание, что next_life_generation(A) возвращает новую доску, так что я могу держать повторное связывание А каждое последующее поколение. Это мой код до сих пор:

import sys 
def printBoard(A): 
    """ this function prints the 2d list-of-lists 
     A without spaces (using sys.stdout.write) 
    """ 
    for row in A: 
     for col in row: 
      sys.stdout.write(str(col)) 
     sys.stdout.write('\n') 

def countNeighbors(row, col, A): 
    count = 0 
    for row in range(1, len(A) - 1): 
     for col in range(1, len(A) - 1): 
      if A[row][col] == 1: 
       count += 1 
    return count 

def next_life_generation(A): 
    for row in range(1, len(A) - 1): 
     for col in range(1, len(A) - 1): 
      if A[row][col] == 0 and countNeighbors(row, col, A) == 3: 
       A[row][col] = 1 
      if countNeighbors(row, col, A) < 2: 
       A[row][col] = 0 
      elif countNeighbors(row, col, A) > 3: 
       A[row][col] = 0 
    return A 

Проблема, которую я имею, что мой код не изменяет все, что он просто печатает то же самое:

>>> A = [ [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]] 
>>> printBoard(A) 
00000 
00100 
00100 
00100 
00000 
>>> A2=next_life_generation(A) 
>>> printBoard(A2) 
00000 
00100 
00100 
00100 
00000 

Я был бы очень признателен кто-то помочь!

+0

http://pythontutor.com –

+0

Что такое printBoard (A)? Я не вижу такой функции в вашем коде. –

+0

Пожалуйста, предоставьте [mcve] –

ответ

0

В вашем определении для countNeighbors, что вы зацикливаете? Вы переходите из строки = 1, ..., | A | -1 Во-первых, в python диапазон начинается с min inclusive и исключает макс. Так диапазоне вы хотите использовать

range(0,len(A))

Но that't еще не так. Вы перебираете все строки и столбцы (как только вы исправляете ошибки диапазона здесь) в next_life_generation. Поэтому я считаю, что вы хотите проверить ближайших соседей по ячейке для каждого значения строки и столбца. Я думаю, вы понимаете это, поэтому вы передаете значения строк и столбцов, чтобы проверить countNeighbors(row, col, X) == 3: Но опять же, что вы зацикливаете? От 0 до | A | для строк и столбца. Таким образом, каждый раз, когда вы подводя итог для всей матрицы, которая в вашем примере всегда 3.

Вот кое-что попробовать:

def countNeighbors(row, col, A): 
count = 0 
for r in range(max(row-1,0), min(row+2, len(A))): 
    for c in range(max(row-1,0), min(row+2, len(A))): 
     if A[r][c] == 1: 
      count += 1 
return count 

Обратите внимание на минимальное и максимальное (и заметьте мин (строка + 2, len (A)), потому что диапазон будет остановлен на min (строка + 1 или len (A) -1), так что вы не получите ошибку индекса за пределами границ.

Смежные вопросы