[Python/PyQt5] 24点

本文介绍使用PyQt5设计与实现24点游戏界面的过程,包括UI设计、代码转换、逻辑处理及游戏功能实现。探讨了如何通过PyUIC将UI文件转化为Python代码,实现用户输入表达式验证、进度条更新及随机数生成等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 用pyqt5designer画一个简单的界面

在这里插入图片描述

2. 用PyUIC将display.ui转化为python代码,然后编辑代码

  1. display.py
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'display.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.

from PyQt5 import QtCore, QtGui, QtWidgets

from Checker24 import Checker24

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        self.Dialog = Dialog
        self.Dialog.setObjectName("Dialog")
        self.Dialog.resize(496, 477)
        self.game = Checker24()
        self.nums = self.game.generate_data()
        self.ac = 0

        self.lineEdit = QtWidgets.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(120, 320, 221, 41))
        self.lineEdit.setObjectName("lineEdit")
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(360, 320, 93, 41))
        self.pushButton.setObjectName("pushButton")
        self.progressBar = QtWidgets.QProgressBar(Dialog)
        self.progressBar.setGeometry(QtCore.QRect(120, 380, 181, 41))
        self.progressBar.setProperty("value", self.ac * 10)
        self.progressBar.setObjectName("progressBar")
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(120, 170, 91, 41))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(260, 170, 91, 41))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(Dialog)
        self.label_3.setGeometry(QtCore.QRect(120, 240, 91, 41))
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(Dialog)
        self.label_4.setGeometry(QtCore.QRect(260, 240, 91, 41))
        self.label_4.setObjectName("label_4")

        self.retranslateUi()

        QtCore.QMetaObject.connectSlotsByName(self.Dialog)

        # bind object to Action
        self.pushButton.clicked.connect(self.submitAction)

    def submitAction(self):
        # get user answer
        expr = self.lineEdit.text()
        if self.game.parse_expression(expr, self.nums):
            self.ac += 1
            self.lineEdit.setText("AC")
            self.progressBar.setProperty("value", self.ac * 10)
            self.nums = self.game.generate_data()
            self.retranslateUi()
        else:
            self.lineEdit.setText("WA")

    def retranslateUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.Dialog.setWindowTitle(_translate("Dialog", "24点"))
        self.pushButton.setText(_translate("Dialog", "Submit"))
        self.label.setText(_translate("Dialog", str(self.nums[0])))
        self.label_2.setText(_translate("Dialog", str(self.nums[1])))
        self.label_3.setText(_translate("Dialog", str(self.nums[2])))
        self.label_4.setText(_translate("Dialog", str(self.nums[3])))



if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

  1. checker24
import random

class Checker24:
    def generate_data(self):
        A = self.rand4()
        while not self.judgePoint24(A):
            A = self.rand4()
        return A
    def rand4(self):
        return [random.randint(1, 9) for _ in range(4)]

    def judgePoint24(self, nums: [int]) -> bool:
        eps = 1e-6
        def valid(x):
            return abs(abs(x) - 24) <= eps
        def pick(A, i, j):
            return A[0:i] + A[i + 1:j] + A[j + 1:]
        def op(x, y):
            ret = [x + y, x - y, y - x, x * y]
            if x != 0: ret.append(y / x)
            if y != 0: ret.append(x / y)
            return ret

        def F(A):
            if len(A) == 2:
                return any(map(valid, op(A[0], A[1])))
            for i in range(len(A)):
                for j in range(i + 1, len(A)):
                    P = pick(A, i, j)
                    for x in op(A[i], A[j]):
                        if F(P + [x]):
                            return True
            return False

        return F(nums)

    def parse_expression(self, expr, nums):
        try:
            res = eval(expr)
            if res == 24:
                t, A = "", []
                for x in expr:
                    if x.isdigit():
                        t = t + x
                    else:
                        if not t:
                            pass
                        else:
                            A.append(int(t))
                            t = ""
                if t: A.append(int(t))
                if sorted(nums) == sorted(A):
                    return True
                else:
                    print(sorted(nums), sorted(A))
                    return False
            return False
        except Exception:
            return False

3. 运行display并调试。

在这里插入图片描述

4. 总结

  1. 熟悉流程
  2. 了解控件和函数之间怎么绑定
  3. 需要访问的控件,我们可以放到self里面,就是说把它设成一个全局变量
  4. 将比较复杂的逻辑,我们可以写成类。
    问题:
  5. 如果我们写完之后,要修改UI,该怎么办?
  6. UI太丑,怎么画的好看一些?
  7. 只是基本的单机游戏, 如何保存以前的成绩, 比说说,我们加一个答对10题的时间。
  8. 如何改成联网的版本, 也可以看到其它用户的排名?
  9. 如何防止玩家作弊?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值