python

超轻量级php框架startmvc

PyQt5实现类似别踩白块游戏

更新时间:2020-06-23 02:00:02 作者:startmvc
本文实例为大家分享了PyQt5实现类似别踩白块游戏的具体代码,供大家参考,具体内容如下#

本文实例为大家分享了PyQt5实现类似别踩白块游戏的具体代码,供大家参考,具体内容如下


#引入可能用到的库
from PyQt5.QtWidgets import (QWidget, QApplication,QPushButton,QMessageBox,QLabel,QDesktopWidget,QMainWindow)
from PyQt5.QtCore import Qt,QRect,QSize,QPoint,QTimer
from PyQt5.QtGui import QPainter, QFont, QColor, QPen,QIcon,QBrush
import sys
import random
 
class mainForm(QMainWindow):
 def __init__(self):
 
 super().__init__()
 self.initUI()
 self.show()
 
 def initUI(self):
 
 self.setWindowTitle("Step Game")
 self.setGeometry(0,0,520,360)
 self.setWindowIcon(QIcon(R"Doraemon.ico"))
 self.center()
 
 self.myBoard=board()
 self.myBoard.resize(500,400)
 self.myBoard.move(10,10)
 self.myBoard.setParent(self)
 
 def center(self):
 
 frame=self.frameGeometry()
 availableCenter=QDesktopWidget().availableGeometry().center()
 frame.moveCenter(availableCenter)
 self.move(frame.topLeft())
 
 
class board(QWidget):
 
 def __init__(self):
 super().__init__()
 self.initUI()
 self.initPath()
 self.isStarted=False
 def initUI(self):
 
 _font=QFont("Roman times",16,QFont.Bold)
 
 self.tipLabel=QLabel("加油!",self)
 self.tipLabel.setFont(_font)
 self.tipLabel.move(300,310)
 
 self.timingLabel=QLabel("0S",self)
 self.timingLabel.move(200,310)
 self.timingLabel.setFont(_font)
 
 self.startButton=QPushButton("开始",self)
 self.startButton.setFont(_font)
 self.startButton.move(20,310)
 self.startButton.clicked.connect(self.start)
 
 self.costTimer=QTimer()
 self.costTimer.timeout.connect(self.tick)
 
 self.myPainter = QPainter()
 #让这个整个控件获得焦点
 self.setFocusPolicy(Qt.StrongFocus)
 #为了不让按钮获得焦点
 self.startButton.setFocusPolicy(Qt.NoFocus)
 
 def initPath(self):
 
 self.queue=[[0,0,0],[1,2,3]]
 
 for i in range(100):#从123中随机选取2个数字
 _num=random.randint(1,3)
 _oneTowThree=[1,2,3]
 _oneTowThree.remove(_num)
 self.queue.append(_oneTowThree)
 
 for i in range(5):#地图的最后有空的方块
 self.queue.append([])
 
 def start(self):
 
 self.isStarted=True
 self.currentX=1
 self.timeCost=0
 self.currentY=random.randint(1,3)
 self.previouY=self.currentY
 self.costTimer.start(1000)
 self.repaint()
 
 def tick(self):
 
 self.timeCost+=1
 self.timingLabel.setText(str(self.timeCost)+"S")
 
 def paintEvent(self, e):
 #点击开始之前,currenX变量还没有初始化,下面的代码会引用这个变量,导致出错
 if self.isStarted==False:return
 #开始画图
 self.myPainter.begin(self)
 #画背景
 self.drawBackGround()
 
 interval=2#方块之间的间隔的二分之一
 #画场景
 for i in range(5):
 _item = self.queue[i + self.currentX-1]
 for _num in _item:
 #确定每个方块的位置和大小
 _startPoint = QPoint(i *(100+interval), (_num -1)* (100+interval) )
 _size = QSize((100-2*interval), (100-2*interval))
 #设置画笔和画刷
 self.myPainter.setPen(QColor.fromRgb(255, 255, 255))
 self.myPainter.setBrush(QColor.fromRgb(205,211,159))
 #画方块们
 self.myPainter.drawRect(QRect(_startPoint, _size))
 #画currentMe
 #设置画笔和画刷
 _myPen = QPen(Qt.white)
 self.myPainter.setPen(_myPen) # pen用来画边框
 self.myPainter.setBrush(QColor.fromRgb(105, 139 ,105))
 #确定每个方块的位置和大小
 _startPoint = QPoint(100+interval, (100+interval) *(self.currentY-1))
 _size = QSize((100-2*interval), (100-2*interval))
 #画方块
 self.myPainter.drawRect(QRect(_startPoint, _size))
 #结束画图
 self.myPainter.end()
 
 def drawBackGround(self):
 
 _myPen = QPen(Qt.white)
 
 self.myPainter.setPen(_myPen) # pen用来画边框
 self.myPainter.setBrush(QColor.fromRgb(255,239,124))
 
 _tempSize = self.size()
 _newSize = QSize(_tempSize.width(), _tempSize.height()-100)
 _startPoint = QPoint(0, 0)
 
 self.myPainter.drawRect(QRect(_startPoint, _newSize))
 
 
 def keyPressEvent(self, kEvent):
 
 if self.isStarted==False:return
 
 _k=kEvent.key()
 #每次只能走相邻的格子
 if _k==Qt.Key_Up:
 if self.currentY==1:
 _nextY=1
 else:
 _nextY=self.currentY-1
 elif _k==Qt.Key_Down:
 if self.currentY == 3:
 _nextY = 3
 else:
 _nextY = self.currentY +1
 elif _k==Qt.Key_Left:
 return#未定义事件
 elif _k==Qt.Key_Right:
 _nextY = self.currentY
 else:
 return
 
 if _nextY not in self.queue[self.currentX+1]:
 QMessageBox.warning(self,"Step Game","掉坑里了,用时+3S",QMessageBox.Ok)
 self.timeCost+=3
 else:
 self.currentX += 1
 self.previouY=self.currentY
 self.currentY=_nextY
 
 self.sceneForward()#场景往前走一步
 
 def sceneForward(self):
 
 if self.currentX==101:
 self.costTimer.stop()
 _reply=QMessageBox.question(self,'恭喜你闯关成功',"总耗时<b>秒"+str(self.timeCost)+"<br>Restart or quit?<br><b>Press Yes to restart or press no to quit this game.",
 QMessageBox.No|QMessageBox.Yes,
 QMessageBox.Yes)
 if _reply==QMessageBox.Yes:
 self.start()
 else:
 self.parent().close()
 
 self.repaint()
 
if __name__ == '__main__':
 app = QApplication(sys.argv)
 ex = mainForm()
 sys.exit(app.exec_())

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

PyQt5 别踩白块 游戏