在那个电子产品比较匮乏的年代,小游戏机

还是为数不多的游戏类电子产品,对小孩子更是有着不可抗拒的魔力,在当时如果哪个小孩买了一个小游戏机,大伙一定迅速围上去...

俄罗斯方块作为其中一款小游戏,尽管规则简单、只有黑白双色,但其对当时游戏玩家的影响丝毫不亚于 LOL、农药、吃鸡对现在游戏玩家的影响,下面我们来看一下如何用 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 >= MainBoard.BoardWidth or y < 0 or y >= MainBoard.BoardHeight:

return False

if self.shapeAt(x, y) != ShapeForm.NoShape:

return False

self.curPiece = newPiece

self.curX = newX

self.curY = newY

self.update()

return True

➢ 计时器事件def timerEvent(self, event):

if event.timerId() == self.timer.timerId():

if self.isWaitingAfterLine:

self.isWaitingAfterLine = False

self.newPiece()

else:

self.oneLineDown()

else:

super(MainBoard, self).timerEvent(event)

➢ 开始和暂停def start(self):

if self.isPaused:

return

self.isStarted = True

self.isWaitingAfterLine = False

self.numLinesRemoved = 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 = 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 = MainBoard(self)

self.setCentralWidget(self.tboard)

self.statusbar = self.statusBar()

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

self.tboard.start()

self.resize(300, 500)

self.center()

self.setWindowTitle('俄罗斯方块')

self.show()

def center(self):

screen = QDesktopWidget().screenGeometry()

size = self.geometry()

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

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

启动if __name__ == '__main__':

app = QApplication([])

tetris = Tetris()

sys.exit(app.exec_())

最终效果

打包

为了方便运行,我们将 Python 文件打成 exe 文件,用到的插件为 pyinstaller。

首先,安装 pyinstaller,使用 pip install pyinstaller 即可。 安装完成后,在文件目录

打开命令窗口,在命令窗口执行命令 pyinstaller --onefile --nowindowed --icon="C:\Users\LE\Desktop\tetris\tetris.ico" tetris.py 即可。执行完成后,我们到 dist 目录下

即可找到生成的 exe 文件。

源码在公众号 Python小二 后台回复 g1 获取。

python俄罗斯方块小游戏实验报告_用Python实现童年小游戏俄罗斯方块相关推荐

  1. python爬虫豆瓣评论实验报告_用python实现豆瓣短评通用爬虫(登录、爬取、可视化分析)...

    原创技术公众号:bigsai 前言 在本人上的一门课中,老师对每个小组有个任务要求,介绍和完成一个小模块.工具知识的使用.然而我所在的组刚好遇到的是python爬虫的小课题. 心想这不是很简单嘛,搞啥 ...

  2. python链表和树实验报告_关于Python实现树结构和链表结构的一点想法

    关于Python实现树结构和链表结构的一点想法 Python由于内置的数据结构具有很高的灵活性,所以可以用很多种方式来构建树.图.链表等结构 1. 树的Python实现 python自然可以使用cla ...

  3. python学生成绩管理系统实验报告_【python 学生信息管理系统】

    1. 简述 本文讲述的是用 python 语言写一个简单的学生信息管理系统,系统包含学生信息的增删查改功.同时使用了 mysql5.7.14 来存储数据. 2.准备工作 首先,先搭建好自己的 MySQ ...

  4. python贪吃蛇的实验报告_贪吃蛇游戏课程设计实验报告

    DOC 可编辑修改 -------- 为你整理各种最新最全办公范文 -------- 双击可以删除 爱心 --- 用心 --- 恒心 贪吃蛇游戏课程设计实验报告 辽 宁 科 技 大 学 课程设计说明书 ...

  5. python链表和树实验报告_数据结构树和森林实验报告

    _ 树和森林应用实验 实验报告 实验目的 ( 1) 掌握树和森林的二叉链表表示方法. (2) 掌握树和二叉树的结构及算法之间的对应关系. (3) 掌握树的两种遍历算法及其应用. 实验运行环境 Visu ...

  6. python数据分析实验报告_用Python处理实验数据

    开篇语 近来忙于考试以及应付专业课,基本很少写简书了.昨晚攻坚了三个学生工作的任务(妈妈的吻.好久没有这么疯狂工作了.还是很爽的哦!) 只恨这张图没有标记时间,其实已经是十二点四十多了 今天难得清静, ...

  7. java小学期实验报告_小学期实习心得

    1.小学期实践报告如何写? 关于"实践报告"的范文找到一些,专小学的找不到属 http://www.levelpad.com/system/plus/search.php?kwty ...

  8. python名片管理器实验报告_名片管理系统——实验报告.doc

    名片管理系统--实验报告 网上名片管理系统 数据库和表的建立:(在MySQL中创建数据库test,并在test数据库中建立card.user和recycle表格,其中card和recycle具有相同的 ...

  9. python弹球游戏实验报告_弹珠小游戏课程设计实验报告

    摘要: 这个小程序是关于弹珠的小游戏, 游戏比较简单, 以小球的速度来区分游戏的难易. 该小程序是用左右键控制游戏的开始和挡板的方向,不让小球落到底端,当然,小球的 速度越快,该游戏的难度也就越大.此 ...

  10. python数据分析实验报告_使用 Python 3 进行气象数据分析

    项目简介 :本实验将对意大利北部沿海地区的气象数据进行分析与可视化.我们在实验过程中先会运用 Python 中 matplotlib 库的对数据进行图表化处理,最终在图表分析的支持下得出我们的结论. ...

最新文章

  1. 在虚拟机中温习DOS
  2. remote_os_authent参数测试!
  3. 苹果公司的新的编程语言 Swift 高级语言()两--基本数据类型
  4. Hostonly cookie是什么鬼?
  5. 5月8日全国软考办专家做客51CTO谈:软考政策、考前复习方法及考场技巧
  6. 贫穷是我们变得牛逼的动力
  7. 用HTML5的DOCTYPE标签兼容各版本IE浏览器的方法技术
  8. 零基础30天入门Python教程第6节:数据结构
  9. STM8S103之tim4普通定时器
  10. 哈工大教授车万翔「自然语言处理中的伪数据」
  11. java中math.ceil用法_[Java教程]关于Math类的round、floor、ceil三个方法
  12. 护照阅读器助力港珠澳大桥拓展大湾区
  13. iPhone内存比Android手机小,iPhone内存为什么一直这么小
  14. 谈谈卷积神经网络和循环神经网络
  15. python实现百度新闻爬取并存入数据库(二)
  16. 计算机中负数和正数的二进制表示
  17. Facebook灰度手势识别论文笔记
  18. 后端工程师之路(4)GIT工具的使用与介绍
  19. 她一生三任伴侣,三次流产,却被誉为坠落凡间的天使,优雅到老
  20. ASP.NET 母版页

热门文章

  1. Leetcode0720. 词典中最长的单词(simple)
  2. 纪录片:互联网之子 亚伦·斯沃茨的故事
  3. 最佳量化交易的计算机操作系统
  4. 跑步到底伤不伤膝盖?励建安教授给你权威解答
  5. 触屏java版象棋下载 游戏下载安装,天天象棋下载手机版
  6. 扒一扒那些叫欧拉的定理们(九)——群论观点下的欧拉公式初步
  7. C语言中write函数
  8. 使用pyautogui库实现简单的微信朋友圈自动点赞
  9. 桌面图标有阴影的解决方法
  10. /etc/fstab详细参数配置