连接四个Python打印问题

时间:2013-03-10 20:27:20

标签: python

我为游戏连接四制作了一个初始化的棋盘,我现在想要跟踪每个角色的位置和游戏,如果我这样做:

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 |   |   |
-----------------------------

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

get_position的代码不正确。您需要检查self.board,而不是查看self.get_position(这是方法本身,而不是任何值)。

由于您目前没有在任何地方使用self.board,我不确定您打算使用哪种格式(它是单个列表还是列表列表?)。

以下是我认为您需要添加的内容:

  1. 更好地将电路板初始化为__init__。我建议self.board列出一个0None(无论你想表示什么“空”)的列表,重复7 * 6次。或者你可以把它列为一个列表列表(可能是六个列表,每个列表有七个值)。

  2. 检查电路板中get_position的值。如果您要执行单个列表,则应选中self.board[row*7+column]

  3. play_turn方法需要检查电路板,以找出放入指定列时电路板落到哪一行。该部分将进入该列为空的最低行,因此需要循环。找到准确位置后,您可以在self.board

  4. 中设置值

    print_board修复后,get_position函数应该可以正常工作。