使用Numpy评估TicTacToe目标状态的更好设计

2024-10-16 20:41:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试建立一个m*n Tic-Tac-Toe使用numpy来保持我的游戏状态。为了计算一个胜算,我们需要一个元素的至少'q'连续块在行、列或对角线上。(如果是原始的井字游戏,则为3)。在

我目前实施的一个粗略的方法是沿着对角线路径生成所有行、列和向量,然后使用迭代法对其中的每一个进行迭代,找到一个连续的“q”块。在

我想进一步优化它。因为,我对使用矩阵处理numpy和计算比较陌生,所以我想知道我们是否可以用更好的方式来做,更具体地说,我是否能够更好地利用numpy功能来完成更多这些计算。在


Tags: 方法路径numpy游戏元素状态矩阵tic
2条回答

可以使用切片而不是生成。numpy数组可以这样索引(请参见https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html):

arr[r] # Row r
arr[:,c] # Every row, c'th column
np.diagonal(arr) # Diagonal
# Note: No easy way to get the antidiagonal.

您可以使用==检查numpy数组的所有元素,这将生成一个答案数组。在

^{pr2}$

更好的优化:你只需要检查放置最后一块的线条,假设你在每次移动后都会检查。你只需要检查最后一个玩家的棋子(X或O)。在

假设1属于Player1,2属于player2,0表示空白。然后,对于数组中的每一行/每列/每一条对角线,你都可以算出1和2的计数,如果它等于行的长度,那么就意味着一个玩家已经赢了。这里使用^{}我对数组中的每一行/列/对角线都应用了一个函数,它返回该行中1或2的计数除以该行的长度,因此如果在任何情况下返回1,则意味着行/列/对角线包含所有1或2

演示:

from functools import partial
import numpy as np

def func(x, a):

    return len(a[a==x])/len(a)

def check_solved(a):

    """
    0: Empty places
    1: Player 1
    2: Player 2
    """

    player_1 = partial(func, 2)
    player_2 = partial(func, 1)
    data_list = [a, a.T, a.diagonal(), np.flipud(a).diagonal()]
    if any(np.apply_along_axis(f, 0, d).any() for d in data_list for f in [player_1, player_2]):
        print "Game Over"
    else:
        print "Not over yet"

演示:

^{pr2}$

相关问题 更多 >