热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python做俄罗斯方块手机版下载_小游戏|用Python实现俄罗斯方块

游戏规则:由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的

游戏规则:

由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。

环境

操作系统:Windows

Python 版本:3.6

涉及模块:sys、random、PyQt5

实现

首先安装第三方模块 PyQt5,使用

pip install PyQt5 即可。

游戏主界面

实现代码

from PyQt5.QtWidgets import *

from PyQt5.QtCore import *

import sys

class MainBoard(QFrame):

msg = pyqtSignal(str)

BoardWidth = 10

BoardHeight = 22

Speed = 300

def __init__(self, parent):

super().__init__(parent)

self.initBoard()

def initBoard(self):

self.timer = QBasicTimer()

self.isWaitingAfterLine = False

self.curX = 0

self.curY = 0

self.numLinesRemoved = 0

self.board = []

self.setFocusPolicy(Qt.StrongFocus)

self.isStarted = False

self.isPaused = False

小板块

定义小版块的形状

class ShapeForm(object):

NoShape = 0

ZShape = 1

SShape = 2

LineShape = 3

TShape = 4

SquareShape = 5

LShape = 6

MirroredLShape = 7

class Shape(object):

coordsTable = (

((0, 0),     (0, 0),     (0, 0),     (0, 0)),

((0, -1),    (0, 0),     (-1, 0),    (-1, 1)),

((0, -1),    (0, 0),     (1, 0),     (1, 1)),

((0, -1),    (0, 0),     (0, 1),     (0, 2)),

((-1, 0),    (0, 0),     (1, 0),     (0, 1)),

((0, 0),     (1, 0),     (0, 1),     (1, 1)),

((-1, -1),   (0, -1),    (0, 0),     (0, 1)),

((1, -1),    (0, -1),    (0, 0),     (0, 1))

)

def __init__(self):

self.coords = [[0,0] for i in range(4)]

self.pieceShape = ShapeForm.NoShape

self.setShape(ShapeForm.NoShape)

画出图形

def drawSquare(self, painter, x, y, shape):

colorTable = [0x000000, 0xCC6666, 0x66CC66, 0x6666CC,

0xCCCC66, 0xCC66CC, 0x66CCCC, 0xDAAA00]

color = QColor(colorTable[shape])

painter.fillRect(x + 1, y + 1, self.squareWidth() - 2,

self.squareHeight() - 2, color)

painter.setPen(color.lighter())

painter.drawLine(x, y + self.squareHeight() - 1, x, y)

painter.drawLine(x, y, x + self.squareWidth() - 1, y)

painter.setPen(color.darker())

painter.drawLine(x + 1, y + self.squareHeight() - 1,

x + self.squareWidth() - 1, y + self.squareHeight() - 1)

painter.drawLine(x + self.squareWidth() - 1,

y + self.squareHeight() - 1, x + self.squareWidth() - 1, y + 1)

按键事件

def keyPressEvent(self, event):

if not self.isStarted or self.curPiece.shape() == ShapeForm.NoShape:

super(MainBoard, self).keyPressEvent(event)

return

key = event.key()

if key == Qt.Key_P:

self.pause()

return

if self.isPaused:

return

elif key == Qt.Key_Left:

self.tryMove(self.curPiece, self.curX - 1, self.curY)

elif key == Qt.Key_Right:

self.tryMove(self.curPiece, self.curX + 1, self.curY)

elif key == Qt.Key_Down:

self.tryMove(self.curPiece.rotateRight(), self.curX, self.curY)

elif key == Qt.Key_Up:

self.tryMove(self.curPiece.rotateLeft(), self.curX, self.curY)

elif key == Qt.Key_Space:

self.dropDown()

elif key == Qt.Key_D:

self.oneLineDown()

else:

super(MainBoard, self).keyPressEvent(event)

def tryMove(self, newPiece, newX, newY):

for i in range(4):

x = newX + newPiece.x(i)

y = newY - newPiece.y(i)

if x <0 or x >&#61; MainBoard.BoardWidth or y <0 or y >&#61; MainBoard.BoardHeight:

return False

if self.shapeAt(x, y) !&#61; ShapeForm.NoShape:

return False

self.curPiece &#61; newPiece

self.curX &#61; newX

self.curY &#61; newY

self.update()

return True

计算器事件

def timerEvent(self, event):

if event.timerId() &#61;&#61; self.timer.timerId():

if self.isWaitingAfterLine:

self.isWaitingAfterLine &#61; False

self.newPiece()

else:

self.oneLineDown()

else:

super(MainBoard, self).timerEvent(event)

开始和暂停

def start(self):

if self.isPaused:

return

self.isStarted &#61; True

self.isWaitingAfterLine &#61; False

self.numLinesRemoved &#61; 0

self.clearBoard()

self.msg.emit(str(self.numLinesRemoved))

self.newPiece()

self.timer.start(MainBoard.Speed, self)

def pause(self):

if not self.isStarted:

return

self.isPaused &#61; not self.isPaused

if self.isPaused:

self.timer.stop()

self.msg.emit("paused")

else:

self.timer.start(MainBoard.Speed, self)

self.msg.emit(str(self.numLinesRemoved))

self.update()

游戏类及初始化

class Tetris(QMainWindow):

def __init__(self):

super().__init__()

self.initUI()

def initUI(self):

self.tboard &#61; MainBoard(self)

self.setCentralWidget(self.tboard)

self.statusbar &#61; self.statusBar()

self.tboard.msg[str].connect(self.statusbar.showMessage)

self.tboard.start()

self.resize(300, 500)

self.center()

self.setWindowTitle(&#39;俄罗斯方块&#39;)

self.show()

def center(self):

screen &#61; QDesktopWidget().screenGeometry()

size &#61; self.geometry()

self.move((screen.width()-size.width())/2,

(screen.height()-size.height())/2)

启动

if __name__ &#61;&#61; &#39;__main__&#39;:

app &#61; QApplication([])

tetris &#61; Tetris()

sys.exit(app.exec_())



推荐阅读
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • WPF之Binding初探
      初学wpf,经常被Binding搞晕,以下记录写Binding的基础。首先,盗用张图。这图形象的说明了Binding的机理。对于Binding,意思是数据绑定,基本用法是:1、 ... [详细]
  • Server Installation for Jitsi Meet
    2019独角兽企业重金招聘Python工程师标准ServerInstallationforJitsiMeetThisdescribesconfiguringaserverji ... [详细]
  • 当焦点位于文本框的自动完成框时,禁用键事件在我的项目中有一个FormmainForm,其中有两个textBoxestxtUserName和txtPassword以及一个按钮btnL ... [详细]
  • button进阶1.等级3的时候学习了用Grid(网格)布局排列。这次是button背景的引用学习圆角button。我发现学代码难的原因就是英语不好不懂什么意思。设置focysable属性为 ... [详细]
  • phpgettext.dll的简单介绍
    本文目录一览:1、在php.ini中设置了extension=php_gettext.dl ... [详细]
  • .NET最新漏洞CVE20178759 POC已公布,大规模攻击即将来临
    图世界范围内感染FinSpy图(即漏洞利用导致下载的间谍程序)前天微软刚补好的漏洞,昨天fireeye发文,然后各平台开始写 ... [详细]
  • nvm如何改node默认版本
    小编给大家分享一下nvm如何改node默认版本,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!nvm改node默认版 ... [详细]
  • Problemexplanation: ... [详细]
author-avatar
长大的夜夜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有