20192108《Python程序设计》实验四报告
20192108《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 1921
学号:20192108
实验教师:王志强
实验日期:2020年6月10日
必修/选修: 公选课
1.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
(1)程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)10分
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。10分。
(3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。5分
2. 实验过程及结果
实验过程
首先明确实验目标:我想编一个可视化python小游戏
受了知乎的启发,决定编一个剪刀石头布小游戏
先配置了PyQt5和QtDesigner,但由于技术问题并未采用QtDesigner
编程过程中,先给游戏界面排版
调整游戏界面
插入图片,编写游戏机制。这个过程比较艰苦,其间也借鉴了一些大佬的博客,自己最后也总算是成功调通了
实验结果
完整代码如下
"""
作者:纪元
文件名称:实验四:可视化游戏
时间:2020年6月10日
"""
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import random
class red(QPushButton):
def init(self, parent=None):
super().init(parent)
self.setFixedSize(160, 120)#self.resize(40, 30)
global rednum
rednum = int(random.random() * 3) # 随机
print(rednum)
choices = ['redcloth.png', 'redscissors.png', 'redstone.png']
file = str(choices[int(rednum)])
self.setStyleSheet("QPushButton{border-image: url(%s)}"%(file))
class blue(QPushButton):
def init(self, parent=None):
super().init(parent)
self.setFixedSize(160, 120)#self.resize(40, 30)
global bluenum
bluenum = int(random.random() * 3) # 随机
choices = ['bluecloth.png', 'bluescissors.png', 'bluestone.png']
file = str(choices[int(bluenum)])
self.setStyleSheet("QPushButton{border-image: url(%s)}"%(file))
class GameWindow(QWidget):
def init(self, parent=None):
super().init(parent)
self.virusnum=0
self.setWindowTitle("剪刀石头布小游戏")
self.setWindowIcon(QIcon('图标.jpg'))
self.gametimes=0
self.redscores=0
self.bluescores = 0
self.tietimes=0
self.imagelayout = QGridLayout()
self.setLayout(self.imagelayout) # 局部布局
self.redText= QTextBrowser()
self.redText.setText('红方选手')
self.redText.setFixedSize(90, 50)
self.imagelayout.addWidget(self.redText, 0, 0, Qt.AlignCenter)
self.actionText = QTextBrowser()
self.actionText.setText('第0轮')
self.actionText.setFixedSize(70, 50)
self.imagelayout.addWidget(self.actionText, 0, 1, Qt.AlignCenter)
self.blueText = QTextBrowser()
self.blueText.setText('蓝方选手')
self.blueText.setFixedSize(90, 50)
self.imagelayout.addWidget(self.blueText, 0, 2, Qt.AlignCenter)
self.startPushButton = QPushButton("开始游戏")
self.startPushButton.setFixedSize(90, 60)
self.startPushButton.clicked.connect(self.gamestart)
self.imagelayout.addWidget(self.startPushButton, 2, 1, Qt.AlignCenter)
self.restartPushButton = QPushButton("重新开始")
self.restartPushButton.setFixedSize(90, 60)
self.restartPushButton.clicked.connect(self.restart)
self.imagelayout.addWidget(self.restartPushButton, 2, 2, Qt.AlignCenter)
#红方图片布局
self.redlayout = QGridLayout() # 网格布局
self.redWidget = QWidget()
self.redWidget.setFixedSize(300, 200)
self.imagelayout.addWidget(self.redWidget, 1, 0)
self.redWidget.setLayout(self.redlayout)
#分数布局
self.scorelayout = QGridLayout() # 网格布局
self.scoreWidget = QWidget()
self.scoreWidget.setFixedSize(300, 200)
self.imagelayout.addWidget(self.scoreWidget, 1, 1)
self.scoreWidget.setLayout(self.scorelayout)
self.scoreRedText = QTextBrowser()
self.scoreRedText.setText('红方得分:{}分'.format(self.redscores))
self.scoreRedText.setFixedSize(100, 60)
self.scorelayout.addWidget(self.scoreRedText, 0, 0)
self.scoreVsText = QTextBrowser()
self.scoreVsText.setText('VS')
self.scoreVsText.setFixedSize(30, 30)
self.scorelayout.addWidget(self.scoreVsText, 0, 1)
self.scoreBlueText = QTextBrowser()
self.scoreBlueText.setText('蓝方得分:{}分'.format(self.bluescores))
self.scoreBlueText.setFixedSize(100, 60)
self.scorelayout.addWidget(self.scoreBlueText, 0, 2)
self.tieText = QTextBrowser()
self.tieText.setText('平局次数:{}次'.format(self.tietimes))
self.tieText.setFixedSize(100, 60)
self.scorelayout.addWidget(self.tieText, 1, 0, 1, 3, Qt.AlignCenter)
#蓝方图片布局
self.bluelayout = QGridLayout() # 网格布局
self.blueWidget = QWidget()
self.blueWidget.setFixedSize(300, 200)
self.imagelayout.addWidget(self.blueWidget, 1, 2)
self.blueWidget.setLayout(self.bluelayout)
def gamestart(self):
self.gametimes+= 1
self.actionText.setText('第{0}轮'.format(self.gametimes))
self.redlayout.addWidget(red(), 0, 0)
self.bluelayout.addWidget(blue(), 0, 0)
self.judge()
def judge(self):
if rednum==0:
if bluenum==0:
self.tietimes+=1
self.tieText.setText('平局次数:{}次'.format(self.tietimes))
elif bluenum==1:
self.bluescores+=1
self.scoreBlueText.setText('蓝方得分:{}分'.format(self.bluescores))
elif bluenum==2:
self.redscores += 1
self.scoreRedText.setText('红方得分:{}分'.format(self.redscores))
elif rednum==1:
if bluenum == 0:
self.redscores += 1
self.scoreRedText.setText('红方得分:{}分'.format(self.redscores))
elif bluenum == 1:
self.tietimes+=1
self.tieText.setText('平局次数:{}次'.format(self.tietimes))
elif bluenum == 2:
self.bluescores += 1
self.scoreBlueText.setText('蓝方得分:{}分'.format(self.bluescores))
elif rednum==2:
if bluenum == 0:
self.bluescores += 1
self.scoreBlueText.setText('蓝方得分:{}分'.format(self.bluescores))
elif bluenum == 1:
self.redscores += 1
self.scoreRedText.setText('红方得分:{}分'.format(self.redscores))
elif bluenum == 2:
self.tietimes+=1
self.tieText.setText('平局次数:{}次'.format(self.tietimes))
def restart(self):
self.gametimes=0
self.redscores=0
self.bluescores=0
self.tietimes=0
self.actionText.setText('第{0}轮'.format(self.gametimes))
self.scoreRedText.setText('红方得分:{}分'.format(self.redscores))
self.scoreBlueText.setText('蓝方得分:{}分'.format(self.bluescores))
self.tieText.setText('平局次数:{}次'.format(self.tietimes))
def closeEvent(self, event):
reply = QMessageBox.question(self, 'Message',
"Are you sure to quit?", QMessageBox.Yes |
QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
class Game(QWidget):
def init(self, parent=None):
super().init(parent)
self.setWindowTitle("剪刀石头布小游戏")
self.setWindowIcon(QIcon('图标.jpg'))
self.virusnum = 0
self.gametimes = 0
self.redscores = 0
self.bluescores = 0
self.tietimes = 0
self.imagelayout = QGridLayout()
self.setLayout(self.imagelayout) # 局部布局
self.redText = QTextBrowser()
self.redText.setText('红方选手')
self.redText.setFixedSize(70, 50)
self.imagelayout.addWidget(self.redText, 0, 0, Qt.AlignCenter)
self.actionText = QTextBrowser()
self.actionText.setText('第0轮')
self.actionText.setFixedSize(70, 50)
self.imagelayout.addWidget(self.actionText, 0, 1, Qt.AlignCenter)
self.blueText = QTextBrowser()
self.blueText.setText('蓝方选手')
self.blueText.setFixedSize(70, 50)
self.imagelayout.addWidget(self.blueText, 0, 2, Qt.AlignCenter)
app = QApplication(sys.argv)
gameshow = GameWindow()
gameshow.setFixedSize(900, 400)
gameshow.show()
sys.exit(app.exec_())
码云链接如下
https://gitee.com/an_era/python-learner/commit/a25efb590777318e05cd8e153d71d02517885c8f
运行结果如下
3. 实验过程中遇到的问题和解决过程
- 问题1:可视化界面不会写
- 问题1解决方案:百度,云班课
- 问题2:随机函数不会弄
- 问题2解决方案:百度
- 问题2:不会插入图片
- 问题2解决方案:百度
其他(感悟、思考等)
这学期的python学习,说实话很累,一学期要经历两门语言的洗礼
我也是在挫折中前进,不断学习,那些杀不死我们的,终将使我们变得更强
比如C语言中文件的内容我就是借鉴了python才理解的
由于这学期上的是网课,不理解的地方可以反反复复地观看,直到弄懂为止
而且网上相关的资源也很多,有很多大佬的博文、代码,这对我啃一门语言来说是很有帮助的
学习中遇到的问题一般百度都能解决,这也是一个学习的过程
不管怎么说,这些都是我的收获
最后提一点小小的建议:
老师有时候太依赖云班课了,那上面的教学资源的确很全面,但老师的讲解有时也是必不可少的
但以后线下上课也可以利用云班课、
最后吐槽一下:签到手势太复杂
参考资料
手把手教你用Python做个可视化的“剪刀石头布”小游戏https://zhuanlan.zhihu.com/p/110717323
Python - 编写可视化界面(Python+PyCharm+PyQt)https://blog.csdn.net/bailang_zhizun/article/details/79310419
python中的随机函数https://www.cnblogs.com/LoongitArt/p/9885595.html
Python写的剪刀石头布的游戏,供代码练习https://gitee.com/xunbaiqiannian/scissors/blob/master/%E5%89%AA%E5%88%80%E7%9F%B3%E5%A4%B4%E5%B8%83.py
Pyhton,Tkinter,剪刀石头布小游戏,可视化https://blog.csdn.net/heimu24/article/details/78593668