算24点小游戏 vvipi 发表于2019年3月28日,阅读:4808 链接: https://www.wepin.online/twenty-four-point 主要代码: ```python # encoding: utf-8 """ 找出24点解法的思路: 每次减少一个数字,取两个数字进行一次计算,结果和未参与计算的数字重新组合成新的数字组合,递归计算直到数字剩两个时直接得出结果。 """ from random import randint # 排列组合 from itertools import permutations, combinations class Element(object): '''将计算结果和算式逐步保存''' def __init__(self, number, text): self.number = number self.text = text def generate_random_number(): '''随机生成4个数''' a = randint(1, 10) b = randint(1, 10) c = randint(1, 10) d = randint(1, 10) return (a, b, c, d) def element_devider(elements): ''' 输入含2个以上元素的列表 取2个元素的组合,合并这2个元素生成新元素 返回新元素和未被取元素的组合的各种可能性 ''' newElementList = [] # 使用一个自然数序列避免重复 l = list(range(len(elements))) # 取2个元素的组合 for comb in combinations(l, 2): remain = [] for i in l: # 生成剩余元素的组合 if not i in comb: remain.append(elements[i]) elementComb = [elements[i] for i in comb] # 两个元素算出一个新元素 elementList = merge_element(elementComb[0], elementComb[1]) for e in elementList: # 新元素和剩余元素组成新组合 newComb = [e] + remain newElementList.append(newComb) return newElementList def merge_element(element1, element2): ''' 两个元素运算合并为一个新元素,每种运算方式生成一个新元素 ''' m, n = element1.number, element2.number x, y = element1.text, element2.text elementList = [] # m+n number = m + n text = '({m}+{n})'.format(m=x, n=y) e1 = Element(number, text) elementList.append(e1) # m-n number = m - n text = '({m}-{n})'.format(m=x, n=y) e2 = Element(number, text) elementList.append(e2) # n-m number = n - m text = '({n}-{m})'.format(m=x, n=y) e3 = Element(number, text) elementList.append(e3) # m*n number = m * n text = '({m}*{n})'.format(m=x, n=y) e4 = Element(number, text) elementList.append(e4) # m/n if not 0 == n: number = m / n text = '({m}/{n})'.format(m=x, n=y) e5 = Element(number, text) elementList.append(e5) # n/m if not 0 == m: number = n / m text = '({n}/{m})'.format(m=x, n=y) e6 = Element(number, text) elementList.append(e6) return elementList def recur_calculate(elements): ''' 递归方式计算24点 ''' # 剩余2个元素时算出结果 if 2 == len(elements): elementList = merge_element(elements[0], elements[1]) for e in elementList: if 24 == e.number: formula = e.text return formula # 元素数量大于2时,每次递归调用数量减少1 else: newCombinations = element_devider(elements) for result in newCombinations: final = recur_calculate(result) if final: # 返回第一个正确答案 return final def play(): formula = '' while not formula: numList = generate_random_number() es = [Element(i, str(i)) for i in numList] print("生成随机数:", [e.number for e in es]) formula = recur_calculate(es) if not formula: print('此组合无法算出24点,重新生成') else: print('24点算法:', formula) if __name__ == '__main__': play() ```