我正在尝试为游戏Connect Four创建一个程序,其中棋盘可以是anysize。提示用户输入行数和列数,通过某些代码创建一个0开放点的2d列表。所以对于3列乘4排板
blankBoard = [[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
我正在尝试创建一个输入,列表和列的功能以将播放片段放入,由X表示...因此,例如,如果您选择了第3列,则更新的电路板列表将显示为< / p>
blankBoard = [[0,0,0],[0,0,0],[0,0,X],[0,0,0]]
我的函数是假设获取列的输入,并在列列表中找到最后一个空白的索引。我的问题是通过更改所有列表来删除和替换该特定索引。
def move(blankBoard, column):
newBoard = blankBoard[:]
col = column - 1 # The first column in connect four is 1, not 0
index = -1
i = 0
while i < len(newBoard[col]):
if newBoard[col][i] == 0:
index = index + 1
i = i + 1
newBoard[col][index] = "X" # This line of code I think is bad
print(newBoard)
return ""
使用以下输出...
newBoard = [[0,0,X],[0,0,X],[0,0,X],[0,0,X]]
但正如我所说,我只希望X在“col”表示的子列表中 如果更改子列表的特定索引的代码行不在while循环中,为什么循环遍历列表中的所有列(子列表)?
答案 0 :(得分:0)
在设置第一个(反转后,真的是最后一个)tail
到0
之后,您是否可以循环显示反转列表并中断?
x
<强> [编辑] 强>
通过调用a = [0,0,'x']
for i in reversed(range(len(a))):
if a[i] == 0:
a[i] = 'x'
break
print a # will print [0, 'x', 'x']
并以move
作为参数来运行代码,可以得到预期的结果,而不是您描述的行为。但是,如果您使用blankBoard
作为参数调用move
或将[[0]*3]*4
作为参数调用(其中[arr,arr,arr,arr]
),则会发生重复行为。这是因为在最后两个示例中,所有子列表都是对同一列表的引用。