Python实现24点游戏

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.三次输入错误程序列出所有可能性:

Python实现24点游戏_第1张图片

4.超时输入:

在这里插入图片描述

你可能感兴趣的:(Python)