第一次制作中秋博饼小游戏的心得与吐槽

  • 一、我想说的
  • 二、实现的功能
  • 三、编译工具
  • 四、步骤
    • 下载并打开Qt Designer
    • 设计自己的UI
      • UI简介
      • 转换为.py文件
  • 五、核心代码分析
    • 随机数生成
    • 点数统计
    • 博饼规则&判断奖励
  • 六、完整代码
  • 七、缺憾

一、我想说的

这软工老师真的很棒!

二、实现的功能

点击开始游戏(单人模式),进入博饼,自动生产6个骰子的点数,并判断玩家本次博饼的结果(奖励):

三、编译工具

Qt Designer (基本UI可视化设计)
Pycharm/Jupyter Notebook (功能程序设计)

四、步骤

下载并打开Qt Designer

  1. 一般Qt在Anaconda下载时就自带了。
  2. D盘 > Anaconda > Lib > site-packages > qt5_applications > Qt > bin >designer.exe (不同用户可能位置略有差异)

设计自己的UI

UI简介

这里我就简单介绍下我这次项目的各个控件的功能,具体使用方法请参考:参考1 参考2 参考3

  1. Label控件更名为Background,用于插入背景图片,右键置于底层:

    该图片被更名为1.jpg并存放于名为image的文件夹内。同时,我用XML格式写一个.qrc文件,将上述图片的相对路径添加进去。具体如何使用请参考:Qt designer 插入背景图片方法
  2. Push Button控件更名为StartGame,这样直接点击是无法有任何反应的,若要实现点击后与用户的交互功能(如显示游戏结果等)则需要增加“信号/槽slot”:

    拖动需要增加功能的控件会出现如下界面:

  3. 另外我还自定义了windowIcon的图标为骰子,toolTip设置了控件提示(提示工具在鼠标移动到指定元素后触发)。按照自己的需求设计,这里不过多赘述。

转换为.py文件

一切就绪后,我将其命名为Game并会默认保存为.ui文件,该文件类型打开后是这样的(你看得懂吗?反正我看不懂,寄!):

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>Form</class><widget class="QWidget" name="Form"><property name="geometry"><rect><x>0</x><y>0</y><width>297</width><height>300</height></rect></property><property name="windowTitle"><string>好兄弟博饼</string></property><property name="windowIcon"><iconset><normaloff>Desktop/骰子图标.jpg</normaloff>Desktop/骰子图标.jpg</iconset></property><property name="toolTip"><string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;center&quot;&gt;点击开始博饼&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string></property><widget class="QPushButton" name="StartGame"><property name="geometry"><rect><x>100</x><y>260</y><width>93</width><height>28</height></rect></property><property name="toolTip"><string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;点击开始博饼&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string></property><property name="text"><string>开始游戏</string></property><property name="autoDefault"><bool>false</bool></property><property name="flat"><bool>false</bool></property></widget><widget class="QLabel" name="Background"><property name="geometry"><rect><x>0</x><y>0</y><width>301</width><height>301</height></rect></property><property name="text"><string/></property><property name="pixmap"><pixmap resource="Desktop/picture.qrc">:/image/1.jpg</pixmap></property></widget><zorder>Background</zorder><zorder>StartGame</zorder></widget><resources><include location="Desktop/picture.qrc"/></resources><connections><connection><sender>StartGame</sender><signal>clicked()</signal><receiver>Form</receiver><slot>show_message()</slot><hints><hint type="sourcelabel"><x>192</x><y>260</y></hint><hint type="destinationlabel"><x>296</x><y>252</y></hint></hints></connection></connections><slots><slot>show_message()</slot></slots>
</ui>

若要使用Python进行程序的编写,所以还需要将其转换为.py格式的文件才行,在命令行中使用如下一行代码可以实现转换:

pyuic5 -o Game.py Game.ui # Game为文件名,可按需修改

另外,上文提到的用于添加背景图路径的.qrc文件也需要进行类似转换,否则会报错,命令行输入(参考文章):

pyrcc5 -o picture.py picture.qrc # picture为文件名,可按需修改

.ui格式转.py后如下:

from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(297, 300)icon = QtGui.QIcon()icon.addPixmap(QtGui.QPixmap("Desktop/骰子图标.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) # windowIcon自定义图片Form.setWindowIcon(icon)self.StartGame = QtWidgets.QPushButton(Form)self.StartGame.setGeometry(QtCore.QRect(100, 260, 93, 28))self.StartGame.setAutoDefault(False)self.StartGame.setFlat(False)self.StartGame.setObjectName("StartGame") # objectName更名为StartGameself.Background = QtWidgets.QLabel(Form)self.Background.setGeometry(QtCore.QRect(0, 0, 301, 301))self.Background.setText("")self.Background.setPixmap(QtGui.QPixmap(":/image/1.jpg")) # 自定义背景图片self.Background.setObjectName("Background") # objectName更名为Backgroundself.Background.raise_()self.StartGame.raise_()self.retranslateUi(Form)self.StartGame.clicked.connect(Form.show_message) # StartGame控件点击后弹窗功能QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "好兄弟博饼")) # windowTitle设置为“好兄弟博饼”Form.setToolTip(_translate("Form", "<html><head/><body><p align=\"center\">点击开始博饼</p></body></html>")) # 设置toolTip文本self.StartGame.setToolTip(_translate("Form", "<html><head/><body><p>点击开始博饼</p></body></html>"))self.StartGame.setText(_translate("Form", "开始游戏")) # StartGame控件上显示“开始游戏”import picture # 导入背景图.py文件

五、核心代码分析

随机数生成

# 创建Die类
from random import randintclass Die():def __init__(self,num_sides=6):self.num_sides = num_sidesdef roll(self):#随机返回一个1到num_sides之间的数return randint(1, self.num_sides)# 掷骰子
die = Die()
>>> results = []
>>> for roll_num in range(6):result = die.roll()results.append(result)
>>> print(sorted(results))
[1, 2, 2, 4, 6, 6]

点数统计

简单的词频统计,但是这里需要把点数为0的也统计进去,可以参考文章:Python词频统计

>>> sides = [1,2,3,4,5,6]
>>> countDict = {}
>>> for i in results:if i in countDict:countDict[i] += 1 #对于重复出现的,每出现一次,次数增加1else:countDict[i] = 1for j in sides:if j not in results:countDict[j] = 0for i in range(1,7):print(f'六粒骰子中 {i} 的个数为:{countDict[i]}')六粒骰子中 1 的个数为:1
六粒骰子中 2 的个数为:2
六粒骰子中 3 的个数为:0
六粒骰子中 4 的个数为:1
六粒骰子中 5 的个数为:0
六粒骰子中 6 的个数为:2

博饼规则&判断奖励

闽南地区可能有不同的博饼规则,但大同小异,我选择的规则如下:

根据结果判断规则表示的难易度,我进行了如图5个类型的划分,判断顺序为12345。

# 判断是否为“六博红/六博黑”
def sixred_or_black():for i in range(1,7):if countDict[i] == 6:if i == 4:return '六博红'else:return '六博黑'# 判断是否为“状元插金花”
def chajinhua():if countDict[4] == 4 and countDict[1] == 2:return '状元插金花'# 判断是否为“对堂”
def duitang():if len(set(list(countDict.values()))) == 1:return '对堂'# 判断是否为“五子登科”
def wuzidengke():if 5 in list(countDict.values()):return '五子登科'# 判断是否为“状元”
def zhuangyuan():if countDict[4] == 4:return '状元'# 判断是否为“四进”
def sijin():for i in range(1,7):if countDict[i] == 4:return '四进'# 判断是否为“三红/二举/一秀”,否则为“无奖励”
def sanhong_erju_yixiu():if countDict[4] == 3:return '三红'elif countDict[4] == 2:return '二举'elif countDict[4] == 1:return '一秀'else:return '抱歉无奖励'# while循环7次(上述7个函数依次判断,若符合条件则break,不符合则继续判断)
count = 7
while count:if sixred_or_black() == None:count -= 1else:print('结果为:',sixred_or_black())breakif chajinhua() == None:count -= 1else:print('结果为:',chajinhua())breakif duitang() == None:count -= 1else:print('结果为:',duitang())breakif wuzidengke() == None:count -= 1else:print('结果为:',wuzidengke())breakif zhuangyuan() == None:count -= 1else:print('结果为:',zhuangyuan())break if sijin() == None:count -= 1else:print('结果为:',sijin())breakif sanhong_erju_yixiu() == None:count -= 1else:print('结果为:',sanhong_erju_yixiu())break

六、完整代码

结合上述,稍作修改,可得如下代码:

import sys # 导入sys模块
from PyQt5.QtWidgets import QMessageBox, QWidget, QApplication # 导入Qt模块
from Game import Ui_Form # 导入ui设计模块
# import picture # 导入背景图模块
from random import randint # 导入随机数函数class Game(QWidget, Ui_Form):# 初始化def __init__(self):super(Game, self).__init__()self.setupUi(self)# 结果展示函数def show_message(self):results = []for roll_num in range(6):result = randint(1,6)results.append(result) # 将随机数存于列表sides = [1,2,3,4,5,6]countDict = {} # 该字典用于统计和存储每个点数出现次数for i in results:if i in countDict:countDict[i] += 1 # 对于重复出现的,每出现一次,次数增加1else:countDict[i] = 1for j in sides: # 对于未出现的点数,记为0次if j not in results:countDict[j] = 0# 函数判断结果def sixred_or_black():for i in range(1,7):if countDict[i] == 6:if i == 4:return '六博红'else:return '六博黑'def chajinhua():if countDict[4] == 4 and countDict[1] == 2:return '状元插金花'def duitang():if len(set(list(countDict.values()))) == 1:return '对堂'def wuzidengke():if 5 in list(countDict.values()):return '五子登科'def zhuangyuan():if countDict[4] == 4:return '状元'def sijin():for i in range(1,7):if countDict[i] == 4:return '四进'def sanhong_erju_yixiu():if countDict[4] == 3:return '三红'elif countDict[4] == 2:return '二举'elif countDict[4] == 1:return '一秀'else:return '抱歉无奖励'count = 7while count:if sixred_or_black() == None:count -= 1else:QMessageBox.about(self, '结果',f'点数分别为:{results[0]} 'f'{results[1]} 'f'{results[2]} 'f'{results[3]} 'f'{results[4]} 'f'{results[5]}\n'f'你获得了:{sixred_or_black()}')breakif chajinhua() == None:count -= 1else:QMessageBox.about(self, '结果',f'点数分别为:{results[0]} 'f'{results[1]} 'f'{results[2]} 'f'{results[3]} 'f'{results[4]} 'f'{results[5]}\n'f'你获得了:{chajinhua()}')breakif duitang() == None:count -= 1else:QMessageBox.about(self, '结果',f'点数分别为:{results[0]} 'f'{results[1]} 'f'{results[2]} 'f'{results[3]} 'f'{results[4]} 'f'{results[5]}\n'f'你获得了:{duitang()}')breakif wuzidengke() == None:count -= 1else:QMessageBox.about(self, '结果',f'点数分别为:{results[0]} 'f'{results[1]} 'f'{results[2]} 'f'{results[3]} 'f'{results[4]} 'f'{results[5]}\n'f'你获得了:{wuzidengke()}')breakif zhuangyuan() == None:count -= 1else:QMessageBox.about(self, '结果',f'点数分别为:{results[0]} 'f'{results[1]} 'f'{results[2]} 'f'{results[3]} 'f'{results[4]} 'f'{results[5]}\n'f'你获得了:{zhuangyuan()}')break if sijin() == None:count -= 1else:QMessageBox.about(self, '结果',f'点数分别为:{results[0]} 'f'{results[1]} 'f'{results[2]} 'f'{results[3]} 'f'{results[4]} 'f'{results[5]}\n'f'你获得了:{sijin()}')breakif sanhong_erju_yixiu() == None:count -= 1else:QMessageBox.about(self, '结果',f'点数分别为:{results[0]} 'f'{results[1]} 'f'{results[2]} 'f'{results[3]} 'f'{results[4]} 'f'{results[5]}\n'f'你获得了:{sanhong_erju_yixiu()}')break# 退出函数def closeEvent(self, QCloseEvent):# 弹窗询问是否需要退出reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if reply == QMessageBox.Yes:QCloseEvent.accpet()else:QCloseEvent.ignore()if __name__ == '__main__':app = QApplication(sys.argv)ui = Game()ui.show()sys.exit(app.exec_())

七、缺憾

  1. 不是使用微信开发者工具:成品不是微信小程序
  2. 仅实现单人模式,未实现多人联机功能
  3. 判断结果的方法仍需要改进,暂时无法打包成函数多次调用以达到减少代码目的
  4. 游戏界面优化的问题

第一次制作中秋博饼小游戏的心得与吐槽(软件工程)相关推荐

  1. 我的C#第一次实验:中秋博饼

    我的C#第一次实验:中秋博饼 一.实验目的: 熟悉C#语法和VS编程环境 二.开发环境: 1.操作系统:windows 10 X64 2.SDK:Visual Studio 2019 三.制作项目 1 ...

  2. 微信小程序中秋博饼部分插图分享

    这是微信小游戏<中秋博饼>的部分软件展示图,后续会公开源代码和其他module,谢谢

  3. php 摇骰子,php实现的中秋博饼游戏之掷骰子并输出结果功能详解

    本文实例讲述了php实现的中秋博饼游戏之掷骰子并输出结果功能.分享给大家供大家参考,具体如下: 前面讲述了php实现的中秋博饼游戏之绘制骰子图案功能,纯php实现,就要用php来生成图案,第一步就先绘 ...

  4. php做的中秋博饼游戏之绘制骰子图案功能示例

    先看代码 header('Content-Type:image/png'); $img  = imagecreatetruecolor(200, 200); $white = imagecoloral ...

  5. html5中秋博饼,2020年中秋博饼优秀作文(精选5篇)

    2020年中秋博饼优秀作文(精选5篇) 在平平淡淡的日常中,大家对作文都不陌生吧,作文是通过文字来表达一个主题意义的记叙方法.那么你知道一篇好的作文该怎么写吗?以下是小编收集整理的2020年中秋博饼优 ...

  6. unity课设小游戏_Unity制作20个迷你小游戏实例训练视频教程

    本教程是关于Unity制作20个迷你小游戏实例训练视频教程,时长:20小时,大小:3.8 GB,MP4高清视频格式,教程使用软件:Unity,附源文件,作者:Raja Biswas,共97个章节,语言 ...

  7. 计算机课玩的小游戏怎么找,能够回味电脑课的小游戏是什么 怎么制作这两个小游戏...

    能够回味电脑课的小游戏是什么,怎么制作这两个小游戏.在我的世界里回味已经是很多人的游玩乐趣之一了,因为这个游戏超高的自由度还有各种玩法可以让我们回味童年的种种. 这些小游戏乍一看都不怎么需要技巧 简单 ...

  8. 使用小程序制作一个飞机大战小游戏

    此文主要基于微信小程序制作一个飞机大战小游戏,上手即用,操作简单. 一.创建小程序 二.页面实现 三.代码块 一.创建小程序 访问微信公众平台,点击账号注册. 选择小程序,并在表单填写所需的各项信息进 ...

  9. HBuilder制作英雄皮肤抽奖小游戏

    用HBuilder制作英雄皮肤抽奖小游戏,主要用到"轮播图"和"定时器",至于"轮播图"和"定时器" 是什么,请自行百度 ...

  10. java applet类开始博饼_中秋博饼demo

    [实例简介] 自己编写的中秋博饼demo.随机方向滚动,判断椭圆边缘碰撞,骰子之间碰撞.喜欢的可以拿去. [实例截图] [核心代码] f3735861-cb9e-49a5-8bb4-114320c68 ...

最新文章

  1. 在HTML文件的表单中添加{%csrf_token%}便可以解决问题
  2. AVFoundation 文本转语音和音频录制 播放
  3. 转:ASP.Net下两种全局变量的设置和读取方法
  4. linux sysstat rpm包下载,[20141201]SYSSTAT软件包.txt
  5. 在Vs.net中集成 NDoc生成的 Html Help 2帮助文档
  6. 代码同时托管到github和git.oschina.net
  7. PHP什么函数获取日期,php getdate()函数获取日期信息实例详解
  8. 理论 - 平面倒F天线(PIFA)
  9. Java中使用native2ascii工具处理.properties文件
  10. 全球城市排行榜:香港不再是“最贵”,丹麦首都“最宜居”,伦敦洛杉矶当选“未来城市”...
  11. arptables实现ARP报文IPMAC绑定
  12. 一站式智能化健身管理体验
  13. hexo-theme-icarus配置 valine 评论系统
  14. 日常瘦脸8个关键细节
  15. 应用统计学与R语言实现学习笔记(八)——方差分析
  16. 一些开源软件的国内镜像源
  17. 2D 到 3D 的跨越,探索最佳 AR 交互设计之道
  18. 重保防护 全力以赴丨一文看懂盛邦安全重保专项服务方案
  19. 北京数字认证bjca证书垃圾,报错:错误代码 EC999
  20. 纪中暑假培训: Date 3:电视游戏问题

热门文章

  1. 软件测试电脑功率,姗姗来迟的测试——功率计实测电脑耗电情况之三【i3 2100 + H61 配置篇】...
  2. java生成pdf合同
  3. 航空以太网(ARINC664)接口测试工具
  4. matlab结构数组增加域,如何用matlab创建结构数组
  5. 深入分析AIDL原理
  6. 计算机软件需求说明编制指南gb/t 9385-2008,GBT 9385-2008 计算机软件需求说明编制指南.pdf...
  7. code vs 集成tfs_Microsoft强大团队(源代码)管理工具--TFS2010 与vs结合
  8. http://www.techpot.net/archives/38147
  9. php变形的itf条码,itf14条码生成器 第14章生成器.doc
  10. 《系统分析与设计》课程设计——医院门诊信息管理查询系统