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