python 24点游戏

python提供了很多强大的工具                                                                                                                                                                正则表达式和itertools

我们可以用正则表达式匹配所有带括号的组合

format = ['((%d%s%d)%s%d)%s%d', \
          '(%d%s%d)%s(%d%s%d)', \
          '(%d%s(%d%s%d))%s%d', \
          '%d%s((%d%s%d)%s%d)', \
          '%d%s(%d%s(%d%s%d))']

itertools.permutations(p[,r]);返回p中任意取r个元素做排列的元组的迭代器

itertools.product(iter1,iter2, ... iterN, [repeat=1]);创建一个迭代器,生成表示item1,item2等中的项目的笛卡尔积的元组,repeat是一个关键字参数,指定重复生成序列的次数

以下是具体代码:

import re
import itertools
import random
def GetRandom():
    J,Q,K = 11,12,13
    list = [1,2,3,4,5,6,7,8,9,10,J,Q,K]
    number = random.sample(list,4)
    return number

operator = ['+', '-', '*', '/']
#算子和括号的组合只存在如下五种表达式结构
format = ['((%d%s%d)%s%d)%s%d', \
          '(%d%s%d)%s(%d%s%d)', \
          '(%d%s(%d%s%d))%s%d', \
          '%d%s((%d%s%d)%s%d)', \
          '%d%s(%d%s(%d%s%d))']


#数字和字母穿插
def Chuan(num, letter):
    chuan = []
    for jj in range(len(num)):
        chuan.append(num[jj])
        try:
            chuan.append(letter[jj])
        except IndexError:
            pass
    return chuan

#构建数字和算子的组合
def Combine(numlist, oplist = operator):
    expre = []
    for jj in list(itertools.permutations(numlist, len(numlist))):
        for ii in list(itertools.product(oplist, repeat = 3)):
            expre.append(Chuan(list(jj), list(ii)))
    return expre

#获取全部表达式
def GetExpression(numlist, target, form = format):
    expre = set()
    exall = Combine(numlist)
    for gg in exall:
        for ff in form:
            try:
                ex = str(ff)%tuple(gg)
                if eval(ex) == target:
                    expre.add(ex)
            except ZeroDivisionError:
                pass
    return expre

#24点游戏开始判断
def Game24():
    flag = 0
    life = 3
    lists = GetRandom()
    for jj in list(GetExpression(GetRandom(), 24)):
        while flag!=1:
            if eval(jj)==24:
                flag = 1
            else:
                lists = GetRandom()
    if flag == 1:
        for num in GetRandom():
            print(num,end=' ')
    while life>0:
        result = input("\n请输入24点正确方法\n")
        if result in list(GetExpression(lists, 24)) or eval(result)==24:
            print("恭喜你答对了")
        else:          
            life = life-1
            print("回答错误,你还有%d条命" %life)
            if life==0:
                print("游戏结束,你输了")
                print("正确结果为")
                for a in list(GetExpression(lists, 24)):
                    print(a)
        

Game24()

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python二十四点游戏代码可以通过使用逆波兰表达式和回溯算法来实现,具体步骤如下: 1. 生成所有可能的四个数字的排列组合; 2. 对于每个排列组合,生成所有可能的运算符排列组合; 3. 将每个运算符排列组合和数字排列组合组合成逆波兰表达式; 4. 利用栈来计算逆波兰表达式的值,如果计算结果为24,则找到一组解; 5. 如果所有的排列组合和运算符排列组合都被尝试过,但是没有找到结果,则无解。 下面是一个简单的Python代码示例: ```python import itertools # 计算逆波兰表达式的值 def calc(exp): stack = [] for e in exp: if isinstance(e, int): stack.append(e) else: b = stack.pop() a = stack.pop() if e == "+": stack.append(a + b) elif e == "-": stack.append(a - b) elif e == "*": stack.append(a * b) elif e == "/": stack.append(a / b) return stack # 生成所有可能的四个数字的排列组合 def generate_numbers(): return list(itertools.permutations(range(1, 14), 4)) # 生成所有可能的运算符排列组合 def generate_operators(): return list(itertools.product(["+", "-", "*", "/"], repeat=3)) # 将运算符排列组合和数字排列组合组合成逆波兰表达式 def generate_expression(numbers, operators): result = [] for i in range(3): result.extend([numbers[i], operators[i]]) result.append(numbers) return result # 判断逆波兰表达式是否可以计算出24 def is_solution(expression): try: return calc(expression) == 24 except ZeroDivisionError: return False # 找到一组解 def find_solution(): numbers = generate_numbers() operators = generate_operators() for n in numbers: for o in operators: expression = generate_expression(n, o) if is_solution(expression): return expression return None # 输出一组解 solution = find_solution() if solution: print("Found a solution:", " ".join(str(e) for e in solution)) else: print("No solution found.") ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值