【问题标题】:An expectiminimax tree for the dice poker game骰子扑克游戏的期望极小极大树
【发布时间】:2016-07-27 19:15:24
【问题描述】:

我目前正在用 Python 编写一个骰子扑克游戏。这些规则类似于the game found in The Witcher 2,而是基于不久前从 App Store 下架的一款旧的移动骰子扑克游戏。

规则如下:

  • 玩家和 AI 最初各掷出 5 个poker dice
  • 玩家和 AI 选择要握住的骰子并滚动其余的骰子,然后将结果相互透露。
  • 重复上述步骤。
  • 谁的手牌高(见下文)谁赢,绝对高的牌作为决胜局。

    1. 五类
    2. 四种类型
    3. 满屋
    4. 三类
    5. 两对
    6. 一对
    7. 高牌

相关代码如下:

class Tree(object):
    '''Generic tree node'''
    def __init__(self, children=None, value=None, type=None):
        self.children = []
        self.value = value
        self.type = type  # either 'player', 'ai', or 'chance'
        if children is not None:
            for child in children:
                self.add_child(child)

    def add_child(self, node):
        assert isinstance(node, Tree)
        self.children.append(node)

    def is_terminal(self):
        return len(self.children) == 0


def expectiminimax(node):
    '''Adapted from Wikipedia's pseudocode'''
    MAX_INT = 1e20
    if node.is_terminal():
        return node.value
    if node.type == 'player':
        q = MAX_INT
        for child in node.children:
            q = min(q, expectiminimax(child))
    elif node.type == 'ai':
        q = -MAX_INT
        for child in node.children:
            q = max(q, expectiminimax(child))
    elif node.type == 'chance':
        q = 0
        for child in node.children:
            # All children are equally probable
            q += len(node.children)**-1 * expectiminimax(child)
    return q


def ai_choose(ai_hand, player_hand):
    '''
    Given an AI hand and a player hand, choose which cards to hold onto
    for best outcome.
    '''
    def construct_tree(ai_hand, player_hand):
        '''
        Construct a 5-layer (?) tree for use with expectiminimax.
                      Δ                MAX
                    /   \
                   O ... O             CHANCE - Possible AI moves
                 /  \   /  \
                ∇ .. ∇ ∇ .. ∇          MIN - Possible card dice rolls
              /   \    ........
             O ... O  ...........      CHANCE - Possible player moves
           /  \   /  \ ............
          ▢ .. ▢ ▢ .. ▢ .............  END - Possible card dice rolls
        '''
        tree_structure = ['ai', 'chance', 'player', 'chance', 'ai']
        tree = Tree(type=tree_structure[0])
        for subset in powerset(ai_hand.hand):
            tree.add_child(Tree(value=subset))
    # ...

这个层结构正确吗?或者是否应该重新排列最小、最大和机会层?

也欢迎其他通用cmets。

【问题讨论】:

    标签: python tree artificial-intelligence minimax expectiminimax


    【解决方案1】:

    据我所知,分层是正确的。前段时间我做了类似的事情,我认为你可以在没有树数据结构的情况下实现它,它应该是可行的并且可能更干净,因为你不需要机会类型。

    【讨论】:

    • 等等,为什么我不需要机会类型?游戏不是确定性的。
    • 对不起,我的错。当我写那个的时候,我还在想我自己的程序。你的显然不是确定性的。但是如果你想写一个人工智能,玩家得到哪个骰子并不重要。除非你能投降。人工智能应该只计算最适合他的。因为它不会对玩家产生影响。
    • @Allafesta 好吧,我想它会的,对吧?因为玩家拥有的东西可能会激发 AI 承担更高的风险。如果 AI 有完整的葫芦,它应该根据玩家是否有一对与玩家是否有顺子来做出不同的决定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多