24点游戏是指随机选取4张扑克牌(不包括大小王),然后通过四则运算来构造表达式,如果表达式的值恰好等于24就赢一次。编写代码测试随机给定的4个数是否符合24点游戏。
用户输入4个1-13之间的整数,程序自动搜索+-*/全部可能计算出24的组合及数目。如果得不到结果,则提示失败。
废话不多说,直接上代码
中缀运算符改后缀运输符
有点乱
def get_c(num):
if num == 0:
return '+'
elif num == 1:
return '-'
elif num == 2:
return '*'
else:
return '/'
print("请输入4个数字")
g24 = []
for i in range(4):
g24.append(input(""))
a = b = c = '+'
flag = False
stack1 = []
stack2 = []
for i in range(0, 4):
for j in range(0, 4):
for q in range(0, 4):
a = get_c(i)
b = get_c(j)
c = get_c(q)
res = g24[0] + a + g24[1] + b + g24[2] + c + g24[3]
#将中缀表达式转化为后缀表达式
n = len(res)
for w in range(0, n):
if res[w].isdigit():
#数字只可能是两位数或者一位数
if(w + 1 < n and res[w + 1].isdigit()):
r = res[w] + res[w + 1]
stack1.append(eval(r))
elif w != 0 and res[w - 1].isdigit():
continue
else:
stack1.append(eval(res[w]))
else:
#乘除的优先级最大直接压入栈内
if res[w] == '*' or res[w] == '/':
stack2.append(res[w])
elif res[w] == '+' or res[w] == '-':
if len(stack2) == 0:
stack2.append(res[w])
elif stack2[len(stack2) - 1] != '*' and stack2[len(stack2) - 1] != '/':
stack2.append(res[w])
else:
op = stack2[len(stack2) - 1]
while len(stack2) != 0 and (op == '*' or op == '/'):
op = stack2.pop()
num1 = stack1.pop()
num2 = stack1.pop()
if(op == '*'):
stack1.append(num1 * num2)
else:
if num1 == 0:
stack1.append(0)
else:
stack1.append(num2 // num1)
stack2.append(res[w])
while len(stack2) > 0:
op = stack2.pop()
num1 = stack1.pop()
num2 = stack1.pop()
if op == '+':
stack1.append(num1 + num2)
elif op == '-':
stack1.append(num2 - num1)
elif op == '*':
stack1.append(num1 * num2)
else:
if num1 == 0:
stack1.append(0)
else:
stack1.append(num2 // num1)
ans = stack1.pop()
if ans == 24:
print(res, end = '=')
print(24)
flag = True
if flag:
print("你赢了!")
else:
print("你输了!")
以后可能会优化一下吧