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 条件判断的缩写方法
Sep 06 Python
python判断、获取一张图片主色调的2个实例
Apr 10 Python
Python实现115网盘自动下载的方法
Sep 30 Python
Python中暂存上传图片的方法
Feb 18 Python
讲解Python中的递归函数
Apr 27 Python
python实现判断数组是否包含指定元素的方法
Jul 15 Python
python如何获取服务器硬件信息
May 11 Python
Python实现简易版的Web服务器(推荐)
Jan 29 Python
详解python字节码
Feb 07 Python
python2.7实现邮件发送功能
Dec 12 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
pandas进行数据输入和输出的方法详解
Mar 23 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
透析PHP的配置文件php.ini
2006/10/09 PHP
PHP服务器页面间跳转实现方法
2012/08/02 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
浅谈php中include文件变量作用域
2015/06/18 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
jQuery中animate的几种用法与注意事项
2016/12/12 Javascript
axios的拦截请求与响应方法
2018/08/11 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
Python中datetime模块参考手册
2017/01/13 Python
Python在不同目录下导入模块的实现方法
2017/10/27 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
python邮件发送smtplib使用详解
2020/06/16 Python
pytorch构建多模型实例
2020/01/15 Python
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
水电工岗位职责
2014/02/12 职场文书
房地产财务部员工岗位职责
2014/03/12 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
亚布力滑雪场导游词
2015/02/09 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android
德劲DE1105机评
2022/04/05 无线电