0

我已经为游戏连接 4 制作了一个初始化的棋盘,我现在想跟踪每个回合的位置和游戏,这样如果我这样做:

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

另一个问题是您从未使用过板,并且您从未将数据存储在任何地方。
如果我是你,我会首先考虑如何存储数据。
一个明显的选择是二维数组。

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。
你最好叫它get_player_num之类的。您不会获得位置,而是该位置的棋子的玩家编号。

一个例子。如果我在一个类中有一个 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__。我建议制作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 回答