优化井字游戏检查
Optimize tic tac toe checks
我的一个项目,我要做一个井字游戏求解器,我想寻求一些帮助优化一些代码。
任务:根据获胜者(x 或 o),return 适当的结果
我是怎么做到的:我检查了结果的水平、垂直和对角线策略
我需要什么帮助:我大部分时间都在重复相同的代码,但每种情况的 if 语句都不同,我只是想知道是否有更通用的方法来执行此操作。
当前代码:
(对角线获胜)
if diagcounter==size and (board[0][0]=="x") :
print("Win Diagonally")
return "X has won"
elif diagcounter==size and (board[0][0]=="o"):
print("Win Diagonally")
横向获胜:
if vertcounter==size and board[0][x]=="x":
print("Win vertically")
return "X has won"
elif vertcounter==size and board[0][x]=="o":
print("Win vertically")
return "O has won"
大家可以看到,差不多,但是因为要现场查信,不知道怎么优化
您可以为每个 row/column/diagonal 保存一个 索引 的列表。例如,第一行应该是 sequence_indices = [(0, 0), (0, 1), (0, 2)]
。主对角线应该是 sequence_indices = [(0, 0), (1, 1), (2, 2)]
.
现在,每当您在代码中编写 vertcounter
或 diagcounter
时,都使用函数 counter(sequence_indices)
,而不是 board[0][x]
或 board[0][0]
,使用
first_i, first_j = sequence_indices[0]
board[first_i][first_j]
另一种优化方法是像这样使用板:
如果单元格包含 x
,则该单元格中的 board
应包含数字 1
。如果单元格包含 o
,则该单元格中的 board
应包含数字 -1
,如果单元格为空,则应为 0
.
现在要计算 rowcounter
或任何计数器,只需对这些单元格求和并将它们与 +size
(x
获胜)或 -size
(o
胜)。
您可以创建一个函数来处理 "winning" 并让您的 if 语句调用它。
def win(method, team):
print("Win "+method)
return team+" has won"
if diagcounter==size and (board[0][0]=="x") :
return(win("diagonally", "x"))
elif diagcounter==size and (board[0][0]=="o"):
return(win("diagonally", "o"))
if vertcounter==size and board[0][x]=="x":
return(win("vertically", "x"))
elif vertcounter==size and board[0][x]=="o":
return(win("vertically", "o"))
我的一个项目,我要做一个井字游戏求解器,我想寻求一些帮助优化一些代码。
任务:根据获胜者(x 或 o),return 适当的结果
我是怎么做到的:我检查了结果的水平、垂直和对角线策略
我需要什么帮助:我大部分时间都在重复相同的代码,但每种情况的 if 语句都不同,我只是想知道是否有更通用的方法来执行此操作。
当前代码: (对角线获胜)
if diagcounter==size and (board[0][0]=="x") :
print("Win Diagonally")
return "X has won"
elif diagcounter==size and (board[0][0]=="o"):
print("Win Diagonally")
横向获胜:
if vertcounter==size and board[0][x]=="x":
print("Win vertically")
return "X has won"
elif vertcounter==size and board[0][x]=="o":
print("Win vertically")
return "O has won"
大家可以看到,差不多,但是因为要现场查信,不知道怎么优化
您可以为每个 row/column/diagonal 保存一个 索引 的列表。例如,第一行应该是 sequence_indices = [(0, 0), (0, 1), (0, 2)]
。主对角线应该是 sequence_indices = [(0, 0), (1, 1), (2, 2)]
.
现在,每当您在代码中编写 vertcounter
或 diagcounter
时,都使用函数 counter(sequence_indices)
,而不是 board[0][x]
或 board[0][0]
,使用
first_i, first_j = sequence_indices[0]
board[first_i][first_j]
另一种优化方法是像这样使用板:
如果单元格包含 x
,则该单元格中的 board
应包含数字 1
。如果单元格包含 o
,则该单元格中的 board
应包含数字 -1
,如果单元格为空,则应为 0
.
现在要计算 rowcounter
或任何计数器,只需对这些单元格求和并将它们与 +size
(x
获胜)或 -size
(o
胜)。
您可以创建一个函数来处理 "winning" 并让您的 if 语句调用它。
def win(method, team):
print("Win "+method)
return team+" has won"
if diagcounter==size and (board[0][0]=="x") :
return(win("diagonally", "x"))
elif diagcounter==size and (board[0][0]=="o"):
return(win("diagonally", "o"))
if vertcounter==size and board[0][x]=="x":
return(win("vertically", "x"))
elif vertcounter==size and board[0][x]=="o":
return(win("vertically", "o"))