我做了两场TicTacToe比赛,我已经尝试了一些方法来检查阵列中的胜利。目前,我保留了以下内容。你能帮我找出效率最高的吗?
第一个:
def check_victory(self, board, mark):
for i in board:
if np.array_equal(i, [mark]*3):
return True
for i in range (0, 3):
if (board[0][i] == board[1][i] == board[2][i] == mark):
return True
if (board [0][0] == board [1][1] == board [2][2] == mark) or (board [0][2] == board [1][1] == board [2][0] == mark):
return True
return False
第二个:
def check_victory(self, table):
for j in range(3) :
if (sum(table[j][i] for i in range(3)))**2 == 9 or (sum(table[i][j] for i in range(3)))**2 ==9:
return -self.active_player
if (sum(table[i][i] for i in range(3)))**2 == 9 or (sum(table[i][2-i] for i in range(3)))**2 == 9:
return -self.active_player
for i in range(3) :
for j in range(3) :
if table[i][j]==0 :
return None
return 0
答案 0 :(得分:1)
使用计时功能。构建一系列8种可能的胜利,并运行循环以多次评估整个系列(足以使开销成本微不足道)。
另外,在第二种情况下你可以做得更好。而不是检查
如果x ** 2 == 9
尝试
如果abs(x)== 3
取幂,即使是乘法,也比让硬件操作反转负整数慢。
更好的是,不要检查整个电路板:相反,只检查涉及最近移动的2-4种组合。最重要的是,在第二步之后,只需保留一份获胜动作列表。当你能够制作其中一个时,就不需要检查了。
更容易做到这一点的一种方法是在内部将方块编号为3x3魔方:
8 3 4
1 5 9
6 7 2
现在,如果您玩了三个加起来为15的数字,那么你就赢了。
答案 1 :(得分:0)
我使用这个算法:
def algo(symbols, x, y):
"""Check if someone wins with this move
0,0 0,1 0,2
1,0 1,1 1,2
2,0 2,1 2,2
2 straight checks: [0][y] & [x][0]
2 diagonal checks, if x = y or x = 2 - y
"""
return (symbols[0 * 3 + y] == symbols[1 * 3 + y] == symbols[2 * 3 + y] or
symbols[x * 3 + 0] == symbols[x * 3 + 1] == symbols[x * 3 + 2] or
(x == y and symbols[0] == symbols[4] == symbols[8]) or
(x == 2 - y and symbols[2] == symbols[4] == symbols[6]))
自动返回True或False