2013-07-27 8 views
5

今、私は他のstackoverflow Game of Lifeの質問を読んだり、貪欲にグーグルグーグルをしています。私はPythonのGame of Lifeの実装のために何をすべきかを知っています。問題は、私はそれをどのようにコード化すべきかに固執しています。
は、ここで私が思いついたが、私はそれを越えて私のウィットの終わりにちょっとしたものです。Game of Life:アクティブなセルを追跡する方法

  • 生死
    アクティブなセル座標の組からなるActiveCellのリストを維持します。
  • 次世代のコンピューティングでは、ActiveCellリストを反復するだけで、セル の状態を計算し、状態が変化するかどうかをチェックします。
  • ない場合は、状態の変化は、リスト
  • に存在する細胞の隣人のすべてを追加した場合、リスト
  • からそのセルを削除今の問題は次のとおりです。(「」 - >他の細胞)
    B C D
    . A .
    . . .

    IはOrderedSetを使用考え3)それは 再び、それはAを追加する意味する)Bも3にtrueを返した場合、次にCをB、C、D
    を追加満たす(複製)

場合取るべきこと順序を気にし、重複を避けてください。しかし、私はこれらの問題にぶつかりました。私は方向性が必要です。

+0

興味深い質問です。 –

+0

数字の配列を考えましたか?その後、マスクを使用してCAの更新ルールを設定できます。そのようなタスクは、numpyの方がずっと簡単です(そして高速です)。 – entropiece

+0

サンプルコード –

答えて

1

あなたには2つのリストがあり、currentStateとnewChangesという名前を付けます。

  1. 新たに生まれた細胞がどれであり、どの細胞が死ぬかを知り、現在の状態を繰り返します。 これらの変更をcurrentStateに追加しないでください。生まれるセルまたは死がある場合は、それをnewChangesリストに追加します。このステップを終了すると、currentStateは最初と全く同じに見えるはずです。
  2. 手順1ですべての計算を完了したら、すべてのセルをとし、newChangesを反復処理します。 newChangesの各ペアについて、currentStateをdeadからaliveに、またはその逆に変更します。

例:

  • currentStateのは、{0,0} {0,1} {0,2}を有します。 (1行3ドット)
  • newChangesは{0,0} {-1,1} {1,1} {0,2}と計算されます(2つの終了ドットが消滅し、
  • currentStateは変更を受け取り、{-1,1} {0,1} {1,1}になり、newChangesはクリアされます。それはあなたを助ける場合
+0

提案に少し詳しく説明できますか?変更されたすべてのセルを表すSetがある場合、ActiveCellの目的は何ですか? – devsaw

+2

基本的には、Setはすべての変更を追跡し、ActiveCellリストは現在の状態を追跡します。すべての計算は現在の状態(計算として変更してはならない)で行う必要があるため、計算中に変更を別の場所に保存する必要があります。一度すべての変更を計算したら、それを適用することができます。 –

+0

OKですが、それでもまだ上記の問題に取り組んでいないと思います。セルAをBの隣人にしてください。両方ともアクティブセットになります最後の世代)、現在はBは変更されていませんが、Aは持っています。私はBを最初にチェックしてください。その逆です。逆も同様です。Aを最初にチェックすると、Bをセットに追加します。それを取り除いてください。意味Bはセットにのみ含まれません。 – devsaw

0

順序付き辞書を使用し、値を[なし]に設定することを検討しましたか?

+0

で回答を追加しました。辞書のキーがアクティブなセルになり、その値は何ですか?私は理解していません – devsaw

+0

値はヌル(None)になり、単なるプレースホルダーになります。 http://docs.python.org/2/library/collections.html – Turnkey

1

は知りませんが、ここでライフゲームを簡単にスケッチです、activecells辞書と:

from itertools import product 

def show(board): 
    for row in board: 
     print " ".join(row) 

def init(N): 
    board = [] 
    for x in range(N): 
     board.append([]) 
     for y in range(N): 
      board[x].append("."); 
    return board 

def create_plane(board): 
    board[2][0] = "x" 
    board[2][1] = "x" 
    board[2][2] = "x" 
    board[1][2] = "x" 
    board[0][1] = "x" 

def neighbors(i, j, N): 
    g1 = {x for x in product([1, 0, -1], repeat=2) if x != (0, 0)} 
    g2 = {(i + di, j + dj) for di, dj in g1} 
    return [(x, y) for x, y in g2 if x >= 0 and x < N and y >= 0 and y < N] 

def live(board): 
    N = len(board) 
    acells = {} 
    for i in range(N): 
     for j in range(N): 
      if board[i][j] == "x": 
       for (x, y) in neighbors(i, j, N): 
        if (x, y) not in acells: acells[(x, y)] = board[x][y] 

    while True: 
     print "-" * 2 * N, len(acells), "cells to check" 
     show(board) 
     raw_input("Press any key...") 
     for c in acells.keys(): 
      a = len([x for x in neighbors(c[0], c[1], N) if board[x[0]][x[1]] == "x"]) 
      cur = board[c[0]][c[1]] 
      if a == 0: 
       del acells[c]      # if no live cells around, remove from active 
      elif cur == "x" and a not in (2, 3): 
       acells[c] = "."      # if alive and not 2 or 3 neighbors - dead 
      elif cur == "." and a == 3: 
       acells[c] = "x"      # if dead and 3 neighbors - alive 
       for x in neighbors(c[0], c[1], N): # add all neighbors of new born 
        if x not in acells: acells[x] = board[x[0]][x[1]] 

     for c in acells: 
      board[c[0]][c[1]] = acells[c] 

N = 7 
board = init(N) 
create_plane(board) 

live(board) 
0

あなたが実装する制限を持っていることを述べるませんでした特定の方法でゲーム。だから、主な問題は、グリッドをどのくらい大きく扱うことができるかです。

たとえば、小さな固定サイズのグリッドから始める場合、最も単純な表現は、各セルが生存しているか死んでいるかを含む[[bool]]または[[int]]です。したがって、各ラウンドでは、古いものから新しいグリッドを作ることができます。グリッド外のすべてのセルが死んでいると仮定します。例:あなたは非常に大きいダイナミックなサイズのグリッドをしたい場合は

[ 
    [False, True, False], 
    [True, False, True], 
    [False, True, False], 
] 

は、はるかに速く、より複雑である、HashLife algorithmがあります。

+0

グリッドのサイズは関係ありません。静的か動的かを尋ねます。静的です。はい、HashLifeは高速ですが、複雑でビットの過剰です。 – devsaw

0

私はPythonでGame of Lifeを楽しく実装しました。私が行ったことは、座標のタプルを持つボードdictを持つことでした。値はセルの状態です。ここでコードを見ることができますhttps://raw.github.com/tdi/pycello/master/pycello.py。私はこれが非常に速く実装されていないことを知っている、プロジェクトは時間の不足のために放棄されています。

board = {} 
board[(x,y)] = value 
関連する問題