检查tictactoe游戏是否结束并返回获胜者

时间:2019-10-29 04:29:21

标签: numpy matrix tic-tac-toe

我正在尝试对该函数进行编码,该函数检查tictactoe游戏是否结束,如果游戏结束,则返回赢家。你能帮我编码这部分吗?

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

1 个答案:

答案 0 :(得分:0)

这是一种方法:我们可以通过合计每条直线的字段来检查赢家。如果总和中至少有一个为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")

演示:

[[ 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