Python 24點遊戲

 

import itertools

#主要是6種操作,包括加減乘除四種,還有反向減,反向除
def doMethod(x, m, n):
    if x==0:
        return m+n
    elif x==1 and m>n:
        return m-n
    elif x==2 and n>m:
        return n-m
    elif x==3:
        return m*n
    elif x==4 and n!=0:
        return m/n
    elif x==5 and m!=0:
        return n/m
    else:
        return -1
     
#打印,主要是將加減乘除的符號打印出來,還有就是在合適的時候添加括號
def printEquation(listObj, i, j, k):
    initStr, l, r = "", "(", ")"
    #反向操作時,調換位置
    if i==2 or i==5:
        initStr = str(listObj[1]) + " " + doList[i] + " " + str(listObj[0])
    else:
        initStr = str(listObj[0]) + " " + doList[i] + " " + str(listObj[1])
 
    #一、如果前面操作爲加減操作,後面爲乘除或者反向減,則需要添加括號
    #二、如果前面操作爲乘除,後面爲反向除,則需要添加括號
    if (i < 3 and j >= 2) or (3 <= i <= 5 and j == 5):
        initStr = l + initStr + r
 
    #反向操作時,調換位置
    if j==2 or j==5:
        initStr = str(listObj[2]) + " " + doList[j] + " " + initStr
    else:
        initStr = initStr + " " + doList[j] + " " + str(listObj[2])
 
    #一、如果前面操作爲加減操作,後面爲乘除或者反向減,則需要添加括號
    #二、如果前面操作爲乘除,後面爲反向除,則需要添加括號
    if (j < 3 and k >= 2) or (3 <= j <= 5 and k == 5):
        initStr = l + initStr + r
 
    #反向操作時,調換位置
    if k==2 or k==5:
        initStr = str(listObj[3]) + " " + doList[k] + " " + initStr
    else:
        initStr = initStr + " " + doList[k] + " " + str(listObj[3])
    return initStr
 
#下面是主要的循環代碼,首先前面兩個數字有6種操作,然後將操作的結構和第三個數字又有6種操作,
#然後依次和最後一個數字也有6種操作,四個數字排列組合有24種,然後進行這6*6*6的操作,如果
#最終誤差小於0.01就當是24了,中間有輸入判斷,然後用set集合進行排重,不過對於調換順序的排重
#目前沒有去做那個,希望有人能夠完善吧
listStr = ""
print("############ 鬥24點 ############")
while True:
    listStr = input("\n請輸入四個正整數,以空格分隔開來!\n")
    if len(listStr) > 0:
        listStr = ' '.join(listStr.split())
        newList = listStr.split(' ')
        numList = []
        if len(newList) == 4:
            for i in newList:
                if i.isdigit() and i!='0':
                    numList.append(int(i))
            if len(numList) == 4:
                doList = ["+","-","-","×","÷","÷"]
                printSet = set()
                #這裏用到了python自帶的排列算法
                listArray = list(itertools.permutations(numList,4))
                for listObj in listArray:
                    for i in range(6):
                        number1 = doMethod(i, listObj[0], listObj[1])
                        if number1 < 0: continue
                        for j in range(6):
                            number2 = doMethod(j, number1, listObj[2])
                            if number2 < 0: continue
                            for k in range(6):
                                number3 = doMethod(k, number2, listObj[3])
                                if abs(number3 - 24) < 0.01:
                                    printSet.add(printEquation(listObj, i, j, k))
                if len(printSet) > 0:
                    for name in printSet:
                        print("24 = " + name)
                else:
                    print("無解")
            else:
                print("無解")
        else:
            print("無解")
    else:
        print("無解")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章