24点游戏是经典的纸牌益智游戏。

  • 常见游戏规则:
    从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
    基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式

我的思路是把这4个数分成2部分,前两个数一起,后两个数一起,先计算除前两个数所有可能的结果和后两个数所有可能的结果。最后将它们的结果互相计算,结果与24比较,如果等于24则成功。

建立用户类,整个游戏的体系就是建立一个用户类来存储用户的信息,如姓名,生命值,分数等,在类里定义函数引导用户输入算术式进行游戏
代码如下:

from random import randint import time POKER_DICT = {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 'J(11)', 12: 'Q(12)', 13: 'K(13)'} cal_list = ['+', '-', '*', '/'] tmp_list1 = {} # 存放前两个数所有计算结果 tmp_list2 = {} # 存放后两个数计算结果 results = [] # 存放运算结果=24的所有式子 num_list = [] class User(): def __init__(self, name): self.name = name self.life = 3 self.score = 0 self.nums = [] def user_input(self): return input("\n欢迎您" + name + "\n请输入包含这四个牌的运算表达式(你有60s时间输入,否则失败!如果表达式的结果为24,你将赢得该局!)\n") def poker(self): for i in range(4): element = randint(1, 13) self.nums.append(element) print(self.nums) return self.nums def judge(self): while True: flag = True start_time = time.time() str_inp = self.user_input() end_time = time.time() if (end_time-start_time) < 60: for i in self.nums: if str(i) not in str_inp: flag = False print(flag) if flag is True: if eval(str_inp) == 24: print("恭喜赢得本局胜利!") self.score += 10 else: print("很遗憾,计算的结果不等于24。") self.life -= 1 break else: print("输入的数必须是你的牌数!") else: self.life -= 1 print("您超时了 生命值-1") 

下面定义的函数就是计算两个数之间所有可能的计算结果:

def cal(num_1, num_2, temp_list, *args): for j in cal_list: if args and eval(str(num_1) + j + str(num_2)) == 24: # 如果参数args存在说明是进行最后的运算,需要判断是否等于24 temp_list.append(str(num_1) + j + str(num_2)) elif len(args) == 0: # 如果没有传入args参数说明只是第一次运算,将结果存入相应的字典就可以 temp_list[str(num_1) + j + str(num_2)] = (eval(str(num_1) + j + str(num_2))) if eval(str(num_1) + j + str(num_2)) != eval(str(num_2) + j + str(num_1)): temp_list[str(num_2) + j + str(num_1)] = (eval(str(num_2) + j + str(num_1))) 

判断是否等于24:

def is24(): i = 0 while i < 3: if i == 0: # 将前两个数的所有计算结果以及表达式存入字典 cal(num_list[i], num_list[i + 1], tmp_list1) tmp_list1 else: # 将后两个数的所有计算结果以及表达式存入字典 cal(num_list[i], num_list[i + 1], tmp_list2) tmp_list2 i += 2 for i in tmp_list1: for j in tmp_list2: # 对这两个字典进行循环,计算这两个之间所有的结果 如果等于24将其表达式存入results列表 cal(i, j, results, 1) 

在main方法里对用户实例化并调用方法开始游戏:

if __name__ == '__main__': name = input("请输入你的名字:") user = User(name) poke = user.poker() print("你抽到的四张牌是:") for i in poke: print(POKER_DICT.get(i), end=" ") num_list.append(i) while user.life > 0: user.judge() print(num_list) is24() if len(results) == 0: print("这四个数无法组成等于24的算术式") else: print("您的三次机会用完,下面是所有答案") for i in results: print(i) 

各种情况的运行截图:

1.用户胜利:

2.输入结果不等于24:

3.三次输入错误程序列出所有可能性:

4.超时输入: