Numpy 检查Tictaoe游戏是否已结束并返回赢家

Numpy 检查Tictaoe游戏是否已结束并返回赢家,numpy,matrix,tic-tac-toe,Numpy,Matrix,Tic Tac Toe,我正在尝试编写一个函数,该函数检查Tictatcoe游戏是否结束,如果游戏结束,则返回赢家。你能帮我把这部分编码吗 输入:s,一个3*3的整数矩阵,描述游戏的当前状态。 如果矩阵元素等于0,则表示该位置为空;如果元素等于1,则表示该位置由“X”玩家占据;如果元素等于-1,则表示该位置由“O”玩家占据 输出: e: the result, an integer scalar with value 0, 1 or -1. if e = None, the game has

我正在尝试编写一个函数,该函数检查Tictatcoe游戏是否结束,如果游戏结束,则返回赢家。你能帮我把这部分编码吗

输入:s,一个3*3的整数矩阵,描述游戏的当前状态。 如果矩阵元素等于0,则表示该位置为空;如果元素等于1,则表示该位置由“X”玩家占据;如果元素等于-1,则表示该位置由“O”玩家占据

输出:

 e: the result, an integer scalar with value 0, 1 or -1.
            if e = None, the game has not ended yet.
            if e = 0, the game ended with a draw.
            if e = 1, X player won the game.
            if e = -1, O player won the game.
我尝试了一些用户定义的函数来解决这个问题,但无法正确完成。你能帮我把这部分编码吗

[守则]

def check_game(s):
    e = None
    def sum_all_straights(S):
        r3 = np.arange(3)
        return np.concatenate([s.sum(0),s.sum(1),s[[r3,2-r3],r3].sum(1)])

    def winner(S):
        ss = sum_all_straights(S)
        ssa = np.absolute(ss)
        win, = np.where(ssa==3)
        if win.size:
            e = ss[win[0]]//3

        sas = sum_all_straights(np.absolute(S))
        if (sas>ssa).all():
            e = 0
return e            

这里有一种方法:我们可以通过对每条直线的字段求和来检查是否有赢家。如果至少有一个和是3或-3,那么玩家X或O赢了

如果没有赢家,我们检查是否有平局。如果没有玩家能够再赢,即如果每条直线至少有一个X和一个O,则游戏将被绘制。我们可以检测到,通过首先获取棋盘的绝对值,然后求和,将其称为“SAS”-这计算每条直线上的筹码,无论它们属于谁-,然后首先求和,然后获取绝对值,称之为“SSA”。如果两个玩家在同一条线上都有筹码,那么总数中会有一些取消,SSA将比SAS小。如果每条直线都是这样,那么游戏就被画出来了

实施:

import numpy as np

def sum_all_straights(S):
    r3 = np.arange(3)
    return np.concatenate([S.sum(0),S.sum(1),S[[r3,2-r3],r3].sum(1)])
#                               ^        ^            ^ 
#                               |        |            |
#                               |         ------------+-----
#                               |                     |     |
#                               |         ------------      |
# This returns the three vertical sums,  |   the three horizontal sums and
# the two diagonal sums, using advanced indexing


def winner(S):
    ss = sum_all_straights(S)
    ssa = np.absolute(ss)
    win, = np.where(ssa==3)
    if win.size:
        return ss[win[0]]//3
    sas = sum_all_straights(np.absolute(S))
    if (sas>ssa).all():
        return 0


examples = b"""
XO.   OOO   ...   XXO
OXO   XX.   .X.   OXX
XXO   OXX   .O.   XOO
"""

examples = np.array(examples.strip().split()).reshape(3,4,1).view("S1").transpose(1,0,2)

examples = 0 + (examples==b'X') - (examples==b'O')
for example in examples:
    print(example,winner(example),"\n")
演示:


嗨@Paul,谢谢你的意见。这是否说明谁是赢家?我仔细阅读了你的方法,发现了这个疑问,如果比赛还没有结束(既不是赢也不是平局,比赛还在继续),我应该在哪里提出“无”的声明@VishwaV从这个例子中不是很清楚吗?它显示了四个不同的棋盘,每个棋盘都有
赢家
功能的输出,即
0
——游戏进行中,玩家“O”赢,游戏进行中,平局。嗨@Paul,我现在理解并尝试了。现在它抛出一个断言错误,当玩家X获胜时,断言e==1。我正在完全根据你的建议编辑上述代码。你能帮我纠正这个错误吗?@VishwaV你把这个函数放在另一个函数里面了。这是完全多余的。特别是,
winner
中的代码从未执行,因为从未调用
winner
。相反,只需将
winner
重命名为
check\u game
,不要将其放入另一个函数中,事实上,不要更改任何其他内容。嗨@Paul,谢谢你指出了这个错误。我照你说的做了,现在它抛出了一个不同的断言错误:“断言e为无#游戏尚未结束”。
[[ 1 -1  0]
 [-1  1 -1]
 [ 1  1 -1]] None 

[[-1 -1 -1]
 [ 1  1  0]
 [-1  1  1]] -1 

[[ 0  0  0]
 [ 0  1  0]
 [ 0 -1  0]] None 

[[ 1  1 -1]
 [-1  1  1]
 [ 1 -1 -1]] 0