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()

猜你喜欢

转载自blog.csdn.net/zzy_famatic/article/details/82918597