PyQt5实现类似别踩白块游戏


Posted in Python onJanuary 24, 2019

本文实例为大家分享了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_())

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

Python 相关文章推荐
Python pickle类库介绍(对象序列化和反序列化)
Nov 21 Python
用Python解析XML的几种常见方法的介绍
Apr 09 Python
python使用xlrd模块读写Excel文件的方法
May 06 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
python3+PyQt5实现自定义流体混合窗口部件
Apr 24 Python
python3.X 抓取火车票信息【修正版】
Jun 19 Python
Python使用post及get方式提交数据的实例
Jan 24 Python
python对象与json相互转换的方法
May 07 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
python实现tail实时查看服务器日志示例
Dec 24 Python
使用python实现CGI环境搭建过程解析
Apr 28 Python
Python实现CAN报文转换工具教程
May 05 Python
实例讲解Python脚本成为Windows中运行的exe文件
Jan 24 #Python
python随机在一张图像上截取任意大小图片的方法
Jan 24 #Python
Python爬虫实战之12306抢票开源
Jan 24 #Python
python+pyqt5实现24点小游戏
Jan 24 #Python
python中实现控制小数点位数的方法
Jan 24 #Python
对python以16进制打印字节数组的方法详解
Jan 24 #Python
python3实现点餐系统
Jan 24 #Python
You might like
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
php身份证号码检查类实例
2015/06/18 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
在次封装easyui-Dialog插件实现代码
2010/11/14 Javascript
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
2015/12/20 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
原生js开发的日历插件
2017/02/04 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
Python实现简单的可逆加密程序实例
2015/03/05 Python
Python与shell的3种交互方式介绍
2015/04/11 Python
对Python中数组的几种使用方法总结
2018/06/28 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
详解Python高阶函数
2020/08/15 Python
css3 给背景设置渐变色的方法
2019/09/12 HTML / CSS
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
客户服务经理岗位职责
2014/01/29 职场文书
《藤野先生》教学反思
2014/02/19 职场文书
《我为你骄傲》教学反思
2014/02/20 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
总账会计岗位职责
2015/04/02 职场文书
2015国庆节宣传语
2015/07/14 职场文书