我为游戏连接四制作了一个初始化的棋盘,我现在想要跟踪每个角色的位置和游戏,如果我这样做:
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 | | |
-----------------------------
答案 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,我不确定您打算使用哪种格式(它是单个列表还是列表列表?)。
以下是我认为您需要添加的内容:
更好地将电路板初始化为__init__
。我建议self.board
列出一个0
或None
(无论你想表示什么“空”)的列表,重复7 * 6次。或者你可以把它列为一个列表列表(可能是六个列表,每个列表有七个值)。
检查电路板中get_position
的值。如果您要执行单个列表,则应选中self.board[row*7+column]
。
play_turn
方法需要检查电路板,以找出放入指定列时电路板落到哪一行。该部分将进入该列为空的最低行,因此需要循环。找到准确位置后,您可以在self.board
。
print_board
修复后,get_position
函数应该可以正常工作。