24点纸牌游戏的开发 python 各路大神我需要帮助

24点纸牌游戏的开发1)请你根据上述游戏规则构造一个玩24点游戏的算法,编程实现。要求如下:输入:n1,n2,n3,n4输出:若能得到运算结果为24,则输出一个对应的运算... 24点纸牌游戏的开发
1)请你根据上述游戏规则构造一个玩24点游戏的算法,编程实现。要求如下:
输入:n1, n2, n3, n4
输出:若能得到运算结果为24,则输出一个对应的运算表达式。
如:输入:11,8,3,5
输出:(11-8)*(3+5)=24
提示:
算法的设计不唯一,穷举法是最为基本的解法,分治法则会获得比较高一些的效率,请你仔细思考,设计出算法实现该问题并画出算法的流程图。
2)请为你的24点纸牌游戏开发出一个界面
例如
提示:
2. 软件主要完成的功能需要以下几个:
1)提供一个功能能进行随机发牌4张(用纸牌的形状或按钮的形状均可)
2)提供功能供用户输入关于这4张牌的表达式,并进行计算,判断结果的正确与否
3)能提供给用户正确答案
实验指导:
提示1:以下给出了穷举法解24点的代码框架,但很显然这种解法并不是最好的求解方法,你还可以设计其它的算法来解决该问题。

def cal(a,b,op): if op==0:return(a+b) if op==1:return(a-b) if op==2:return(a*b) if op==3: if(b==0.0): return(999.0) else:return(int(a/b)) def D24(v0,v1,v2,v3): op=['+','-','*','/'] v=[v0,v1,v2,v3] count=0 #四重循环开始穷举四个数字的位置: 4!=24 种 #三重循环开始穷举三个运算符: 4X4X4=64 种 #未用循环,直接穷举三个运算符的优先级: 3!-1=5种- t1=t2=t3=0 #第1种情况 ((a。b)。c)。d 开始计算: t1=cal(v[i1],v[i2],f1) t2=cal(t1,v[i3],f2) t3=cal(t2,v[i4],f3) if t3==24: print(v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4]) count+=1 #第2种情况 (a。b)。(c。d) 开始计算: #第3种情况 (a。(b。c))。d 开始计算: #第4种情况 a。((b。c)。d ) 开始计算: #第5种情况 a。(b。(c。d)) 开始计算: #穷举结束:共 24*64*5=7680 种表达式 --------------------------- if (count==0): print("can not calculate 24.",v0,v1,v2,v3); else: print("has several ways to calculate",count) v0=int(input("Pls input the 1st number:"))v1=int(input("Pls input the 2nd number:"))v2=int(input("Pls input the 3rd number:"))v3=int(input("Pls input the 4th number:"))D24(v0,v1,v2,v3)
提示2:界面设计可参考GUI相关知识进行,用到的控件包括:Button,Entry,Label等。注意:内置函数eval( )可以完成把一个字符串作为参数并返回它用为一个Python表达式的结果,例如:
>>>eval("2+3*4-5")
输出结果为:
9
以上函数可能帮助到你获取用户在Entry中输入表达式的值
另外,随机数的生成请参考Python的random模块

大计基实验太无情了
展开
 我来答
illithid
推荐于2017-09-04
知道答主
回答量:10
采纳率:0%
帮助的人:7万
展开全部
很久之前自己写的了,用的就是高级一点的穷举,还挺快的。
附带一个gui
求给分啊
两个文件,cui负责算数gui是界面,亲测可运行的

**************************************cui_24point.py
__author__ = 'Administrator'

add = lambda a,b:a+b
minus = lambda a,b:a-b
mul = lambda a,b:a*b
div = lambda a,b:a/b

caldict = {add:"+", minus:"-", mul:"*", div:"/"}

sortlist = [[a,b,c,d] for a in range(4) for b in range(4) for c in range(4) for d in range(4) if a != b != c != d and a != c and b != d and a != d]

class leaf:
def __init__(self, numlist, layer1, layer2, layer3, ans):
self.numlist = map(lambda a:float(a), numlist)
self.layer1 = layer1
self.layer2 = layer2
self.layer3 = layer3
self.ans = ans
def __str__(self):
return "((%s%s%s)%s%s)%s%s=%s" %(self.numlist[0], caldict[self.layer1], self.numlist[1], caldict[self.layer2], self.numlist[2], caldict[self.layer3], self.numlist[3] ,self.ans)

def tree(numlist):
layer1 = "Null"
layer2 = "Null"
layer3 = "Null"
for c1 in [add, minus, mul, div]:
layer1 = c1
for c2 in [add, minus, mul, div]:
layer2 = c2
for c3 in [add, minus, mul, div]:
layer3 = c3
if c3(c2(c1(numlist[0], numlist[1]), numlist[2]), numlist[3]) == 24:
return leaf(numlist, layer1, layer2, layer3, 24)

class Turn():
def __init__(self, numlist):
if len(numlist) == 4:
self.numlist = numlist
def calculate(self):
anslist = []
for i in sortlist:
templist = [self.numlist[i[0]], self.numlist[i[1]], self.numlist[i[2]], self.numlist[i[3]]]
anslist.append(tree(templist))
return anslist

def calc(templist):
ans = Turn(templist).calculate()
ans = [i for i in ans if i != None]
for i in ans:
print i
return ans

if __name__ == "__main__":
templist = []
for i in range(4):
templist.append(int(raw_input("Input No.%s number \n" %i)))
calc(templist)

*****************************************gui.py
# -*- coding: -UTF-8 -*-
__author__ = 'Administrator'

from Tkinter import *
import cui_24point

root = Tk()
root.geometry("800x400+400+400")
root.title("24点计算程式")

numlist = []
ansVar = StringVar()

def initvariable():
for i in range(4):
numlist.append(StringVar())

def drawframe():
entryframe = Frame(root, width = 300, height = 100)
for i in range(4):
Label(entryframe, text = str(i + 1)).grid(row = 1, column = i)
Entry(entryframe, textvariable = numlist[i]).grid(row = 2, column = i)

entryframe.pack()

ansframe = Frame(root, width = 100, height = 66)
anslistbox = Listbox(ansframe, width = 50, listvariable = ansVar)
ansscrollbar = Scrollbar(ansframe, command = anslistbox.yview)
anslistbox.configure(yscrollcommand = ansscrollbar.set)

anslistbox.pack(side = RIGHT)
ansscrollbar.pack(side = LEFT, fill = Y)
ansframe.pack()

def calculate():
templist = map(lambda i:float(i.get()), numlist)
for i in cui_24point.calc(templist):
anslistbox.insert(END, i)
anslistbox.insert(END, "********************")

Button(text = "计算", command = calculate).pack()

initvariable()
drawframe()
追问

可能是版本原因...这该怎么办......

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
说石蟹漫谈史1154
2017-12-29
知道答主
回答量:4
采纳率:0%
帮助的人:3576
展开全部

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式