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("你输了!")

以后可能会优化一下吧

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐