2016-11-07 12 views
1

チェスアプリを作る際に手を使っています。コード以下:Python:オブジェクトを2次元配列に格納し、そのメソッドを呼び出す

#file containing pieces classes 
class Piece(object):` 

    name = "piece" 
    value = 0 
    grid_name = "____" 


class Pawn(Piece): 

# Rules for pawns. 
#If first move, then can move forward two spaces 

name = "Pawn" 
value = 1 
grid_name = "_PN_" 
first_move = True 


#Main file 
from Piece import * 



class GameBoard: 

    pieces = [] 
    grid = [][] 

    def __init__(self): 

     self.grid[1][0] = self.pieces.append(Pawn()) 



currentBoard = GameBoard() 

私がグリッドにあるオブジェクトの値の変数を呼び出したい[1] [0]それはのようなものになります

print currentBoard.grid[1][0].value 

このコードは、」doesnのを私は、オブジェクトと変数の範囲に関する何かを見逃していると私に伝えます。これはPythonで可能なことですか?

EDIT - ソリューション

私は作品リスト内のオブジェクトのインデックスへの参照を保持するために、グリッドのリストを使用してこの解決策を見つけました。以下のコード:あなたのコードを書き換え

class GameBoard: 

    # initialize empty board 
    grid = [["____" for i in range(8)] for j in range(8)] 
    pieces = [] 

    def __init__(self): 

     self.grid[0][0] = 0 
     self.grid[0][1] = 1 
     self.grid[0][2] = 2 
     self.grid[0][3] = 3 
     self.grid[0][4] = 4 
     self.grid[0][5] = 5 
     self.grid[0][6] = 6 
     self.grid[0][7] = 7 
     self.grid[1][0] = 8 
     self.grid[1][1] = 9 
     self.grid[1][2] = 10 
     self.grid[1][3] = 11 
     self.grid[1][4] = 12 
     self.grid[1][5] = 13 
     self.grid[1][6] = 14 
     self.grid[1][7] = 15 


pieces = [] 

pieces.append(Pawn()) 

#grid will return the integer which can be passed to the other list to pull an 
#object for using the .value attribute 

print pieces[currentBoard.grid[1][0]].value 
+1

を行うことであろうワーキング"?おそらく、あなたは 'SyntaxError'に遭遇するはずです:' grid = [] [] '。 –

+0

そのため、 'self.grid [1] [0] = self.pieces.append(Pawn())'これはエラーを投げるかもしれません。それにもかかわらず、リスト 'grid'を持っていれば、' grid [0] [0] .value'のようなリストにあるオブジェクトに属している属性に確実にアクセスできます。それはあなたのコードの問題ではありません。あなたは、Pythonのリストの基礎を読むべきです。 –

+0

@ juanpa.arrivillaga私はあなたが言っているものを見ます。申し訳ありませんが、私はコードの一部を中止しました。そのメソッドを呼び出そうとするとブレークします。私はすでに自分のコンピュータ上のコードの2dリストを初期化しています。私は少し更新するつもりです。申し訳ありません。 –

答えて

1

それは単に単一のファイルとして実行されるように:

#file containing pieces classes 
class Piece(object): 
    name = "piece" 
    value = 0 
    grid_name = "____" 


class Pawn(Piece): 
    # Rules for pawns. 
    #If first move, then can move forward two spaces 

    name = "Pawn" 
    value = 1 
    grid_name = "_PN_" 
    first_move = True 

class GameBoard: 

    pieces = [] 
    grid = [[],[]] 

    def __init__(self): 

     self.grid[0][1] = self.pieces.append(Pawn()) 



currentBoard = GameBoard() 

修正する必要がいくつかあります。 1つについては、Piece,PawnおよびGameBoardで定義される変数は、__init__()の方法では定義されていません。つまり、これらの変数はクラスのすべてのインスタンスで共有されます。

例:

>>> pawn1 = Pawn() # Make two Pawns 
>>> pawn2 = Pawn() 
>>> print pawn1.first_move, pawn2.first_move 
True, True 
>>> pawn1.first_move = False # Change the first pawns attribute 
>>> print pawn1.first_move, pawn2.first_move # But both change 
False, False 

あなたのクラスのすべての3つの方法__init__()の下にクラス属性を定義し、これを回避します。

例:

class Pawn(Piece): 
    # Rules for pawns. 
    #If first move, then can move forward two spaces 
    def __init__(self): 
     self.name = "Pawn" 
     self.value = 1 
     self.grid_name = "_PN_" 
     self.first_move = True 

次に、あなたの変数grid適切にPythonで定義されていません。あなたは2つの空のリストのリストを望んでいた場合は、以下の

grid = [[], []] 

を行うことができますが、空のリストの8×8の構造を作るための簡単な方法は、それが「ではありませんどのように、次の

grid = [[[] for i in xrange(8)] for j in xrange(8)] 
+0

これは、多くの助けになります、ありがとう!今私はinitの使用の重要性を理解しています。 –

関連する問題