Здесь у вас есть рабочее решение.Он реализован на Python, но я думаю, что он может вам помочь.
Дерево игры рекурсивно создается с помощью функции build_tree
и реализовано в виде списка списков.
Функция build_tree
принимает в качестве входных параметров доску (узел дерева) и фигуру, у которой есть ход, и строит все возможные новые доски, полученные в результате применения фигуры к доске.Затем для каждой из этих новых досок она снова вызывает функцию build_tree
, но на этот раз меняет фигуру, у которой есть ход.Когда доска является терминальной (без пустых квадратов), рекурсия заканчивается.
Это результирующее дерево для доски 1x3:
[(0, 0, 0), [[('x', 0, 0), [[(' x ',' o ', 0), [(' x ',' o ',' x ')]], [(' x ', 0,' o '), [('x', 'x', 'o')]]]], [(0, 'x', 0), [[('o', 'x', 0), [('o', 'x', 'x')]], [(0, 'x', 'o'), [('x', 'x', 'o')]]]]], [(0, 0,'x'), [[('o', 0, 'x'), [('o', 'x', 'x')]], [(0, 'o', 'x'), [('x', 'o', 'x')]]]]]]
Пустые квадраты обозначаются как 0.
Для игры в крестики-нолики, пожалуйста, измените blank_board = (0,0,0)
до blank_board = (0,0,0,0,0,0,0,0,0)
, чтобы иметь доску 3х3.
def change_piece(piece):
if piece == 'x': return 'o'
return 'x'
def is_terminal(board):
"""Check if there are any empty square in the board"""
for square in board:
if square == 0:
return False
return True
def build_tree(node, piece):
"""Build the game tree recursively.
The tree is implemented as a list of lists.
"""
child_nodes = []
for index, value in enumerate(node):
if value == 0:
new_node = list(node)
new_node[index] = piece
new_node = tuple(new_node)
if not is_terminal(new_node):
child_nodes.append(build_tree(new_node,change_piece(piece)))
else:
child_nodes.append(new_node)
if child_nodes:
return [node,child_nodes]
return
if __name__ == "__main__":
blank_board = (0,0,0)
game_tree = build_tree(blank_board,'x')
print(game_tree)