python+pyqt5實現(xiàn)24點小游戲
本文實例為大家分享了python實現(xiàn)24點游戲的具體代碼,供大家參考,具體內(nèi)容如下
描述:一副牌中A、J、Q、K可以當(dāng)成是1、11、12、13。任意抽取4張牌,用加、減、乘、除(可加括號)把牌面上的數(shù)算成24。每張牌對應(yīng)的數(shù)字必須用一次且只能用一次。在規(guī)定時間內(nèi)輸入算式,輸入正確加十分,輸入錯誤生命值減一,點擊確定提交并進(jìn)入下一題,點擊清空可清空算式。點擊開始游戲進(jìn)入游戲,可重新開始游戲。
from PyQt5 import QtCore, QtWidgets from PyQt5.QtWidgets import * from PyQt5.QtCore import QBasicTimer from PyQt5.QtGui import QPixmap import sys class 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;\">規(guī)則:</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可以當(dāng)成是1、11、12、13。任意抽取4張牌,用加、減、乘、除(可加括號)把牌面上的數(shù)算成24。每張牌對應(yīng)的數(shù)字必須用一次且只能用一次。在規(guī)定時間內(nèi)輸入算式,輸入正確加十分,輸入錯誤生命值減一,點擊確定提交并進(jìn)入下一題,點擊清空可清空算式。點擊開始游戲進(jìn)入游戲。</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", "清空"))
以上為設(shè)置界面
import itertools import random #已做題目數(shù) self.question_number = 0 # 生命值 self.life = 3 # 分?jǐn)?shù) self.score = 0 # 重新開始標(biāo)記 self.recover = 0 # 發(fā)牌器 隨機(jī)抽取四個數(shù)字 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)種排列方式的列表 # 顯示四個數(shù)字對應(yīng)的撲克牌 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() # 將開始游戲按鈕設(shè)置為不可用 self.pushButton.setEnabled(False) # 將重新開始游戲按鈕設(shè)置為可用 self.pushButton_4.setEnabled(True) # 確定提交 def on_click2(self): # 已做題目數(shù)增加 self.question_number += 1 # 停止計時 self.timer.stop() # 當(dāng)做到最后一題 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, "恭喜你", "答題結(jié)束\n您的生命值為" + str(self.life) + ",分?jǐn)?shù)為" + str(self.score), QMessageBox.Close) # 設(shè)置確定和清空按鈕為不可用 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進(jìn)入下一題", QMessageBox.Yes) self.fresh() else: self.result = int(eval(self.calstr)) if self.result == 24: self.score += 10 QMessageBox.information(self, "恭喜你", "算式輸入正確\n進(jìn)入下一題", QMessageBox.Yes) self.fresh() else: self.life -= 1 QMessageBox.information(self, "很遺憾", "算式輸入不正確\n進(jìn)入下一題", QMessageBox.Yes) self.fresh() # 清空 def on_click3(self): self.lineEdit.setText('') #重新開始游戲 def on_click4(self): # 初始化已做題數(shù)、生命值、分?jǐn)?shù)、時間 self.question_number = 0 self.life = 3 self.score = 0 self.step = 0 self.timer.stop() QMessageBox.information(self, "重新開始游戲", "生命值和分?jǐn)?shù)已重置", 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) # 使用一個計時器來啟動進(jìn)度條 def timerEvent(self, e): # 如果時間到,則停止計時,已做題數(shù)加一 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('') # 彈出結(jié)果消息框 QMessageBox.information(self, "恭喜你", "答題結(jié)束\n您的生命值為"+str(self.life)+",分?jǐn)?shù)為"+str(self.score), QMessageBox.Close) self.pushButton_2.setEnabled(False) self.pushButton_3.setEnabled(False) else: self.life -= 1 QMessageBox.information(self, "很遺憾", "規(guī)定時間已到\n進(jìn)入下一題", QMessageBox.Yes) self.fresh() return self.step = self.step + 1 self.progressBar.setValue(self.step) # 進(jìn)度條 def progress_bar(self): if self.timer.isActive(): self.timer.stop() else: # 規(guī)定時間為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')) # 將撲克牌填充整個標(biāo)簽 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 = [] # 存放隨機(jī)牌組 cardGroup = () # 調(diào)用牌組 app = QtWidgets.QApplication(sys.argv) Form = QtWidgets.QMainWindow() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec_())
實現(xiàn)各控件的功能
開始界面
點擊確定提交,輸入錯誤時會彈出消息框
答題結(jié)束時匯總成績
有問題歡迎評論
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家,關(guān)注腳本之家公眾號的更多精彩內(nèi)容。
相關(guān)文章
解決Linux系統(tǒng)中python matplotlib畫圖的中文顯示問題
這篇文章主要介紹了解決Linux系統(tǒng)中python matplotlib畫圖的中文顯示問題,需要的朋友可以參考下2017-06-06Sentry的安裝、配置、使用教程(Sentry日志手機(jī)系統(tǒng))
Sentry?是一個實時事件日志記錄和聚合平臺,由于ExceptionLess官方提供的客戶端只有.Net/.NetCore平臺和js的,本文繼續(xù)介紹另一個日志收集系統(tǒng)Sentry,感興趣的朋友一起看看吧2022-07-07python數(shù)字圖像處理實現(xiàn)直方圖與均衡化
在圖像處理中,直方圖是非常重要,也是非常有用的一個處理要素。這篇文章主要介紹了python數(shù)字圖像處理實現(xiàn)直方圖與均衡化,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05Python學(xué)習(xí)之.iloc與.loc的區(qū)別、聯(lián)系和用法
loc和iloc都是pandas工具中定位某一行的函數(shù),下面這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)之.iloc與.loc的區(qū)別、聯(lián)系和用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05Python入門教程2. 字符串基本操作【運算、格式化輸出、常用函數(shù)】
這篇文章主要介紹了Python字符串基本操作,結(jié)合實例形式總結(jié)分析了Python字符串的基本表示、運算、格式化輸出、常用函數(shù)等,注釋包含較為詳盡的說明,便于理解,需要的朋友可以參考下2018-10-10