Python实现快速计算24点游戏的示例代码

目录
  • 24 点游戏规则
  • 回溯算法计算思路
  • 生成表达式

24 点游戏规则

有4个范围在 [1,9] 的数字,通过「加、减、乘、除」四则运算能够获得24,认为有解。

4个范围在 [1,9] 的数字能够产生495种可能,其中404中组合情况都是有解的,有解概率高达81.62%。

下面我们用python来验证它,首先计算组合数:

from scipy.special import comb

comb(9, 4, repetition=True)

495.0

可以看到python计算出9个数字有重复的组合情况数是495。

下面我们需要一个方法,判断4个数字能否组合成为24点,这里我采用回溯算法进行计算。

回溯算法计算思路

首先从4个数字中选择2个数字,然后再选择一种运算操作,然后用得到的结果取代选出的2个数字。然后在剩下的3个数字中,进行同样的操作。依次类推,最终计算到只剩一个数字,看结果是否为24即可。

开始编码:

from operator import add, mul, sub, truediv

ops = [add, mul, sub, truediv]

def judgePoint24(nums) -> bool:
    if not nums:
        return False
    n = len(nums)
    if n == 1:
        return round(nums[0], 3) == 24
    for i, j in permutations(range(n), 2):
        # 选2个数字
        x, y = nums[i], nums[j]
        newNums = []
        # 选择加减乘除 4 种运算操作之一,用得到的结果取代选出的 2 个数字
        for k, z in enumerate(nums):
            if k != i and k != j:
                newNums.append(z)
        for k in range(4):
            if k < 2 and i > j:
                # 加法和乘法满足交换律,跳过第二种顺序
                continue
            if k == 3 and round(y, 3) == 0:
                # 除法运算除数不能为0
                continue
            newNums.append(ops[k](x, y))
            if judgePoint24(newNums):
                return True
            newNums.pop()
    return False

然后我们遍历所有的组合进行判断:

from scipy.special import comb

​​​​​​​total = int(comb(9, 4, repetition=True))
cnt = sum(judgePoint24(nums)
          for nums in combinations_with_replacement(range(1, 10), 4))
print(f'{cnt}/{total}={cnt/total:.2%}')

最终一秒内计算出结果:

生成表达式

下面我们加大难度,要求在求解时,能够同时返回可行的表达式。暴力遍历固然可以实现,但是耗时太长,能否在这种回溯算法的基础上实现呢?

我的思路是加个变量记录每次的选择,最终再通过一定的技巧进行还原,最终编码:

from operator import add, mul, sub, truediv
from itertools import permutations, combinations_with_replacement
from collections import defaultdict

def judgePoint24(nums) -> bool:
    ops = [add, mul, sub, truediv]
    op_char = "+*-/"
    record = []

    def solve(nums) -> bool:
        if not nums:
            return False
        n = len(nums)
        if n == 1:
            return round(nums[0], 3) == 24
        for i, j in permutations(range(n), 2):
            # 选2个数字
            x, y = nums[i], nums[j]
            newNums = []
            # 选择加减乘除 4 种运算操作之一,用得到的结果取代选出的 2 个数字
            # 先添加未选择的数字
            newNums = [z for k, z in enumerate(nums) if k not in (i, j)]
            for k in range(4):
                if k < 2 and i > j:
                    # 加法和乘法满足交换律,跳过第二种顺序
                    continue
                if k == 3 and (round(y, 3) == 0):
                    # 除法运算除数不能为0
                    continue
                v = ops[k](x, y)
                newNums.append(v)
                record.append(([round(x, 3), round(y, 3)],
                              op_char[k], round(v, 3)))
                if solve(newNums):
                    return True
                newNums.pop()
                record.pop()
        return False
    flag = solve(nums)
    if not flag:
        return False, ""
    cache = defaultdict(list)
    for ns, op, v in record:
        for i in range(2):
            if cache[ns[i]]:
                ns[i] = "("+cache[ns[i]].pop()+")"
        a, b = ns
        cache[v].append(f"{a}{op}{b}")
    return flag, cache[24][0]+"=24"

然后开始遍历:

total = cnt = 0
for nums in combinations_with_replacement(range(1, 10), 4):
    total += 1
    r, expression = judgePoint24(nums)
    if r:
        print(expression, end="\t")
        cnt += 1
        if cnt % 8 == 0:
            print()
print()
print(f'{cnt}/{total}={cnt/total:.2%}')

最终结果:

可以看到,我们已经得到了404个24点的有效解表达式。

到此这篇关于Python实现快速计算24点游戏的示例代码的文章就介绍到这了,更多相关Python计算24点游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解如何利用Python制作24点小游戏

    目录 先睹为快 游戏规则(改编自维基百科) 逐步实现 Step1:制作24点生成器 Step2:定义游戏精灵类 Step3:实现游戏主循环 先睹为快 24点 游戏规则(改编自维基百科) 从1~10这十个数字中随机抽取4个数字(可重复),对这四个数运用加.减.乘.除和括号进行运算得出24.每个数字都必须使用一次,但不能重复使用. 逐步实现 Step1:制作24点生成器 既然是24点小游戏,当然要先定义一个24点游戏生成器啦.主要思路就是随机生成4个有解的数字,且范围在1~10之间,代码实现如下:

  • Python+Pygame实战之24点游戏的实现

    目录 导语 游戏介绍 实现代码 游戏效果展示 导语 我第一次玩24点是初中的时候,那时候和堂弟表哥在堂妹家玩,堂妹提出玩24点游戏,堂妹比我们小三岁,可能正在上小学吧. 拿出一副扑克牌去掉大小怪和花牌,从剩下的牌里随便找出四张,谁能先用加减乘除算出24就算赢. 如果大家都同意放弃或者有人计算出来就重新开始一局.结果是我们三个哥哥都输多赢少,堂妹显然是经过了准备的. 其实24点小游戏除了能用来无聊的时候跟朋友与一起玩儿下,还能锻炼思维能力,尤其是家里的小孩子提升数学能力 多锻炼还是很有好处的,尤其

  • python经典趣味24点游戏程序设计

    一.游戏玩法介绍: 24点游戏是儿时玩的主要益智类游戏之一,玩法为:从一副扑克中抽取4张牌,对4张牌使用加减乘除中的任何方法,使计算结果为24.例如,2,3,4,6,通过( ( ( 4 + 6 ) - 2 ) * 3 ) = 24,最快算出24者剩. 二.设计思路: 由于设计到了表达式,很自然的想到了是否可以使用表达式树来设计程序.本程序的确使用了表达式树,也是程序最关键的环节.简要概括为:先列出所有表达式的可能性,然后运用表达式树计算表达式的值.程序中大量的运用了递归,各个递归式不是很复杂,大

  • python+pyqt5实现24点小游戏

    本文实例为大家分享了python实现24点游戏的具体代码,供大家参考,具体内容如下 描述:一副牌中A.J.Q.K可以当成是1.11.12.13.任意抽取4张牌,用加.减.乘.除(可加括号)把牌面上的数算成24.每张牌对应的数字必须用一次且只能用一次.在规定时间内输入算式,输入正确加十分,输入错误生命值减一,点击确定提交并进入下一题,点击清空可清空算式.点击开始游戏进入游戏,可重新开始游戏. from PyQt5 import QtCore, QtWidgets from PyQt5.QtWidg

  • Python实现24点小游戏

    本文实例为大家分享了Python实现24点小游戏的具体代码,供大家参考,具体内容如下 玩法:通过加减乘除操作,小学生都没问题的. 源码分享: import os import sys import pygame from cfg import * from modules import * from fractions import Fraction '''检查控件是否被点击''' def checkClicked(group, mouse_pos, group_type='NUMBER'):

  • Python实现快速计算24点游戏的示例代码

    目录 24 点游戏规则 回溯算法计算思路 生成表达式 24 点游戏规则 有4个范围在 [1,9] 的数字,通过「加.减.乘.除」四则运算能够获得24,认为有解. 4个范围在 [1,9] 的数字能够产生495种可能,其中404中组合情况都是有解的,有解概率高达81.62%. 下面我们用python来验证它,首先计算组合数: from scipy.special import comb comb(9, 4, repetition=True) 495.0 可以看到python计算出9个数字有重复的组合

  • 基于Python实现24点游戏的示例代码

    目录 1.前言 2.思路 3.代码 1.前言 24数大家之前玩过没有? 规则:一副扑克牌抽走大王,小王,K,Q,J(有的规则里面会抽走10,本文一律不抽走),之后在牌堆里随机抽取四张牌,将这四张牌加减乘除得到24. 如果再高级一点,还会有根号.阶乘.幂之类的算法,别问为啥不能幂运算,问就是懒,自己看思路自己实现去(bushi. 知识点:随机数,列表,嵌套判断,循环,死循环,都是新手接触的东西. 由于不能进行像根号,阶乘高级的运算,改版之后完全可以了. 话不多说,上思路 2.思路 1.随机生成四个

  • python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)

    python+pygame实现坦克大战小游戏-可以自定义子弹速度: 运行环境–python3.7.pycharm: 源码需要请:点赞留言邮箱: 正常版子弹速度: 普通速度版 加速版子弹速度: 子弹加速版 另外还有多种道具,支持两人一起玩.main()方法如下: def main(): pygame.init() pygame.mixer.init() resolution = 630, 630 screen = pygame.display.set_mode(resolution) pygame

  • Python实现快速计算词频功能示例

    本文实例讲述了Python实现快速计算词频功能.分享给大家供大家参考,具体如下: 这几天看到一位同事的代码,方法如下: def cut_word(body): temp_dict={} if body is not None: temp=jieba.cut(body) for t in temp: temp_dict[t]=1 else: pass return temp_dict 这个函数的功能是,输入一段字符串,比如:'今天天气很不错',输出一个字典,key为使用结巴的cut方法之后切分的词

  • Python快速实现简易贪吃蛇小游戏的示例代码

    贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本.既简单又耐玩.该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长. 贪吃蛇游戏最初为单机模式,后续又陆续推出团战模式.赏金模式.挑战模式等多种玩法. 另外还有一种名为“贪吃蛇”钻井测井技术,是运用旋转导向系统.随钻测井系统等的油气田定向钻井.随钻测井技术,可完成海上“丛式井”和复杂油气层的开采需求,大幅降低油气田开发综合成本. 依然是基于pygame库,pip install pygame安装即可 完整代码如下: # 导入

  • Python实现炸金花游戏的示例代码

    今天的第二个作品,哈哈哈哈,搞起来感觉还挺有意思的,不过代码里纸牌J,Q,K,A几个数字被我替换成了11,12,13,14......主要是没有想到简单的办法让其比较,索性都用数字了,我太菜了,希望有大佬指点一下. 代码如下: import random   #导入随机数函数 def puke():     """     生成一副52张的扑克牌(除去大小王)     :return:     """     list1 = ['黑桃', '红桃

  • 基于Python实现超级玛丽游戏的示例代码

    目录 效果演示 基础源码 1.基础设置(tools部分) 2.设置背景音乐以及场景中的文字(setup部分) 3.设置游戏规则(load_screen) 4.设置游戏内菜单等(main_menu) 5.main() 6.调用以上函数实现 效果演示 基础源码 1.基础设置(tools部分) 这个部分设置马里奥以及游戏中蘑菇等怪的的移动设置. import os import pygame as pg keybinding = { 'action':pg.K_s, 'jump':pg.K_a, 'l

  • 基于Python实现开心消消乐小游戏的示例代码

    目录 前言 一.准备 1.1 图片素材 1.2 音频素材 二.代码 2.1 导入模块 2.2 游戏音乐设置 2.3 制作树类 2.4 制作鼠标点击效果 2.5 制作出现元素 2.6 数组 2.7 制作人物画板 三.效果展示(仅部分) 3.1 初始页面 3.2 第一关画面 3.3 失败画面 3.4 第十关画面 穿过云朵升一级是要花6个金币的,有的时候金币真的很重要 前言 嗨喽,大家好呀!这里是魔王~ 一天晚上,天空中掉下一颗神奇的豌豆种子,正好落在了梦之森林的村长屋附近. 种子落地后吸收了池塘的水

  • 基于Python实现围棋游戏的示例代码

    目录 1.导入模块 2.初始化棋盘 3. 开始游戏 4.放弃当前回合落子 5.悔棋判断 6.重新开始 7.右侧太极图的设置 8.落子设置 9.吃子规则判定设置 10.其他 11.程序入口 12.效果图 文件自取 1.导入模块 tkinter:ttk覆盖tkinter部分对象,ttk对tkinter进行了优化 copy:深拷贝时需要用到copy模块 tkinter.messagebox:围棋应用对象定义 如没有以上模块,在pycharm终端输入以下指令: pip install 相应模块 -i h

随机推荐