V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mrxyz
V2EX  ›  问与答

想搞一个以 Python 运行的计算骰子结果的程序,求建议。

  •  
  •   mrxyz · 2021-07-24 04:57:17 +08:00 via Android · 1626 次点击
    这是一个创建于 1251 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近跟朋友喝酒玩骰子,发现一个游戏有点意思。

    假设有 abc 三个人,每人五颗骰子,当 A 报点之后 B 猜他的点数,然后报点,C 接着猜 B 的点数,每个人猜点数的时候都只能比上一家高,击鼓传花,一直循环,直到某一人觉得上一家的点数绝对在场上没有,那就开他,输了喝酒。

    这个游戏的核心是击鼓传花,并且报点只能比上一家大,例如 A 报点三个 5 那么 B 必须报点三个 6 或者四个 2 这样子。

    这个游戏有三个特殊规则
    一:1 点可以当任何数,比如我的骰子有三个 1 和一个 2 一个 3,那么我可以报点四个 2,或者四个 3 。结算的时候场上每个人的 1 点都是公用的参与结算。
    二:如果某人把 1 点报了,那么第一条规则就作废。并且下一家可以考虑继续加 1 报点,或者直接翻倍报点,那么第一条规则生效。例如 A 报点四个 1,B 可以报点五个 1,如果 B 觉得有必要搏一把,可以翻倍从八个 X 开始报点。
    三:玩家的五颗骰子摇出豹子算六个。
    12 条回复    2021-07-24 20:47:26 +08:00
    mrxyz
        1
    mrxyz  
    OP
       2021-07-24 05:07:01 +08:00 via Android
    抱歉前面不小心点提交了,接着描述。

    那么基于这个规则,要写一个 Python 程序的思路是怎样的,不知道这个和围棋的神经计算程序 Leela zero 是否有相似的运作思路,比如我设置好场上的骰子数量之后,然后报点,它给我计算我该喊的点数,这个计算结果是计算概率,然后提交出概率最大的点数,按照概率给出建议是否该开。

    我个人觉得这个游戏规则用穷举貌似不好计算,因为每个玩家并不会真正的如实报点,玩的过程中,每个人都会诓一下,以套路下家或者引导别人喊到我想要的点数上来。所以在这里发出这个游戏规则想集思广益一下
    mrxyz
        2
    mrxyz  
    OP
       2021-07-24 05:10:44 +08:00 via Android
    再补充一点,这个游戏在第一个人报点的时候必须是按照场上玩家数量加一报点,例如三个人就要从四个 X 报点。五个人从六个 X 报点。如果第一个人想报点 1 而不是 X,那么可以自由决定用实际玩家数量来报点 1,例如五个人就报点五个 1,或者六个 1 这样子,反正就是不能少于场上玩家。
    mrxyz
        3
    mrxyz  
    OP
       2021-07-24 05:26:22 +08:00 via Android
    抱歉有两点忘说了,如果某玩家的五个骰子是不重复的称为单色,那么他的骰子不参与结算。

    还有结算的时候按照场上的骰子数来结算,而不是按照被开那个人的骰子数来结算。

    举例 1:
    A 点数为 11235,B 为 22233,C 为 23333 。A 报点四个 2,B 觉得有,报点五个 2 或者很自信报点七个 2,轮到 C 觉得没有那么多,C 开 B,C 输。(场上刚好七个 2 )

    举例 2:A 点数为 12345,B 点数为 12356,C 点数为 33333 。C 根据自己的情况直接报点六个 3,轮到 A,A 选择加一报点七个 3,轮到 B,B 觉得没有选择开 A,B 输。(场上两个单色,只有 C 的参与结算,C 的豹子,场上总数为六颗)
    mrxyz
        4
    mrxyz  
    OP
       2021-07-24 05:54:30 +08:00 via Android
    这个程序我想设计的是,当游戏开始,我输入我的点数后,根据规则计算,然后按照胜率给出几种结果参考去报数,并且由于这个游戏在开点之前是一直循环叫喊的,还需要允许输入新的报点数据后,继续计算。并不是一次就完。而理论上在输入更新的一次报点数据后,程序计算出来的胜率会更高。
    charlie21
        5
    charlie21  
       2021-07-24 05:55:15 +08:00 via iPhone
    太复杂了自己发明的游戏吗
    zxCoder
        6
    zxCoder  
       2021-07-24 07:05:48 +08:00 via Android
    太复杂了看不懂
    GuuJiang
        7
    GuuJiang  
       2021-07-24 11:11:55 +08:00 via iPhone
    @mrxyz 这不就是“吹牛”嘛,好好的规则被你给描述得细碎
    这个游戏说实话跟概率关系不大,因为别人的任意一次报点都有可能是假的,虽然通过统计确实可以得出一些类似“这个人上一次和这一次之间必有一个是假的”这样的结论,但是对于游戏决策没有关注,因为有可能是上一次假这一次真

    @charlie21 @zxCoder 给楼上看不懂规则的解释下,如果没理解错,题主说的应该是流行于全国各地酒吧的名为“吹牛”的游戏,基本规则如下
    1. 所有人摇骰子,每个人只能看到自己的点数,按顺序依次行动
    2. 每次行动中可以喊“X 个 Y”,意思是所有人的骰子加起来至少有 X 个骰子点数为 Y
    3. 上一个玩家喊完后下一个玩家可以接着喊 X1 个 Y1,且必须满足 Y1 > Y or (Y1 == Y and X1 > X),也可以选择开,如果选择了开,所有人把骰子翻开,如果上家喊的条件满足则上家喝酒,否则开的这个玩家喝酒,游戏结束
    4. 还有其他一些补充规则,例如 1 可以当任意点,但是如果有人喊过 X 个 1 则此规则失效

    这个游戏由于是非完全信息博弈,且有很大的心理成分,所以用程序计算的帮助不大,实战当中基本的技巧一般是利用自己某个点数较多的优势,把对手逼到一个“喊又喊不过,开的话你又是真的”这个境地,同时前期还可以冒险喊一些假的,让别人对你的点数产生误判,从而在后面喊真的进行出击时积累优势,这些更多考验的是心理素质、表演能力以及对对手风格的熟悉程度等,假设对面是个绝对理性的人或机器,在已知大家都只会选择最优解的前提下,可以通过马尔可夫过程大致推断出对面的点数从而做出决策,但要是对面是个不按常理出牌乱喊一气的,理性一方反而会被乱拳打死老师傅,因为你从前面得到的虚假信息中推出了错误的结论
    aeron
        8
    aeron  
       2021-07-24 11:33:32 +08:00 via iPhone
    067 ?
    jmc891205
        9
    jmc891205  
       2021-07-24 12:11:03 +08:00
    3 个人 5 个骰子参与的决策点的数量大概在 10^16 左右,这个数量级可以做完全搜索。
    mrxyz
        10
    mrxyz  
    OP
       2021-07-24 13:13:47 +08:00 via Android
    @GuuJiang 描述太对了。我才玩,所以不清楚这个游戏叫啥。确实是你说的这样,我想的是,既然算是信息博弈类型,那么它的计算方式是否可以用神经网络下围棋的那套算法来玩,因为如果通过穷举,它有很多可能性,并且无法准确验证有效性。而通过类似阿法狗的那种下围棋的方式来计算学习,可能会有比较好的效果,我详细如果是机器懂这个规则,他们玩起来会比人类强。
    GuuJiang
        11
    GuuJiang  
       2021-07-24 13:42:11 +08:00
    @mrxyz 你以 liar's dice 为关键字搜索,可以看到确实有一些人尝试了 AI 在这个游戏中的应用,有兴趣的话可以看一下,不过个人观点,程序在这种游戏里作用极其有限,因为不管是什么样的程序,都需要正确的输入来的得到正确的输出,但是在这个游戏里,输入完全有可能是无效的甚至负面的,就好像专业高手玩的斗地主,在普通玩家看起来有些操作会很蠢,实际上是因为高手追求稳定,总是考虑最坏情况,而普通玩家通常喜欢赌一把,所以有的时候就会看到高手因为过度谨慎而输掉一把牌,但是换成普通玩家反而能赌对,吹牛也是一样,即使真的做出这样的程序,我估计在面对小白玩家时反而容易输掉
    mrxyz
        12
    mrxyz  
    OP
       2021-07-24 20:47:26 +08:00 via Android
    @GuuJiang 感谢指路,我个人认为这种不像围棋一样带有纯理性预判的逻辑也许对 ai 算法也是很有挑战性的。希望有一天能看到这个游戏更好的博弈算法。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1208 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 23:28 · PVG 07:28 · LAX 15:28 · JFK 18:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.