首页 > 编程 > Python > 正文

python+pyqt5实现24点小游戏

2019-11-25 13:23:51
字体:
来源:转载
供稿:网友

本文实例为大家分享了python实现24点游戏的具体代码,供大家参考,具体内容如下

描述:一副牌中A、J、Q、K可以当成是1、11、12、13。任意抽取4张牌,用加、减、乘、除(可加括号)把牌面上的数算成24。每张牌对应的数字必须用一次且只能用一次。在规定时间内输入算式,输入正确加十分,输入错误生命值减一,点击确定提交并进入下一题,点击清空可清空算式。点击开始游戏进入游戏,可重新开始游戏。

from PyQt5 import QtCore, QtWidgetsfrom PyQt5.QtWidgets import *from PyQt5.QtCore import QBasicTimerfrom PyQt5.QtGui import QPixmapimport sysclass Ui_Form(QWidget): def setupUi(self,Form):  Form.setObjectName("Form")  Form.resize(946, 515)  self.pushButton = QtWidgets.QPushButton(Form)  self.pushButton.setGeometry(QtCore.QRect(70, 30, 131, 41))  self.pushButton.setObjectName("pushButton")  self.pushButton.clicked.connect(self.on_click1)  self.pushButton_4 = QtWidgets.QPushButton(Form)  self.pushButton_4.setGeometry(QtCore.QRect(280, 30, 131, 41))  self.pushButton_4.setObjectName("pushButton_4")  self.pushButton_4.clicked.connect(self.on_click4)  self.pushButton_4.setEnabled(False)  self.textEdit = QtWidgets.QTextEdit(Form)  self.textEdit.setGeometry(QtCore.QRect(700, 120, 191, 301))  self.textEdit.setObjectName("textEdit")  self.textEdit.setReadOnly(True)  self.label = QtWidgets.QLabel(Form)  self.label.setGeometry(QtCore.QRect(70, 300, 111, 31))  self.label.setObjectName("label")  self.lineEdit = QtWidgets.QLineEdit(Form)  self.lineEdit.setGeometry(QtCore.QRect(170, 300, 361, 31))  self.lineEdit.setObjectName("lineEdit")  self.lineEdit.setMaxLength(15)  self.label_2 = QtWidgets.QLabel(Form)  self.label_2.setGeometry(QtCore.QRect(70, 100, 101, 171))  self.label_2.setObjectName("label_2")  self.label_3 = QtWidgets.QLabel(Form)  self.label_3.setGeometry(QtCore.QRect(220, 100, 101, 171))  self.label_3.setObjectName("label_3")  self.label_4 = QtWidgets.QLabel(Form)  self.label_4.setGeometry(QtCore.QRect(370, 100, 101, 171))  self.label_4.setObjectName("label_4")  self.label_5 = QtWidgets.QLabel(Form)  self.label_5.setGeometry(QtCore.QRect(510, 100, 101, 171))  self.label_5.setObjectName("label_5")  self.pushButton_2 = QtWidgets.QPushButton(Form)  self.pushButton_2.setGeometry(QtCore.QRect(170, 360, 93, 28))  self.pushButton_2.setObjectName("pushButton_2")  self.pushButton_2.clicked.connect(self.on_click2)  self.pushButton_3 = QtWidgets.QPushButton(Form)  self.pushButton_3.setGeometry(QtCore.QRect(300, 360, 93, 28))  self.pushButton_3.setObjectName("pushButton_3")  self.pushButton_3.clicked.connect(self.on_click3)  self.progressBar = QtWidgets.QProgressBar(Form)  self.progressBar.setGeometry(QtCore.QRect(170, 430, 401, 21))  self.progressBar.setProperty("value", 0)  self.progressBar.setObjectName("progressBar")  self.timer = QBasicTimer()  self.step = 0  self.retranslateUi(Form)  QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form):  _translate = QtCore.QCoreApplication.translate  Form.setWindowTitle(_translate("Form", "24点游戏"))  self.pushButton.setText(_translate("Form", "开始游戏"))  self.pushButton_4.setText(_translate("Form", "重新开始"))  self.textEdit.setHtml(_translate("Form", "<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.0//EN/" /"http://www.w3.org/TR/REC-html40/strict.dtd/">/n""<html><head><meta name=/"qrichtext/" content=/"1/" /><style type=/"text/css/">/n""p, li { white-space: pre-wrap; }/n""</style></head><body style=/" font-family:/'SimSun/'; font-size:9pt; font-weight:400; font-style:normal;/">/n""<p style=/" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;/">规则:</p>/n""<p style=/" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;/">一副牌中A、J、Q、K可以当成是1、11、12、13。任意抽取4张牌,用加、减、乘、除(可加括号)把牌面上的数算成24。每张牌对应的数字必须用一次且只能用一次。在规定时间内输入算式,输入正确加十分,输入错误生命值减一,点击确定提交并进入下一题,点击清空可清空算式。点击开始游戏进入游戏。</p></body></html>"))  self.label.setText(_translate("Form", "请输入算式:"))  self.label_2.setText(_translate("Form", ""))  self.label_3.setText(_translate("Form", ""))  self.label_4.setText(_translate("Form", ""))  self.label_5.setText(_translate("Form", ""))  self.pushButton_2.setText(_translate("Form", "确定"))  self.pushButton_3.setText(_translate("Form", "清空"))

以上为设置界面

import itertoolsimport random  #已做题目数  self.question_number = 0  # 生命值  self.life = 3  # 分数  self.score = 0  # 重新开始标记  self.recover = 0 # 发牌器 随机抽取四个数字 def cardFun(self):  for i in range(4):   cardNum.append(int(random.random() * 100 % 13) + 1)  self.listSet = list(set(itertools.permutations(cardNum, 4)))  return self.listSet # 存放A(4,4)种排列方式的列表 # 显示四个数字对应的扑克牌 def cardCompute(self):  cardList = self.cardFun()  for i in range(len(cardList)):   self.cardGroup = cardList[i]  self.picture_1()  self.picture_2()  self.picture_3()  self.picture_4() def fresh(self):  self.lineEdit.setText('')  self.cardFun()  self.cardCompute()  # 停止计时  self.progress_bar()  # 重新开始计时  self.step = 0  self.step = self.step + 1  self.progressBar.setValue(self.step) # 开始游戏 def on_click1(self):  self.cardFun()  self.cardCompute()  self.progress_bar()  # 将开始游戏按钮设置为不可用  self.pushButton.setEnabled(False)  # 将重新开始游戏按钮设置为可用  self.pushButton_4.setEnabled(True) # 确定提交 def on_click2(self):  # 已做题目数增加  self.question_number += 1  # 停止计时  self.timer.stop()  # 当做到最后一题  if self.question_number == 3:   self.recover = 1   # 获取输入算式   self.calstr = self.lineEdit.text()   # 如果所输入为空生命值减一   if self.calstr == "":    self.life -= 1   else:    # 计算所输入算式    self.result = int(eval(self.calstr))    # 如果正确加十分,错误生命值减一    if self.result == 24:     self.score += 10    else:     self.life -= 1   # 清空输入框   self.lineEdit.setText('')   # 弹出消息提示框   QMessageBox.information(self, "恭喜你", "答题结束/n您的生命值为" + str(self.life) + ",分数为" + str(self.score),         QMessageBox.Close)   # 设置确定和清空按钮为不可用   self.pushButton_2.setEnabled(False)   self.pushButton_3.setEnabled(False)  else:   self.calstr = self.lineEdit.text()   if self.calstr == "":    self.life -= 1    QMessageBox.information(self, "很遗憾", "算式输入不正确/n进入下一题", QMessageBox.Yes)    self.fresh()   else:    self.result = int(eval(self.calstr))    if self.result == 24:     self.score += 10     QMessageBox.information(self, "恭喜你", "算式输入正确/n进入下一题", QMessageBox.Yes)     self.fresh()    else:     self.life -= 1     QMessageBox.information(self, "很遗憾", "算式输入不正确/n进入下一题", QMessageBox.Yes)     self.fresh() # 清空 def on_click3(self):  self.lineEdit.setText('') #重新开始游戏 def on_click4(self):  # 初始化已做题数、生命值、分数、时间  self.question_number = 0  self.life = 3  self.score = 0  self.step = 0  self.timer.stop()  QMessageBox.information(self, "重新开始游戏", "生命值和分数已重置", QMessageBox.Yes)  if self.recover == 1:   self.pushButton_2.setEnabled(True)   self.pushButton_3.setEnabled(True)  self.cardFun()  self.cardCompute()  self.timer.start(600, self)  self.step = self.step + 1  self.progressBar.setValue(self.step) # 使用一个计时器来启动进度条 def timerEvent(self, e):  # 如果时间到,则停止计时,已做题数加一  if self.step >= 100:   self.timer.stop()   self.question_number += 1   if self.question_number ==3:    self.recover = 1    self.calstr = self.lineEdit.text()    if self.calstr == "":     self.life -= 1    else:     self.result = int(eval(self.calstr))     if self.result == 24:      self.score += 10     else:      self.life -= 1    self.lineEdit.setText('')    # 弹出结果消息框    QMessageBox.information(self, "恭喜你", "答题结束/n您的生命值为"+str(self.life)+",分数为"+str(self.score), QMessageBox.Close)    self.pushButton_2.setEnabled(False)    self.pushButton_3.setEnabled(False)   else:    self.life -= 1    QMessageBox.information(self, "很遗憾", "规定时间已到/n进入下一题", QMessageBox.Yes)    self.fresh()    return  self.step = self.step + 1  self.progressBar.setValue(self.step) # 进度条 def progress_bar(self):  if self.timer.isActive():   self.timer.stop()  else:   # 规定时间为1分钟   self.timer.start(600,self) # 显示抽取的第一张牌 def picture_1(self):  if self.cardGroup[0] == 1:   self.label_2.setPixmap(QPixmap('./h1.png')) # 图片路径  elif self.cardGroup[0] == 2:   self.label_2.setPixmap(QPixmap('./h2.png'))  elif self.cardGroup[0] == 3:   self.label_2.setPixmap(QPixmap('./h3.png'))  elif self.cardGroup[0] == 4:   self.label_2.setPixmap(QPixmap('./h4.png'))  elif self.cardGroup[0] == 5:   self.label_2.setPixmap(QPixmap('./h5.png'))  elif self.cardGroup[0] == 6:   self.label_2.setPixmap(QPixmap('./h6.png'))  elif self.cardGroup[0] == 7:   self.label_2.setPixmap(QPixmap('./h7.png'))  elif self.cardGroup[0] == 5:   self.label_2.setPixmap(QPixmap('./h8.png'))  elif self.cardGroup[0] == 9:   self.label_2.setPixmap(QPixmap('./h9.png'))  elif self.cardGroup[0] == 10:   self.label_2.setPixmap(QPixmap('./h10.png'))  elif self.cardGroup[0] == 11:   self.label_2.setPixmap(QPixmap('./h11.png'))  elif self.cardGroup[0] == 12:   self.label_2.setPixmap(QPixmap('./h12.png'))  elif self.cardGroup[0] == 13:   self.label_2.setPixmap(QPixmap('./h13.png'))  # 将扑克牌填充整个标签  self.label_2.setScaledContents(True) # 显示抽取的第二张牌 def picture_2(self):  if self.cardGroup[1] == 1:   self.label_3.setPixmap(QPixmap('./b1.png'))  elif self.cardGroup[1] == 2:   self.label_3.setPixmap(QPixmap('./b2.png'))  elif self.cardGroup[1] == 3:   self.label_3.setPixmap(QPixmap('./b3.png'))  elif self.cardGroup[1] == 4:   self.label_3.setPixmap(QPixmap('./b4.png'))  elif self.cardGroup[1] == 5:   self.label_3.setPixmap(QPixmap('./b5.png'))  elif self.cardGroup[1] == 6:   self.label_3.setPixmap(QPixmap('./b6.png'))  elif self.cardGroup[1] == 7:   self.label_3.setPixmap(QPixmap('./b7.png'))  elif self.cardGroup[1] == 5:   self.label_3.setPixmap(QPixmap('./b8.png'))  elif self.cardGroup[1] == 9:   self.label_3.setPixmap(QPixmap('./b9.png'))  elif self.cardGroup[1] == 10:   self.label_3.setPixmap(QPixmap('./b10.png'))  elif self.cardGroup[1] == 11:   self.label_3.setPixmap(QPixmap('./b11.png'))  elif self.cardGroup[1] == 12:   self.label_3.setPixmap(QPixmap('./b12.png'))  elif self.cardGroup[1] == 13:   self.label_3.setPixmap(QPixmap('./b13.png'))  self.label_3.setScaledContents(True) # 显示抽取的第三张牌 def picture_3(self):  if self.cardGroup[2] == 1:   self.label_4.setPixmap(QPixmap('./f1.png'))  elif self.cardGroup[2] == 2:   self.label_4.setPixmap(QPixmap('./f2.png'))  elif self.cardGroup[2] == 3:   self.label_4.setPixmap(QPixmap('./f3.png'))  elif self.cardGroup[2] == 4:   self.label_4.setPixmap(QPixmap('./f4.png'))  elif self.cardGroup[2] == 5:   self.label_4.setPixmap(QPixmap('./f5.png'))  elif self.cardGroup[2] == 6:   self.label_4.setPixmap(QPixmap('./f6.png'))  elif self.cardGroup[2] == 7:   self.label_4.setPixmap(QPixmap('./f7.png'))  elif self.cardGroup[2] == 5:   self.label_4.setPixmap(QPixmap('./f8.png'))  elif self.cardGroup[2] == 9:   self.label_4.setPixmap(QPixmap('./f9.png'))  elif self.cardGroup[2] == 10:   self.label_4.setPixmap(QPixmap('./f10.png'))  elif self.cardGroup[2] == 11:   self.label_4.setPixmap(QPixmap('./f11.png'))  elif self.cardGroup[2] == 12:   self.label_4.setPixmap(QPixmap('./f12.png'))  elif self.cardGroup[2] == 13:   self.label_4.setPixmap(QPixmap('./f13.png'))  self.label_4.setScaledContents(True) # 显示抽取的第四张牌 def picture_4(self):  if self.cardGroup[3] == 1:   self.label_5.setPixmap(QPixmap('./m1.png'))  elif self.cardGroup[3] == 2:   self.label_5.setPixmap(QPixmap('./m2.png'))  elif self.cardGroup[3] == 3:   self.label_5.setPixmap(QPixmap('./m3.png'))  elif self.cardGroup[3] == 4:   self.label_5.setPixmap(QPixmap('./m4.png'))  elif self.cardGroup[3] == 5:   self.label_5.setPixmap(QPixmap('./m5.png'))  elif self.cardGroup[3] == 6:   self.label_5.setPixmap(QPixmap('./m6.png'))  elif self.cardGroup[3] == 7:   self.label_5.setPixmap(QPixmap('./m7.png'))  elif self.cardGroup[3] == 5:   self.label_5.setPixmap(QPixmap('./m8.png'))  elif self.cardGroup[3] == 9:   self.label_5.setPixmap(QPixmap('./m9.png'))  elif self.cardGroup[3] == 10:   self.label_5.setPixmap(QPixmap('./m10.png'))  elif self.cardGroup[3] == 11:   self.label_5.setPixmap(QPixmap('./m11.png'))  elif self.cardGroup[3] == 12:   self.label_5.setPixmap(QPixmap('./m12.png'))  elif self.cardGroup[3] == 13:   self.label_5.setPixmap(QPixmap('./m13.png'))  self.label_5.setScaledContents(True)if __name__ == "__main__": cardNum = [] # 存放随机牌组 cardGroup = () # 调用牌组 app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QMainWindow() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec_())

实现各控件的功能

开始界面


点击确定提交,输入错误时会弹出消息框

答题结束时汇总成绩


有问题欢迎评论

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网,关注武林网公众号的更多精彩内容。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表