1.题目要求
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。
提高要求:用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。
1. 程序风格良好(使用自定义注释模板)
2.使用计时器要求用户在规定时间内输入表达式,如果规定时间内运算正确则加分,超时或运算错误则进入下一题并减少生命值(不扣分)。
3.所有成绩均可记录在TopList.txt文件中。
二、算法设计
24点游戏,一共使用52张牌,4种花色,因此使用13张不同数字和字母的扑克即可。
2.算法设计
基本要求:
(1)抽牌阶段:将13张牌的数值和字母存入列表中,并给字母赋特定的值,random.choice()从列表中随机选取元素,利用此函数和for语句组成列表推导式,随机拿出4个数,模拟抽取4张牌。
(2)计算阶段:利用itertools.permutations()函数对随机出来的4个数进行全排列,可替代用4次for语句进行排列,同时更好的解决了排列组合的元素重复性问题,将所有可能性存在列表list(i)中;利用 itertools.product ()函数对运算符也进行全排列,每个运算符可重复,在运算过程中只需要用3个运算符,在存入列表之后将最后一个删去即可,将所有可能性存在列表list(j)中;利用for语句将4个数字和3个运算符进行排列组合,将表达式转化成字符串,利用eval()对字符串进行求值,利用try和except将计算中的异常(除数为0)忽略。将值为24的所有表达式输出。
提高要求:
(1)抽牌阶段:将13张牌的数值和字母存入列表中,并给字母赋特定的值,random.choice()从列表中随机选取元素,利用此函数和for语句组成列表推导式,随机拿出4个数,模拟抽取4张牌。
(2)计算阶段:输入自己计算的表达式,然后将表达式转化成字符串,利用eval()对字符串进行求值,使用for循环判断值是否为24,若不等于24,n-1,score不变,否则n不变,score+1。若n为零,退出循环,并输出游戏结束,将成绩通过T.write写入TopList.txt文件中。

3.概要设计

(1)计算24点

用python算24点 python计算24点游戏_用python算24点


(2)24点积分游戏

用python算24点 python计算24点游戏_24点_02


4.代码展示

def calculate():
    card = ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']
    A = 1  
    J = 11
    Q = 12
    K = 13
    operator = ['+', '-', '*', '/']       #运算符
    list_four =[random.choice(card) for i in range(4)]  #随机取出4张牌
    print("你获得以下四张牌:")
    print(list_four)        #输出四张牌的值

    result_four = []          #列表储存四张牌全排列
    # set() 去除重复的排列
    for i in set(itertools.permutations(list_four, len(list_four))):    #生成全排列的各个组合
        result_four.append(list(i))

    result_operator = []     #列表存储四个运算符
    for j in set(itertools.product(operator,repeat= 4)):
        templist = list(j)
        templist.pop()    #在实际运算过程中,只需要3个运算符,所以删掉最后一个运算符,保留3个运算符
        if templist not in result_operator:
            result_operator.append(templist)

    list_expression = []    #存放各个符合条件的表达式
    count = 0            
    for i in result_four:
        for j in result_operator:

            expression1 = str(i[0]) + j[0] + str(i[1]) + j[1] + str(i[2]) + j[2] + str(i[3])    #将所有数都转化为str类型
           
            result = eval(expression1)
             if result == 24:
                list_expression.append(expression1 + '=24')
                count += 1
            else:
                expression2 = '(' + str(i[0]) + j[0] + str(i[1]) + ')' + j[1] + str(i[2]) + j[2] + str(i[3])
                result = eval(expression2)
                if result == 24:
                    list_expression.append(expression2 + '=24')
                    count += 1
                else:
                    expression3 = str(i[0]) + j[0] + '(' + str(i[1]) + j[1] + str(i[2]) + ')' + j[2] + str(i[3])
                   :result = eval(expression3)
                    if result == 24:
                        list_expression.append(expression3 + '=24')
                        count += 1
                    else:
                        expression4 = str(i[0]) + j[0] + str(i[1]) + j[1] + '(' + str(i[2]) + j[2] + str(i[3]) + ')'
                        result = eval(expression4) 
                        if result == 24:
                            list_expression.append(expression4 + '=24')
                            count += 1           #计算结果为24则计数+1
    print("结果如下:")
    for each in list_expression:
        print(each)                
    print('一共有%d个表达式' % count)
def playgame():
    n = 3
    print("共有%d次机会"%n)
    score = 0
    while (n > 0):
        print("当前得分为%d"%score)
        card = ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']
        A = 1
        J = 11
        Q = 12
        K = 13
      
        list_four = [random.choice(card) for i in range(4)]        #随机抽取四张牌
        print(list_four)
        str_result = str(input("请将上述四张扑克牌的点数计算成24点(请输入表达式):"))
        if eval(str_result) != 24:
            n -= 1         # 回答错误生命值-1
            if n == 0:
                print("生命值已经用完,游戏结束!")
                str_name = input("请输入您的姓名,结果将存入排行榜:")
                T = open('TopList.txt','a')
                T.write(str_name)
                T.write("\t")
                T.write(str(score))
                T.write("\n")
                break
            else:
                print(str_result + "=", end="")
                print(eval(str_result))
                print("回答错误,您还剩%d条命,请继续您继续游戏"%n)
        else:
            score += 1
            print("回答正确,得分+1,请继续游戏")
sign = 0
while(sign==0):
    print("请选择您要进行操作的序号:")
    print("1.24点计算器")
    print("2.进行24点小游戏")
    print("3.退出程序")
    flag = int(input())
    if flag == 1:
        calculate()
        sign = 0
    elif flag == 2:
        playgame()
        sign = 0
    elif flag == 3:
        sign = 1
    else:
        sign = 0

5.结果展示

用python算24点 python计算24点游戏_字符串_03


用python算24点 python计算24点游戏_24点_04


用python算24点 python计算24点游戏_用python算24点_05


6.总结

通过本次编程,了解了很多python中功能强大的库,更好的解决了本次程序中的问题,我是第一次真正使用这些,需要考虑到的问题很多,不断的调试最后得到正确的结果。同时体会到了程序结构对程序功能的影响,在对数字进行排列组合的时候,不能通过多重循环得到所有所需结果,通过查询资料了解到了itertools库可直接对结果进行各种想要的排列组合形式。通过这次作业,我收获到了很多有用的知识,与此同时也发现自己的很多不足之处,基础知识掌握不牢固,不能学以致用,还需要对常用的库进行更多了解。