2017-07-20 16 views
-1

チェスをAIでプレイしていて、moveを選択した現在ゲームの状態を返すminimaxアルゴリズムがあります:board、white_pieces、black_pieces。クラス内のPythonグローバル変数がクラスメソッドで更新されていません

私のチェスクラスは、状態の生成と保守を処理します。それはいくつかのグローバル変数を持っています:

__board 
__white_pieces 
__black_pieces 

これは、クラス内で宣言されていますが、どのメソッドの外でも宣言されています。これはグローバル変数にする必要があります。

ゲームの開始時に、これらはbuild_boardメソッドを使用して初期化されます(コードをテストするために必ずしも実装されているわけではありません)。コードをテストしたので、()メソッドに移動できたと思います。

def build_board(self): 
    for i in range(1, 17): 
     self.__board[self.__white_pieces[i][1]] = i 
     self.__white_pieces[i][3] = True 
     self.__board[self.__black_pieces[i][1]] = -1 * i 
     self.__black_pieces[i][3] = True 
    for i in range(0, 20): 
     self.__board[i] = 99 
    for i in range(100, 120): 
     self.__board[i] = 99 
    for i in range(0, 8): 
     self.__board[20 + 10 * i] = 99 
     self.__board[20 + 10 * i + 9] = 99 

これは、変更可能なタイプのリストを使用しているため、これは意味があると仮定しています。もちろん問題ありません。ボードが編集されます。その後

、私はゲームがミニマックスによって返されたゲームの状態を取り、それらのグローバル変数を更新作るしようとすると、これらのどちらもがそれを更新するように見える:

def play_move(self,board,white_pieces,black_pieces): 
    global __board 
    global __white_pieces 
    global __black_pieces 
    __board = board 
    __white_pieces = white_pieces 
    __black_pieces = black_pieces 

または

def play_move(self,board,white_pieces,black_pieces): 
    self.__board = board 
    self.__white_pieces = white_pieces 
    self.__black_pieces = black_pieces 

クラス内のグローバル変数の仕組みについて誤解していますか?誰かが私のためにこれをクリアすることができればそれは素晴らしいだろう。ありがとう!

編集: 私はplaymoveメソッドでself .__ board、self .__ white_pieces、self .__ black_pieces tupleを返すこともできます。実際に更新された動きであれば印刷します。メソッド内で、その結果を別のメソッドに渡すと、self .__ xxxxxが更新されたことが示されます。しかし、そのメソッドの外側からは、グローバル変数を更新するようには見えません。

+0

あなたはそれらがグローバルであると言いますが、あなたはそれらを「自己」を使ってアクセスします。メンバーですか、グローバルですか?グローバルと同じ名前のメンバーを作成してから変更するようです。グローバルを変更することはありません。また、グローバルを使用しないでください。 – Carcigenicate

+0

私は、ボードの現在の状態をデフォルトにするメソッドを持っています。たとえば、次のように デフFUNC(自己、プレイヤー、B = __ボード、WP = __ white_pieces、BP = __black_pieces) ... 私はこのようにそれを行うことができないため、これは次のとおりです。 デフFUNC(自己、プレイヤー、 bp = self .__ white_pieces、bp = self .__ black_pieces) .... というのは、デフォルト値が実行時ではなく関数定義時にコンパイルされているからです(自己がインスタンス化されたとき)。 これ以外の解決策は何ですか?各方法は、ボードの現在の状態にアクセスしてそれを変更できる必要があります。 –

+0

私はshift + enterではなくenterを押して申し訳ありません - 私はそれを忘れるstackoverflow Enter ==投稿 –

答えて

0

"class:body内のメソッドの外にある"と宣言された変数は、グローバル変数ではなくクラス属性になります。クラスの属性はクラスのすべてのインスタンス間で共有されているので、おそらくあなたがここで必要なものではありません。

シャドウイングの同じ名前のインスタンス属性がない限り、クラス属性にアクセスしてインスタンスから変更できますが、に設定すると、インスタンスのこの属性が変更されません。

あなたのユースケースとスニペットを考える
>>> class Foo(object): 
...  bar = [] 
...  def add(self, x): 
...  self.bar.append(x) 
...  def set(self, bar): 
...  self.bar = bar 
... 
>>> f1 = Foo() 
>>> f1.bar 
[] 
>>> id(f1.bar) 
140281150134752 
>>> f2 = Foo() 
>>> f2.bar 
[] 
>>> id(f2.bar) 
140281150134752 
>>> f2.bar is f1.bar 
True 
>>> f1.add(42) 
>>> f2.bar 
[42] 
>>> f1.bar 
[42] 
>>> f1.set([33]) 
>>> f1.bar 
[33] 
>>> f2.bar 
[42] 
>>> f2.bar is Foo.bar 
True 
>>> f1.bar is Foo.bar 
False 
>>> 

、私はあなたが本当にあなたのboardなどは、インスタンスではなく、グローバルまたはクラス属性の属性になりたいと思います:それはクラス属性をシャドウれるインスタンスの属性を作成します。

あなたはことを言及:各メソッドは、ボードの現在の状態にアクセスし、それを変更できるようにする必要が

しかし、これはインスタンス属性を持つ点です。オブジェクトのすべてのメソッドは、オブジェクトの状態(=>属性)を共有します。あなたが本当にそれが何を知っているが本当にはそれを(ヒントを必要としない限り、サイドノートとして

は、二重のアンダースコアを使用して属性の接頭辞はありません:あなたはすべての10年かそこら、おそらく一度これを必要な場合があります。.. )。単一の先頭のアンダースコアは、実装の詳細であり、クラスAPIの一部ではないことを示すための規約です。

+0

ありがとうございました。私はまだJavaから来て、Pythonには新しいです。私はそれが "プライベート"キーワードに相当すると理解しています。 –

関連する問題