私はPythonに関する非常に基本的な知識を持つ物理学者ですが、私はこの問題の簡単な解決策を探していますが、円。私は "The Game of Life"というプログラムのために私自身の演出を書いています(WikiPage)。規則は簡単です:LIfeのゲーム:条件で反復処理中にnumpyで配列値を変更する
ゲームは2次元グリッド上にあるいわゆるセルで構成されています。これらの細胞は周期的に進化する。死んで生きている細胞の初期のパターンは、第1世代です。第2世代は、いくつかの単純なルールをすべてのセルに同時に適用することから進化しています。ルールは以下のとおりです。彼らは十分な会社(隣接2個の未満の細胞)は、隣接する4個の以上のセルがある場合
細胞は人口過剰で死ぬを持っていけない場合
細胞が死にます。
(正確に)3つのセルが隣接していると、死んだセルが生まれ変わります。
これは割り当ての一部ですが、私はスプーンフィードソリューションを探していません。 numpyと配列を使用する必要があります。
私のアプローチは、ランダムな1と0の初期フィードで配列board
を生成することでした。次に、関数内で、新しい値を格納してからそれを戻すboard
より大きい1行と1列の別の配列を作成します。私は反復する(配列上で反復するためにpythonicでないことを知っているので、i
とj
の要素に対しては提案や代替案が公開されている)、サブ配列nBlock[i-1:i+1,j-1:j+1]
の合計(np.sum
)を作る。合計が4よりも大きいか4より小さい場合、要素nBlock[np.array([i,j])]
はゼロ(セルが死ぬ)になり、それ以外の場合は1(セルが生き残り、または生まれ変わります)になります。
問題は、これは機能しません。コードは次のとおりです。
import numpy as np
import matplotlib.pyplot as plot
import time as t
%matplotlib inline
def printBoard(board):
im = plot.imshow(board, cmap='Greys', interpolation='none')
plot.show()
plot.close()
def initializeBoard():
board = np.random.randint(2, size=(100, 100))
return board
board = initializeBoard()
printBoard(board)
def checkAlive():
if 1 not in board:
print("All cells are dead! Life is over!")
return 0
else:
return board
def calculateNeighbours(board):
nBlock = np.zeros((102, 102))
nBlock[1:101, 1:101] = board
for i in range(1, 100):
for j in range(1, 100):
checksum = np.sum(nBlock[i-1:i+2, j-1:j+2])
nBlock[:,0] = 0
nBlock[0,:] = 0
if checksum == 4:
nBlock[np.array([i,j])] = 1
elif checksum > 4 or checksum < 4:
nBlock[np.array([i,j])] = 0
return nBlock
def play(board):
for i in range(1, 10):
neighbours = calculateNeighbours(board)
board = neighbours[1:101, 1:101]
board = checkAlive()
printBoard(board)
play(board)
アレイboard
は変更されません。同じboard
を返します。
私が気づいた別の奇妙なことは、私のfor
ループの条件を削除すると、配列が正常に変更されてしまうことです。例えば、
for i in range(0, 100):
for j in range(0, 100):
board[np.array([i,j])] = 1
は私ので、私は私の配列内のデータを操作できるようにされていないif...else
条件について何かがある1に変更されたすべての要素を持つ行列を与えます。
任意およびすべてのヘルプは高く評価され:)
[convolution](https://jakevdp.github.io/blog/2013/08/07/conways-game-of-life/)を使用して最近傍を数えたとお考えですか? – wflynny
@ Alex.S私はなぜ、 'return'ブロックをforループに入れるべきかわかりません。ループするたびに配列を返しませんか?とにかく、うまくいきませんでした:( – shashtheash
@wflynny私は畳み込みについて読むことができるリソースを教えていただけますか?scipyのドキュメントはここであまり役に立ちません.../ – shashtheash