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