24點遊戲實現-詳細步驟

題目說明:

24點遊戲是經典的紙牌益智遊戲。

常見遊戲規則:從撲克中每次取出4張牌。使用加減乘除,第一個能得出24者爲贏。(其中,J代表11,Q代表12,K代表13,A代表1), 隨機生成4個代表撲克牌牌面的數字字母,程序自動列出所有可能算出24的表達式。

解題思想:

  1. 生成4個符合要求的隨機數
  2. 對4個隨機數進行全排列
  3. 對‘+’、‘-’、‘×’、‘÷’進行全排列
  4. 通過拼湊的方式構造表達式
  5. 計算表達式,將滿足運算結果爲24的表達式打印出來

解題步驟:

1.生成4個符合要求的隨機數

對於python來說,生成隨機數一般都是通過導包來實現,在這裏需要用到的包是random

random.randrange(stop)  
random.randrange(startstop[, step]) Return a randomly selected element from range(start, stop, step).
random.randint(ab) Return a random integer N such that a <= N <= b.

我所用到的是random.randint(ab)函數,使用它生成4個1-14的數字作爲模擬抽取的卡牌

2.對4個隨機數進行全排列

對隨機數進行全排列可以使用python自帶的包(itertools)或者自己寫一個遞歸函數實現相同功能都可以,這裏使用的是itertools進行隨機數的全排列

itertools實現全排列

遞歸實現全排列:https://blog.csdn.net/zhoufen12345/article/details/53560099

詳細代碼:

def generateNumberList(numbers):
    result_list = []
    count = 0
    # set() 用於去除重複的排列,itertools.permutations()用於生成全排列的元組
    for each_tuple in set(itertools.permutations(numbers, len(numbers))):
        result_list.append(list(each_tuple))
        count += 1
    return result_list

 

3.對‘+’、‘-’、‘×’、‘÷’進行全排列

對4種運算符的全排列和數字的全排列幾乎一樣,但是因爲是4個數字進行計算,所以只會用到3個運算符,所以在後期處理上只需要將最後一個運算符刪除即可

詳細代碼:

def generateOperatorList(operators):
    result_list = []
    count = 0
    # set() 用於去除重複的排列,itertools.permutations()用於生成全排列的元組
    for each_tuple in set(itertools.permutations(operators, len(operators))):
        templist = list(each_tuple)
        templist.pop()
        result_list.append(templist)
    return result_list

 

4.通過拼湊的方式構造表達式

對生成的數字全排列列表和預算符全排列列表只需要交替的插入即可構造一個只有數字和“+、-、×、÷”的運算表達式,但這樣構造的表達式不夠多樣,存在很多不滿足運算結果等於24的情況,所以應當引入括號運算,保證運算的多樣性。

在加入括號後可以儘可能多的產生滿足計算結果等於24的表達式,但是也會出現很多相同的表達式

例如:

4+4+8+8=24

(4+4)+8+8=24

4+(4+8)+8=24

所以爲了避免出現這樣的情況,應當設置合適的條件來添加括號。如果一個表達式不是按照順序計算的,那麼在這個表達式中加入括號將有可能改變表達式最後的運算結果,爲了避免加入括號後不能改變運算結果的情況,所以應當先判斷改表達式在不添加括號的情況下結果是否等於24,否在添加括號

例如:

9+2×6+3=24

9+(2×6)+3=24

 

5.計算表達式,將滿足運算結果爲24的表達式打印出來

計算表達式可以通過兩兩計算得到結果再進行兩兩計算,但在python中提供了一種更加簡單和快捷的計算表達式結果的方法

eval(expressionglobals=Nonelocals=None)

The arguments are a string and optional globals and locals. If provided, globals must be a dictionary. If provided, locals can be any mapping object.

eval函數的詳細使用方法

在使用eval函數進行計算表達式時,有時會遇到表達式除數爲0的情況,在python中這樣的表達式是不合法的,程序會拋出異常導致整個代碼的運行終止,爲了避免這種情況,應當在有計算表達式的代碼出添加異常處理機制,當程序拋出除數爲0的異常時即使處理,使得整個代碼能夠繼續運行完

詳細代碼(構造表達式+計算表達式):

def insertParentheses(number_list, operator_list):
    count = 0
    expression_list = []
    for each_number_list in number_list:
        for each_operator_list in operator_list:

            expression1 = str(each_number_list[0]) + each_operator_list[0] + str(each_number_list[1]) \
                          + each_operator_list[1] + str(each_number_list[2]) + each_operator_list[2] + \
                          str(each_number_list[3])
            try:
                result = eval(expression1)
            except:
                result = 0
            if result == 24:
                expression_list.append(expression1 + '=' + str(result))
                count += 1
            else:
                expression2 = '(' + str(each_number_list[0]) + each_operator_list[0] + str(each_number_list[1]) + ')' \
                              + each_operator_list[1] + str(each_number_list[2]) + each_operator_list[2] + \
                              str(each_number_list[3])
                try:
                    result = eval(expression2)
                except:
                    result = 0
                if result == 24:
                    expression_list.append(expression2 + '=' + str(result))
                    count += 1
                else:
                    expression3 = str(each_number_list[0]) + each_operator_list[0] + '(' + str(each_number_list[1]) \
                                  + each_operator_list[1] + str(each_number_list[2]) + ')' + each_operator_list[2] + \
                                  str(each_number_list[3])
                    try:
                        result = eval(expression3)
                    except:
                        result = 0
                    if result == 24:
                        expression_list.append(expression3 + '=' + str(result))
                        count += 1
                    else:
                        expression4 = str(each_number_list[0]) + each_operator_list[0] + str(each_number_list[1]) \
                                      + each_operator_list[1] + '(' + str(each_number_list[2]) + each_operator_list[2] \
                                      + str(each_number_list[3]) + ')'
                        try:
                            result = eval(expression4)
                        except:
                            result = 0
                        if result == 24:
                            expression_list.append(expression4 + '=' + str(result))
                            count += 1

    for each in expression_list:
        print(each)
    print('一共有%d個表達式' % count)

運行截圖:

因爲在處理時沒有考慮位置而引起的重複,此處默認位置不同也是不同的表達式,如果想要去掉這種重複還請自行解決

源代碼下載:https://download.csdn.net/download/xust_kevin/10702176

 

 

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