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使用tablib生成excel文件的简单实现方法
Mar 16 Python
django限制匿名用户访问及重定向的方法实例
Feb 07 Python
python队列queue模块详解
Apr 27 Python
解决pycharm安装后代码区不能编辑的问题
Oct 28 Python
Python实现打砖块小游戏代码实例
May 18 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
python画图把时间作为横坐标的方法
Jul 07 Python
django中related_name的用法说明
May 20 Python
详解用Python爬虫获取百度企业信用中企业基本信息
Jul 02 Python
Python包资源下载路径报404解决方案
Nov 05 Python
python中scrapy处理项目数据的实例分析
Nov 22 Python
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
May 04 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处理json时中文问题的解决方法
2011/04/12 PHP
PHP传参之传值与传址的区别
2015/04/24 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
php中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
JavaScript脚本库编写的方法
2015/12/09 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
Vue在页面右上角实现可悬浮/隐藏的系统菜单
2018/05/04 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
微信小程序实现页面监听自定义组件的触发事件
2020/11/01 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
代码总结Python2 和 Python3 字符串的区别
2020/01/28 Python
在服务器上安装python3.8.2环境的教程详解
2020/04/26 Python
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
北承题目(C++)
2012/05/16 面试题
教师找工作推荐信
2013/11/23 职场文书
财政局长自荐信范文
2013/12/22 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
个人剖析材料范文
2014/09/30 职场文书
未婚证明格式
2015/06/15 职场文书
golang日志包logger的用法详解
2021/05/05 Golang
微信小程序实现录音Record功能
2021/05/09 Javascript
使用python生成大量数据写入es数据库并查询操作(2)
2022/09/23 Python