2017-08-05 14 views
0

私は、単一の引数(現在のグリッド)をとり、新しいグリッドを計算しますが、印刷しない関数nextGenを作成しようとしています。基本的に、私はチェックビットをどのように行うのかはわかりません。チェックビットは周囲の9個のセルをチェックします。最初に、私は0の境界線になるように、現在のグリッドより2行2列大きい0の完全に作られたベースグリッドを作成できると思ったが、初期グリッドの値を取得する方法を理解することはできないベースグリッドに挿入します。現在のコードはConwayの人生のゲーム:グリッドを初期化するには?

def initlist(positions,initval): 
    newlist = [] 
    for i in range(0,positions): 
     newlist.append(initval) 
    return newlist 

def init2DTableV3(rows,cols,initval): 
    newrow = initlist(cols,initval) 
    table = initlist(rows,newrow) 
    return table 

def nextGen(current_grid): 
    rows = len(current_grid) 
    cols = len(current_grid[0]) 
    base_value = 0 
    base_grid = init2DTableV3(rows + 2, cols + 2, base_value) 
    import copy 
    init_newgrid = copy.deepcopy(current_grid) 

私を助けてくれますか?私はPythonの初心者ですので、誰かが基本的なPython関数を使って偉大になる方法をnextGenにする方法を説明できれば。

+0

GoLグリッドが二重にラップされている場合は、グリッドの隣にあるグリッドをチェックする必要があります。 – DyZ

答えて

1

私が正しく理解していれば、ベースグリッドがあり、エッジにゼロを埋め込む方法がわからないのですか?

最初に1Dの問題について考えてから、2Dに拡張することが可能かどうかを確認するのが簡単な場合もあります。さんがあなたの1Dグリッドが

1 0 0 1 0 0 0 0 1 0 1 

のように見えるとしましょうあなたはパッド各端にゼロの配列を望んでいた場合、それは代わりに

0 1 0 0 1 0 0 0 0 1 0 1 0 

のようになります。そして、これは仮定して行うのはとても簡単ですあなたは標準的なPythonリストを使用しています。最初に挿入するにはlist.insert()を使用し、末尾には.insert()または.append()を挿入して挿入してください。

>>> L = [1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1] 
>>> L.insert(0,0) 
>>> L.append(0) 
>>> L 
[0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0] 

それでは、何が起こるかを見るために2Dリストで同じことを試してみましょう:

>>> M = [[1,1],[1,1]] 
>>> M.insert(0,[0,0]) 
>>> M.append([0,0]) 
>>> M 
[[0, 0], [1, 1], [1, 1], [0, 0]] 

だから、これはゼロで上下に行を与えますが、私たちは左を持っていません右サイド。私たちはそれを2番目に扱います。一番上の行と一番下の行を追加すると、必要なゼロの数(つまり、[0,0])が明示的に与えられました。しかし、あなただけで簡単に行の長さが使用して自動的にこれを行うことができます。今すぐ

>>> M = [[1,1],[1,1]] 
>>> M.insert(0,[0]*len(M[0])) 
>>> M.append([0]*len(M[0])) 
>>> M 
[[0, 0], [1, 1], [1, 1], [0, 0]] 

、行ベクトルのそれぞれが唯一の長さが2であるが、それはこれがちょうどです行う簡単かつ明示的な方法4でなければなりませんサブリストをループにし、0を挿入して追加します。

>>> for r in M: 
...  r.insert(0,0) 
...  r.append(0) 
... 
>>> M 
[[0, 0, 0, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0]] 

これは、あなたのパディングされた2Dのリストが表示されます。一般的に


あなたは、単に初心者のための2D numpyアレイ上​​を使用することができるようしかし、私は、これらのタスクのためのnumpyを使用することをお勧めしますが、より複雑な操作も速くなりますと配列がインデックスに簡単です、

0

もう1つの方法は、余分な要素を追加するのではなく、すでに存在するものを使用することです。

私は最近、ライフのコピーをjavascriptで書いていますが、アイデアは同じです。各セルはその座標によって識別され、その近傍座標のオブジェクト(Python:辞書)で初期化されます。

makeCell(x, y) { 
    let div = $('<div></div>'); 
    let id = "x" + x + "y" + y; 

    let neighbors = this.getNeighbors(x, y); 

    let attributes = { 
       "id": id, 
       "data-entity": _entity.id 
     } 

    $("#grid").append(div); 
} 

function getNeighbors(x, y) { 
    let leftX =  x - 1; 
    let rightX = x + 1; 
    let topY =  y - 1; 
    let bottomY = y + 1; 

    // neighbor positions 
    let neighbors = [ 
     "#x" + leftX + "y" + topY, 
     "#x" + x + "y" + topY, 
     "#x" + rightX + "y" + topY, 
     "#x" + leftX + "y" + y, 
     "#x" + rightX + "y" + y, 
     "#x" + leftX + "y" + bottomY, 
     "#x" + x + "y" + bottomY, 
     "#x" + rightX + "y" + bottomY, 
    ]; 
    return neighbors; 
} 

ラウンドの終わりに、すべての生存細胞をリストに保存した。各生きている細胞およびその近隣の細胞の各々を調べるために、各生きている細胞およびその近隣の細胞のそれぞれを調べた。

this.cellCountNeighbors = function() { 
    let count = 0; 
    let neighbors = this.neighbors; 
    let n = this.entity; 
    let u = this; 

    neighbors.forEach(function(neighbor) { 
     let div = $(neighbor); 
     if ($(div).hasClass("alive")) { 
      count++; 
     } else if (!check_cells.includes(neighbor)) { 
      check_cells.push(neighbor); 
     } 
    }); 

    return count; 
} 

と生活のためのチェック条件:

changesが死んで/生き boolを切り替えるべきセルのリストである
this.setNextLife = function(_count) { 
    if (this.alive) { 

     if (_count == 2 || _count == 3) { 
      return this.age++; 
     } else { 
      changes.push(this); 
      return; 
     } 

    } else { 
     changes.push(this); 
    } 
} 

関連する問題