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写入CSV文件的方法
Jul 08 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
Jun 23 Python
Python随机读取文件实现实例
May 25 Python
利用Python将数值型特征进行离散化操作的方法
Nov 06 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
Python实现获取系统临时目录及临时文件的方法示例
Jun 26 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
Apr 19 Python
python列表的逆序遍历实现
Apr 20 Python
全网最详细的PyCharm+Anaconda的安装过程图解
Jan 25 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
php 连接mysql连接被重置的解决方法
2011/02/15 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
通过AngularJS实现图片上传及缩略图展示示例
2017/01/03 Javascript
微信小程序实现点击返回顶层的方法
2017/07/12 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
2018/06/22 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
如何基于python实现归一化处理
2020/01/20 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
html5基础标签(html5视频标签 html5新标签用法)
2013/12/30 HTML / CSS
平面设计的岗位职责
2013/11/08 职场文书
大学生职业规划前言模板
2013/12/27 职场文书
小学生学习感言
2014/03/10 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
三峡人家导游词
2015/01/31 职场文书
家长对孩子的寄语
2015/02/26 职场文书
病危通知书样本
2015/04/17 职场文书
Python中文纠错的简单实现
2021/07/07 Python
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
2022/04/08 Java/Android