24点游戏python版
-
问题描述与规则
24点游戏是经典的纸牌益智游戏。常见游戏规则:从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
-
游戏要求
-
基本要求
随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式。 -
提高要求
用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。 -
其他要求
1.程序风格良好(使用自定义注释模板)
2.使用计时器要求用户在规定时间内输入表达式,如果规定时间内运算正确则加分,超时或运算错误则进入下一题并减少生命值(不扣分)。
3.所有成绩均可记录在TopList.txt文件中
-
-
功能实现
-
界面部分
界面部分,我采用Pyqt5这个库,利用QT,自动生成界面,下面是界面部分的代码
def setupUi(self, Form): self.V_Life = 3 #初始生命 self.V_Score = 0 #初始分数 Form.setObjectName("Form") #主窗口 Form.resize(706, 386) #主窗口大小 Form.setStyleSheet("#Form{border-image: url(image/59.png);}") #给主窗口加背景图片 #控件 self.handPoke = QtWidgets.QPushButton(Form) self.handPoke.setGeometry(QtCore.QRect(90, 280, 71, 31)) self.handPoke.setObjectName("handPoke") self.poke_1 = QtWidgets.QLabel(Form) self.poke_1.setGeometry(QtCore.QRect(60, 30, 91, 161)) self.poke_1.setObjectName("poke_1") self.lineEdit = QtWidgets.QLineEdit(Form) self.lineEdit.setGeometry(QtCore.QRect(90, 230, 311, 31)) self.lineEdit.setObjectName("lineEdit") self.poke_4 = QtWidgets.QLabel(Form) self.poke_4.setGeometry(QtCore.QRect(450, 30, 91, 161)) self.poke_4.setObjectName("poke_4") self.poke_2 = QtWidgets.QLabel(Form) self.poke_2.setGeometry(QtCore.QRect(190, 30, 91, 161)) self.poke_2.setObjectName("poke_2") self.poke_3 = QtWidgets.QLabel(Form) self.poke_3.setGeometry(QtCore.QRect(320, 30, 91, 161)) self.poke_3.setObjectName("poke_3") self.shuRu = QtWidgets.QLabel(Form) self.shuRu.setGeometry(QtCore.QRect(10, 220, 71, 51)) self.shuRu.setObjectName("shuRu") self.queDing = QtWidgets.QPushButton(Form) self.queDing.setGeometry(QtCore.QRect(200, 280, 75, 31)) self.queDing.setObjectName("queDing") self.quXiao = QtWidgets.QPushButton(Form) self.quXiao.setGeometry(QtCore.QRect(310, 280, 75, 31)) self.quXiao.setObjectName("quXiao") self.timer = QBasicTimer() #实例化QBasicTimer,用于计时器功能 self.step = 0 #时间增加速度 self.time = QtWidgets.QProgressBar(Form) self.time.setGeometry(QtCore.QRect(90, 330, 341, 23)) self.time.setMaximum(60) self.time.setProperty("value", 0) self.time.setObjectName("time") self.label = QtWidgets.QLabel(Form) self.label.setGeometry(QtCore.QRect(50, 330, 31, 21)) self.label.setObjectName("label") self.label_life = QtWidgets.QLabel(Form) self.label_life.setGeometry(QtCore.QRect(550, 50, 31, 16)) self.label_life.setObjectName("label_life") self.label_ = QtWidgets.QLabel(Form) self.label_.setGeometry(QtCore.QRect(550, 100, 31, 16)) self.label_.setObjectName("label_") self.life = QtWidgets.QLCDNumber(Form) self.life.setGeometry(QtCore.QRect(590, 50, 64, 23)) self.life.setObjectName("life") self.Score = QtWidgets.QLCDNumber(Form) self.Score.setGeometry(QtCore.QRect(590, 100, 64, 23)) self.Score.setObjectName("Score") self.life.setDigitCount(5) self.life.setMode(QLCDNumber.Dec) self.life.display(self.V_Life) self.Score.display(self.V_Score) self.life.setStyleSheet("QLCDNumber{border: 1px solid black;color:red}") #设置QLCD显示数字的颜色,同时增加1pxd黑色边框 self.life.setSegmentStyle(QLCDNumber.Flat) self.Score.setStyleSheet("QLCDNumber{border: 1px solid black;color:red}") #设置QLCD显示数字的颜色,同时增加1pxd黑色边框 self.Score.setSegmentStyle(QLCDNumber.Flat) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "24点游戏")) self.handPoke.setText(_translate("Form", "发牌")) self.poke_1.setText(_translate("Form", "扑克牌1")) self.poke_4.setText(_translate("Form", "扑克牌4")) self.poke_2.setText(_translate("Form", "扑克牌2")) self.poke_3.setText(_translate("Form", "扑克牌3")) self.shuRu.setText(_translate("Form", " 输入算式")) self.queDing.setText(_translate("Form", "确定")) self.quXiao.setText(_translate("Form", "结束游戏")) self.time.setFormat(_translate("Form", "%p")) self.label.setText(_translate("Form", " 时间")) self.label_life.setText(_translate("Form", "生命")) self.label_.setText(_translate("Form", "得分")) self.handPoke.clicked.connect(self.handpoke) #点击事件:点击发牌按钮,触发发牌 self.handPoke.clicked.connect(self.tiMer) #点击事件:点击发牌按钮,触发计时 self.queDing.clicked.connect(self.in_enter) #点击事件:点击确定按钮,触发提交算式功能 self.quXiao.clicked.connect(self.Close) #点击事件:点击结束游戏按钮,触发程序退出功能 self.show_messsage() #提示框,游戏开始时进行提示
-
核心算法部分
算法部分不是自己的原创,借鉴的网上一位大佬的(原文章的链接我不小心弄丢了,十分抱歉,若是有人看到可以在评论区留下原文章),然后说一下这个算法吧,这个算法就是用将牌面的4个数字与3个运算符进行全排列组合,如果有组合满足结果为24,将此公式保存列表mylist,当用户输入公式,再和这个列表mylist中进行匹配,只要有一个匹配成功就进行下一关,分数加10分若无则生命值减1,进入下一关。具体代码实现如下#算法 def Algorithm24(self): self.lst=[self.A1,self.A2,self.A3,self.A4] self.exps = ('((%s%s%s)%s%s)%s%s', '(%s%s%s)%s(%s%s%s)', '(%s%s(%s%s%s))%s%s', '%s%s((%s%s%s)%s%s)', '%s%s(%s%s(%s%s%s))') self.ops = r'+-*/' self.r
-