【问题标题】:all the possible states for wild tic tac toe (wild Tic-tac-toe combinatorics)野生井字游戏的所有可能状态(野生井字游戏组合)
【发布时间】:2022-07-18 22:36:28
【问题描述】:

Wild tic-tac-toe 是一款类似于 tic-tac-toe 的中立游戏。然而,在这个游戏中,玩家可以选择在每一步中放置 X 或 O 更改该规则后所有可能的状态是什么?

【问题讨论】:

    标签: python combinatorics tic-tac-toe


    【解决方案1】:

    这是对蛮力来说实际上足够简单的问题之一

    只有 3**9 或 19,683 种将 x、o 或置于网格中的可能组合,并且并非所有这些都有效。

    首先,经典井字游戏中的有效游戏位置是 x 和 o 计数之间的差不超过 1,因为它们必须交替移动,但这里不是这种情况。

    另外,不可能有双方连续三个的状态,所以也可以打折。如果两者都连续三个,那么他们中的一个会在上一步中获胜。

    实际上还有另一个限制,一个字母 X 或 O 不可能在没有公共单元的情况下以两种不同的方式获胜(同样,它们会在上一步中获胜),这意味着:

    XXX
    OOO
    XXX
    

    无法实现,而:

    XXX
    OOX
    OOX
    

    有道理。

    所以唯一无效的状态是我们在同一方向(垂直或水平)有两条获胜线的状态

    代码如下:

    import numpy as np
    a = [['X', 'O', 'O'], ['X', 'O', 'X'], ['X', 'X', 'O']]
    
    def checkRows(board):
        i = -1
        for row in board:
            i += 1
            if len(set(row)) == 1 and set(row) != {''}:
                r = row[0]
                board[i][0] = board[i][1] = board[i][2] = ''
                return r
        return 0
    def checkinvalide(board):
        for newBoard in [board, np.transpose(board)]:
            k = 0
            result = checkRows(newBoard)
            if result:
                k += 1
                result = checkRows(newBoard)
                if result:
                   k += 1
            if k == 2:
                return k
        return k
    
    def generatelists():
     StatesMatrix = np.zeros((3**9,9))
     for i in range(3**9):
         c = i
         for j in range(9):
           StatesMatrix[i][j] = c % 3
           c //= 3
     k = 0
     e = 0
     dic = {}
     for i in StatesMatrix:
        e += 1
        i = ["X" if item == 1 else item for item in i]
        i = ["O" if item == 2 else item for item in i]
        i = ["" if item == 0 else item for item in i]
    
        dd_board = np.reshape(i, (3, 3))
    
        result = checkinvalide(dd_board)
        if result != 2:
            dic.update({tuple(i): 0})
            k += 1
     print(k)
     return dic
    generatelists()
    
    

    执行代码会生成 19177 个状态

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2015-01-08
      相关资源
      最近更新 更多