微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

找到所有可能的二十一点手的算法

如何解决找到所有可能的二十一点手的算法

我正在尝试用 Python 编写一个函数,该函数获取玩家手中的牌值列表和值列表,并将返回玩家最终可能得到的所有可能的手牌的列表,这些手牌的值为17 或更高。卡片由与卡片价值相对应的整数表示(2-10,A 总是 11。所有面卡价值 10)。这是我尝试编写的函数deck一个整数列表,代表仍在一副牌中的牌(缺少 3 张牌,2 张在玩家手中,一张给庄家)。 runninglist 是代表玩家手中牌的整数列表。 playerPossibilities 是总点数为 17 或更高的手牌列表。

def simPlayerHelper(deck,runningList,playerPossibilities):
    for card in deck:    
        runningList.append(card)
        if sum(runningList) > 16:
            temp_rl = runningList.copy()
            playerPossibilities.append(temp_rl)
            runningList.remove(card)
        else:
            deck.remove(card)
            simPlayerHelper(deck,playerPossibilities)
    for x in playerPossibilities:
        print(x)

递归无法正常工作。例如,如果 runningList 以“10”和“2”开头,那么 card 中的第一个 deck 将是另一个 2。另一张牌被抽取,因为我们没有 17然而,它是另一个 2。这很好。我们现在有 16 张,所以从牌组中取出另一张牌,也就是最后 2 张(牌按顺序)。我们现在有 18 个,所以 [10,2,2] 被添加playerPossibilities。然后添加 [10,3](四次,代表牌组中的四个 3),[10,4](四次),依此类推。那也行。但现在我需要它回到手上的第四张牌,并确定所有可能性,如果它是 3,然后是 4,然后是 5,依此类推。然后回到第三张牌,如果这张牌是 3,然后是 4,然后是 5,对于牌组中的所有剩余牌,找出可能性。现在,它只循环遍历手中的最后一张牌,因此 playerPossibilities 中的所有项目都以 10,2 开头。

如果这个解释不是很清楚,我很抱歉。我被卡住了,所以任何关于如何让这个递归正常工作的帮助将不胜感激。谢谢!

解决方法

这里有很多问题。

  1. for card in deck - 您正在迭代一个列表,然后从中删除对象。这是让事情无法正常工作的好方法。

  2. if // else - 你抽一张牌,将它放入你的手上并检查你的获胜条件。如果高于 16,请记录答案,从您的手中移开并继续。伟大的!如果不超过 16,请执行递归……但是在递归完成后,您没有将卡从手上移走的机制。 (我相信这是您当前错误的来源)

为了解决这个问题,对于这种问题,你可能想在你的递归函数中复制“deck”,这样子调用就不能从你的父deck(你没有检查它们的地方)拉出卡片然而)。您还需要确保每次迭代后都将卡片从您的手中移除。我可能会建议像这样做你的循环

def run_sims(deck):
  current_deck = copy(deck)
  while current_deck:
    card = deck.pop()
    current_hand.append(card)
    # do logic / recurse
    current_hand.pop(card)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?