Python 使用枚举法计算游戏 “24点” 的计算方式

背景介绍

这一切都应该要从一只蝙蝠讲起了,但是我们这次长话短说,今天看媛媛在玩一个叫做“24点”的游戏,其中有些题对于小学生来说比较刁钻,居然要使用到分数,于是便写了24点的解答程序。正好让她先学学排列组合。

代码如下:

class Tenty_four:
    def __init__(self, number: dict):
        self.result = {}
        self.number = number
        self.typeid = ['+', '-', '*', '/']
        self.basket_num = []
        self.basket_typ = []
        self.basket_new = []

    def digital(self):
        for i in self.number:
            for j in self.number:
                if j != i:
                    for m in self.number:
                        if m != i and m != j:
                            for n in self.number:
                                if n != i and n != j and n != m:
                                    a = [self.number[i], self.number[j], self.number[m], self.number[n]]
                                    self.basket_num.append(a)
        for item in self.basket_num:
            if item not in self.basket_new:
                self.basket_new.append(item)

    def operate(self):
        for i in self.typeid:
            for j in self.typeid:
                for k in self.typeid:
                    a = [i, j, k]
                    self.basket_typ.append(a)

    def bracket(self):
        k = ["(", ")"]
        for i in self.basket_new:
            for j in self.basket_typ:
                self.result = {
                    'A': "{0}{1}{2}{3}{4}{5}{6}{7}{8}".format(k[0], i[0], j[0], i[1], k[1], j[1], i[2], j[2], i[3]),
                    'B': "{0}{1}{2}{3}{4}{5}{6}{7}{8}".format(i[0], j[0], k[0], i[1], j[1], i[2], k[1], j[2], i[3]),
                    'C': "{0}{1}{2}{3}{4}{5}{6}{7}{8}".format(i[0], j[0], i[1], j[1], k[0], i[2], j[2], i[3], k[1]),
                    'D': "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}".format(k[0], i[0], j[0], i[1], k[1], j[1], k[0], i[2], j[2], i[3], k[1]),
                    'E': "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}".format(k[0], k[0], i[0], j[0], i[1], k[1], j[1], i[2], k[1], j[2], i[3]),
                    'F': "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}".format(k[0], i[0], j[0], k[0], i[1], j[1], i[2], k[1], k[1], j[2], i[3]),
                    'G': "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}".format(i[0], j[0], k[0], k[0], i[1], j[1], i[2], k[1], j[2], i[3], k[1]),
                    'H': "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}".format(i[0], j[0], k[0], i[1], j[1], k[0], i[2], j[2], i[3], k[1], k[1]),
                    'J': "{0}{1}{2}{3}{4}{5}{6}{7}{8}".format(k[0], i[0], j[0], i[1], j[1], i[2], k[1], j[2], i[3]),
                    'K': "{0}{1}{2}{3}{4}{5}{6}{7}{8}".format(i[0], j[0], k[0], i[1], j[1], i[2], j[2], i[3], k[1]),
                }
                n = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K']
                for a in n:
                    try:
                        eval(self.result[a])
                    except Exception as e:
                        pass
                    finally:
                        if eval(self.result[a]) == 24:
                            print(self.result[a])


if __name__ == "__main__":
    print('--从小到大输入--')
    a = input("请输入第一个数:")
    b = input("请输入第二个数:")
    c = input("请输入第三个数:")
    d = input("请输入第四个数:")
    number = {'A': a, 'B': b, 'C': c, 'D': d}
    start = Tenty_four(number)
    start.digital()
    start.operate()
    start.bracket()




分布介绍

1.游戏规则

游戏将展示四张卡片,每张卡片上都有一个正整数,每个数字使用一次,进行加、减、乘、除计算得出24点的结果,并将计算过程输入。

2.代码结构
数字枚举
    def digital(self):
        for i in self.number:
            for j in self.number:
                if j != i:
                    for m in self.number:
                        if m != i and m != j:
                            for n in self.number:
                                if n != i and n != j and n != m:
                                    a = [self.number[i], self.number[j], self.number[m], self.number[n]]
                                    self.basket_num.append(a)
        for item in self.basket_num:
            if item not in self.basket_new:
                self.basket_new.append(item)

四个整数一共会产生24种排列组合结果,如果有重复组合存在,还需要对得出的排列结果进行去重处理。

计算符号枚举
def operate(self):
        for i in self.typeid:
            for j in self.typeid:
                for k in self.typeid:
                    a = [i, j, k]
                    self.basket_typ.append(a)

四种运算符号总共产生48种排列组合

计算顺序枚举(括号)
def bracket(self):
        k = ["(", ")"]
        for i in self.basket_new:
            for j in self.basket_typ:
                self.result = {
                    'A': "{0}{1}{2}{3}{4}{5}{6}{7}{8}".format(k[0], i[0], j[0], i[1], k[1], j[1], i[2], j[2], i[3]),
                    'B': "{0}{1}{2}{3}{4}{5}{6}{7}{8}".format(i[0], j[0], k[0], i[1], j[1], i[2], k[1], j[2], i[3]),
                    'C': "{0}{1}{2}{3}{4}{5}{6}{7}{8}".format(i[0], j[0], i[1], j[1], k[0], i[2], j[2], i[3], k[1]),
                    'D': "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}".format(k[0], i[0], j[0], i[1], k[1], j[1], k[0], i[2], j[2], i[3], k[1]),
                    'E': "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}".format(k[0], k[0], i[0], j[0], i[1], k[1], j[1], i[2], k[1], j[2], i[3]),
                    'F': "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}".format(k[0], i[0], j[0], k[0], i[1], j[1], i[2], k[1], k[1], j[2], i[3]),
                    'G': "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}".format(i[0], j[0], k[0], k[0], i[1], j[1], i[2], k[1], j[2], i[3], k[1]),
                    'H': "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}".format(i[0], j[0], k[0], i[1], j[1], k[0], i[2], j[2], i[3], k[1], k[1]),
                    'J': "{0}{1}{2}{3}{4}{5}{6}{7}{8}".format(k[0], i[0], j[0], i[1], j[1], i[2], k[1], j[2], i[3]),
                    'K': "{0}{1}{2}{3}{4}{5}{6}{7}{8}".format(i[0], j[0], k[0], i[1], j[1], i[2], j[2], i[3], k[1]),
                }
                n = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K']
                for a in n:
                    try:
                        eval(self.result[a])
                    except Exception as e:
                        pass
                    finally:
                        if eval(self.result[a]) == 24:
                            print(self.result[a])

四个数字加上三个运算符总共有10种括号位置,直接暴力手打。
使用eval函数运行作为字符串的算式时,会出现除数为零的情况,因此引入异常处理,保证程序运行。
运算结果(有不知名bug)
新手写代码,代码可能不是很规整,bug似乎也不少

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值