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 相关文章推荐
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
Python和Java进行DES加密和解密的实例
Jan 09 Python
python实现贪吃蛇游戏
Mar 21 Python
Python面向对象思想与应用入门教程【类与对象】
Apr 12 Python
python实现机器人卡牌
Oct 06 Python
python运用sklearn实现KNN分类算法
Oct 16 Python
python文件操作的简单方法总结
Nov 07 Python
Python连接SQLite数据库并进行增册改查操作方法详解
Feb 18 Python
Django admin 实现search_fields精确查询实例
Mar 30 Python
tensorflow常用函数API介绍
Apr 19 Python
深入浅析python3 依赖倒置原则(示例代码)
Jul 09 Python
OpenCV 图像梯度的实现方法
Jul 25 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 select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
php-7.3.6 编译安装过程
2020/02/11 PHP
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
javascript结合canvas实现图片旋转效果
2015/05/03 Javascript
jQuery Validate表单验证入门学习
2015/12/18 Javascript
jQuery实现模仿微博下拉滚动条加载数据效果
2015/12/25 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
python中threading超线程用法实例分析
2015/05/16 Python
python中requests使用代理proxies方法介绍
2017/10/25 Python
Python SVM(支持向量机)实现方法完整示例
2018/06/19 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
django 控制页面跳转的例子
2019/08/06 Python
python查看数据类型的方法
2019/10/12 Python
判断Threading.start新线程是否执行完毕的实例
2020/05/02 Python
初学者学习Python好还是Java好
2020/05/26 Python
python属于哪种语言
2020/08/16 Python
python 读取串口数据的示例
2020/11/09 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
HTML5中的网络存储实现方式
2020/04/28 HTML / CSS
大学毕业生简单自荐信
2013/11/05 职场文书
英文自荐信常用句子
2014/03/26 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP