现代软件工程课程设计——“黄金点游戏”课程报告二

环境抉择

Qt Designer,一个成熟的C++图形用户界面程序开发框架。在Python时代,PyQt5成功整合了Qt Designer与PyCharm两大工作环境,为使用Python语言构建图形化程序提供了基础

本次功能实现

GDEYE-001 游戏欢迎界面

  1. 用例描述:游戏欢迎界面
  2. 前置条件:打开游戏程序
  3. 后置条件:游戏正式开始
  4. 参与者:游戏玩家
  5. 数据:信号函数
  6. 输出数据:无
  7. 事件流:
    欢迎界面→点击“开始游戏”→进入游戏
    欢迎界面

使用PyQt5构建的简单开始界面。

代码如下:

#Index.py
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(400, 300)
        MainWindow.setMaximumSize(QtCore.QSize(400, 300))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setObjectName("widget")
        self.gridLayout = QtWidgets.QGridLayout(self.widget)
        self.gridLayout.setObjectName("gridLayout")
        self.label_2 = QtWidgets.QLabel(self.widget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
        self.label_2.setSizePolicy(sizePolicy)
        self.label_2.setMaximumSize(QtCore.QSize(100, 200))
        font = QtGui.QFont()
        font.setPointSize(19)
        self.label_2.setFont(font)
        self.label_2.setWordWrap(True)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 0, 2, 1, 1)
        self.label = QtWidgets.QLabel(self.widget)
        self.label.setMaximumSize(QtCore.QSize(400, 800))
        self.label.setStyleSheet("image: url(:/goldeneye/timg.jpg);")
        self.label.setText("")
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.pushButton = QtWidgets.QPushButton(self.widget)
        self.pushButton.setMaximumSize(QtCore.QSize(150, 50))
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 1, 2, 1, 1)
        self.horizontalLayout.addWidget(self.widget)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 400, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.pushButton.clicked.connect(MainWindow.close)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label_2.setText(_translate("MainWindow", "Design by Xu and Li"))
        self.pushButton.setText(_translate("MainWindow", "开始游戏"))

GDEYE-007 总积分榜

  1. 用例描述:计算总积分榜
  2. 前置条件:一轮游戏结束
  3. 后置条件:展示总积分榜
  4. 参与者:游戏玩家
  5. 数据:无
  6. 输出数据:总积分榜
  7. 事件流:
    一轮游戏结束→展示当前总积分榜

代码如下:

#game.py
def calculate(callist):
    num = 0
    for i in range(len(callist)):
        num += callist[i].current
    G = num/len(callist)*0.618
    print("黄金点数值是:"+str(G))
    num_group = []
    for i in range(len(callist)):
        num_group.append(abs(callist[i].current-G))
    maxpos = num_group.index(max(num_group))
    minpos = num_group.index(min(num_group))
    callist[minpos].score += len(callist)
    callist[maxpos].score -= 2
    return callist


def show_current(currentlist):
    print("当前积分榜如下:")
    for i in range(len(currentlist)):
        print(currentlist[i].name+":"+str(currentlist[i].score))
        
#main.py
def main():
    current_list = infocheck.info()
    game.welcome()
    flag = 1
    # while(flag):
    #     current_list = game.start_game(current_list)
    #     game.show_current(current_list)
    #     print("是否继续游戏?是请输入y,否请输入其他任意键:")
    #     save = input()
    #     if save != 'y':
    #         flag = 0
    # return

GDEYE-008 游戏结束界面

  1. 用例描述:游戏结束
  2. 前置条件:所有游戏流程结束
  3. 后置条件:关闭程序
  4. 参与者:游戏玩家
  5. 数据:无
  6. 输出数据:无
  7. 事件流:
    游戏结束→关闭程序

游戏结束
使用PyQt5构建的简单结束界面。

代码如下:

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.widget = QtWidgets.QWidget(Form)
        self.widget.setGeometry(QtCore.QRect(100, 70, 202, 161))
        self.widget.setObjectName("widget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setPointSize(30)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.pushButton = QtWidgets.QPushButton(self.widget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "游戏结束!"))
        self.pushButton.setText(_translate("Form", "退出游戏"))

本次功能完善

GDEYE-002 用户信息确认

利用PyQt5设计了确认人数的对话框。
人数确认
代码如下:

#Num.py
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(320, 120)
        Form.setMaximumSize(QtCore.QSize(320, 120))
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.widget = QtWidgets.QWidget(Form)
        self.widget.setObjectName("widget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.widget)
        font = QtGui.QFont()
        font.setPointSize(13)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.spinBox = QtWidgets.QSpinBox(self.widget)
        self.spinBox.setMaximumSize(QtCore.QSize(100, 50))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.spinBox.setFont(font)
        self.spinBox.setObjectName("spinBox")
        self.horizontalLayout.addWidget(self.spinBox)
        self.pushButton = QtWidgets.QPushButton(self.widget)
        self.pushButton.setMaximumSize(QtCore.QSize(100, 40))
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        self.horizontalLayout_2.addWidget(self.widget)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "请输入游戏人数"))
        self.pushButton.setText(_translate("Form", "确认"))

多窗口流程化初步

本次黄金眼项目,大致有着欢迎界面→信息确认→游戏规则介绍→输入数字→公布排行榜这一流程。按照流程图形化的对话框也应当有相应的交互逻辑。

本次从欢迎界面到确认人数的交互逻辑实现代码如下:

#Index2Num.py
from Index import *
from Num import *
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
import sys

class ParentWindow(QMainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.main_ui = Ui_MainWindow()
        self.main_ui.setupUi(self)

class ChildWindow(QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.child_ui = Ui_Form()
        self.child_ui.setupUi(self)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = ParentWindow()
    child = ChildWindow()
    # 通过toolButton将两个窗体关联
    btn = window.main_ui.pushButton
    btn.clicked.connect(child.show)
    # 显示
    window.show()
    sys.exit(app.exec_())

在按下欢迎界面的“开始游戏”按钮后,欢迎界面会消失,弹出确认人数界面,按照游戏流程继续进行下去。

阶段总结

由于这两周,两人还处于学习PyQt5的阶段,因而只在完整程序的框架下初步实行了图形化处理。接下来的两周,将对图形化程序进行信号与槽的整体布局,完成多窗口互动,在图形化界面状态下完整走完游戏流程。

# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'aaa.ui' # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! import sys, os from PyQt5 import QtCore, QtWidgets, QtGui from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5 import QtCore, QtGui, QtWidgets class U_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1204, 836) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.tableWidget = QtWidgets.QTableWidget(self.centralwidget) self.tableWidget.setGeometry(QtCore.QRect(80, 240, 1041, 371)) self.tableWidget.setAutoScrollMargin(9) self.tableWidget.setRowCount(9) self.tableWidget.setColumnCount(8) self.tableWidget.setObjectName("tableWidget") item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(3, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(4, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(5, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(6, item) item = Q
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值