0

ゲームコネクトフォー用に初期化されたボードを作成しました。次に、各ターンの位置とプレイを追跡して、次のようにします。

b = ConnectFour()
b.play_turn(1, 3)
b.play_turn(1, 3)
b.play_turn(1, 4)
b.print_board()   

ボードは印刷する必要があります:

-----------------------------
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
-----------------------------
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   | x |   |   |   |
|   |   |   | x | x |   |   |
-----------------------------

アップデート:

#initializes board

class ConnectFour(object):
        def __init__(self):
            self.board = [[0 for i in range(7)] for j in range(8)]



def get_position(self, row, column):
  """ Returns either None or an integer 1 or 2 depending 
  on which player is occupying the given row or column.  
  Row is an integer between 0 and 5 and column is an integer between 0 and 6. """
assert row >= 0 and row < 6 and column >= 0 and column < 7
return self.board[row][column]


def play_turn(self, player, column):
    """ Updates the board so that player plays in the given column.

    player: either 1 or 2
    column: an integer between 0 and 6
    """
    assert player == 1 or player == 2
    assert column >= 0 and column < 7

    for row in range(6):
        if self.board[row][column] == None:
            self.board[row][column] = player
            return



def print_board(self):
    print "-" * 29
    print "| 0 | 1 | 2 | 3 | 4 | 5 | 6 |"
    print "-" * 29
    for row in range(5,-1,-1):
        s = "|"
        for col in range(7):
            p = self.get_position(row, col)
            if p == None:
                s += "   |"
            elif p == 1:
                s += " x |"
            elif p == 2:
                s += " o |"
            else:                     
                s += " ! |"
        print s
print "-" * 29

解決済み:

これは現在の出力です:

-----------------------------
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
-----------------------------
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|   |   |   | x |   |   |   |
|   |   |   | x | x |   |   |
-----------------------------
4

2 に答える 2

2

私が見る問題は、あなたの self.get_position があなたがやりたいことをしないということです。

def get_position(self, row, column):
    assert row >= 0 and row < 6 and column >= 0 and column < 7
    if self.get_position == 1: # the type of self.get_position is a function, and it will never be equal to 1, or 2, so it always goes to None
            return 1
        elif self.get_position == 2:
            return 2
        else:
            return None

もう 1 つの問題は、ボードを使用したことがなく、データをどこにも保存していないことです。
私があなただったら、まずデータをどのように保存するかを考えます。
明らかなオプションは 2 次元配列です。

self.board = [[0 for i in range(6)] for j in range(7)]

play_turn を呼び出すとき、列を更新しようとします。たとえば、列 3 に既に [0,0,0,0,2,1] がある場合、0 ではない最初の要素のインデックスを取得しようとします。その前の要素の新しいプレーヤー インデックスなので、[0,0,0,1,2,1] になります (ピースがプレーヤー 1 に属している場合)。

次に、実際に列番号と行番号を使用して、ボードに何があるかを確認します。0 か 1 か 2 か
。位置を取得するのではなく、その位置にある駒のプレーヤー番号を取得します。

例。クラスに 2 * 2 配列がある場合:

class CF(object):
    def __init__(self):
        board = [[0, 0], [0, 0]]

これは 2 * 2 フィールドを表し、現在はすべて空です。
0 0
0 0

更新方法を設計できます。

def update(self, col, row, newVal):
    self.board[col - 1][row - 1] = newVal

する場合:

game = CF()
game.update(1, 2, 1) 

その後、ボードは
0 0
1 0になります

ボードを読んでいると、列 1、行 2 がプレーヤー 1 の駒であることがわかります。

于 2013-03-10T22:35:44.537 に答える
1

のコードget_positionが正しくありません。self.board調べるのではなく、検査する必要がありますself.get_position(これはメソッド自体であり、値ではありません)。

現在、どこでもself.boardを使用していないため、どの形式にするのか正確にはわかりません(単一のリストにするのか、それともリストのリストにするのか)。

追加する必要があると思うものは次のとおりです。

  1. ボードの初期化を改善しました__init__。または(「空」を表現したいものは何でも)を7*6回繰り返しself.boardたリストを作成することをお勧めします。または、リストのリストにすることもできます(おそらく、それぞれ7つの値の6つのリスト)。0None

  2. ボードの値を確認してくださいget_position。単一のリストを実行している場合は、をチェックする必要がありますself.board[row*7+column]

  3. このplay_turnメソッドは、ボードを検査して、指定された列に配置されたときにピースがどの行に分類されるかを確認する必要があります。ピースはその列の空である一番下の行に入るので、ループが必要です。正確な位置を見つけたら、で値を設定できますself.board

修正されるとprint_board、関数は正常に機能するはずget_positionです。

于 2013-03-10T22:32:02.803 に答える