1 回答
TA贡献1806条经验 获得超5个赞
您正在将新的X或O分配给tablero['algo']。如果游戏没有在这里结束,您可以将 的内容分配tablero给ari、等,但仅在下arc一个循环开始时才分配。
因此,如果游戏在该移动之后结束,您将打印旧的ari、arc等,这些尚未更新以反映最新的移动。
当然,还有许多其他问题需要修复(可以避免大量重复),但游戏确实可以正常运行。
一些建议:
我会使用一个简单的列表来处理董事会。tablero = [" "] * 9创建一个包含九个空格字符的列表。这允许很多简化。例如,要打印电路板,您可以简单地执行以下操作
print('|{6}|{7}|{8}|\n- - - -\n|{3}|{4}|{5}|\n- - - -\n|{0}|{1}|{2}|'.format(*tablero))
请注意,列表的第一个元素由 索引0,因此我们需要考虑到这一点。
完成此操作后,您可以创建另一个列表来处理快捷方式:
casillas = ["abi", "abc", "abd", "cei", "cec", "ced", "ari", "arc", "ard"]
现在处理输入要容易得多,因为您可以重用相同的代码而不是大量if/elif语句:
jugada = input('¿Donde queres poner la {}?: '.format(player)) # input() already returns a str
try: # let's see if player entered a whole number
casilla = int(jugada) - 1 # remember, field 1 is numbered internally as 0
except ValueError: # apparently not
try: # let's see if player entered a valid shortcut
casilla = casillas.index(jugada)
except ValueError: # apparently not
casilla = 9 # let's choose an invalid value, we'll detect that later
现在我们在 中有一个数字casilla,让我们看看它是否在范围内,如果是的话,让我们填充棋盘(如果可以的话):
if 0 <= casilla <= 8:
if tablero[casilla] == ' ':
tablero[casilla] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
else:
print('Jugada invalida, por favor realice una jugada valida')
continue
获胜条件也可以简化:
if tablero[0] == tablero[1] == tablero[2] != " " or \
tablero[3] == tablero[4] == tablero[4] != " " or \
tablero[6] == tablero[7] == tablero[8] != " " or \
... etc. ...:
juego_terminado = True
通过理解,这可以进一步缩短:
if any(tablero[i] == tablero[j] == tablero[k] != " "
for i,j,k in ((0,1,2), (3,4,5), (6,7,8), (0,3,6), (1,4,7), (2,5,8), (0,4,8), (2,4,6))):
juego_terminado = True
我还没有实际测试过,所以如果您遇到问题,请告诉我。
- 1 回答
- 0 关注
- 116 浏览
添加回答
举报