我正在开发一个小程序来在计算机上玩tictactoe,但是当涉及到检查谁是获胜者时,我做了一个函数,用于检查代表板的阵列上是否有任何'X'或'O'板垂直,水平和交叉。仅通过查看代码,我就可以看到很多重复,而我只是在寻找有关如何优化代码的建议。
我已经尝试将'X'和'O'的if语句组合在一起,但是由于需要每个人将不同的消息打印到输出中,因此无法将它们组合在一起。第一条if语句检查每一行中是否有所有X值,第二条垂直检查,第三和第四条检查值全盘检查。
for i in range(3):
if myDict[0][i] == 'X' and myDict[1][i] == 'X' and myDict[2][i] == 'X':
print('You Lose!!!')
DisplayBoard(myDict)
return False
elif myDict[i][0] == 'X' and myDict[i][1] == 'X' and myDict[i][2] == 'X':
print('You Lose!!!')
DisplayBoard(myDict)
return False
if myDict[0][0] == 'X' and myDict[1][1] == 'X' and myDict[2][2] == 'X':
print('You Lose!!!')
DisplayBoard(myDict)
return False
elif myDict[0][2] == 'X' and myDict[1][1] == 'X' and myDict[2][0] == 'X':
print('You Lose!!!')
DisplayBoard(myDict)
return False
for i in range(3):
if myDict[0][i] == 'O' and myDict[1][i] == 'O' and myDict[2][i] == 'O':
print('You Win!!!')
DisplayBoard(myDict)
return False
elif myDict[i][0] == 'O' and myDict[i][1] == 'O' and myDict[i][2] == 'O':
print('You Win!!!')
DisplayBoard(myDict)
return False
if myDict[0][0] == 'O' and myDict[1][1] == 'O' and myDict[2][2] == 'O':
print('You Win!!!')
DisplayBoard(myDict)
return False
elif myDict[0][2] == 'O' and myDict[1][1] == 'O' and myDict[2][0] == 'O':
print('You Win!!!')
DisplayBoard(myDict)
return False
return True
该程序有效,只是想找到优化代码的方法。
答案 0 :(得分:0)
myDict[0][i] == 'X' and myDict[1][i] == 'X' and myDict[2][i] == 'X'
可以替换为
all(myDict[j][i]=='X' for j in range(3))
这对if
/ elif
语句可以与or
组合。
您还可以通过编写将播放器('X'
或'O'
)作为参数的函数来替换重复的代码。只需为每个玩家调用一次该功能。
答案 1 :(得分:0)
我建议使用间接方式来标识要合并的索引,并在组列表中循环以形成广义条件。
例如:
axes = [ [(0,0),(0,1),(0,2)], [(1,0),(1,1),(1,2)], [(2,0),(2,1),(2,2)],
[(0,0),(1,0),(2,0)], [(0,1),(1,1),(2,1)], [(0,2),(1,2),(2,2)],
[(0,0),(1,1),(2,2)], [(0,2),(1,1),(2,0)] ]
winner = "O"
for axis in axes:
p = "".join(myDict[r][c] for r,c in axis)
if p = "OOO": winner = "O"
if p = "XXX": winner = "X"
if winner == "O": print("You Win!!!")
if winner == "X": print("You Lose!!!")