Python完整实现俄罗斯方块游戏全解
作者:是梦吧,是你吧! 时间:2022-10-23 16:52:52
1 俄罗斯方块游戏
《俄罗斯方块》原本是前苏联科学家阿列克谢·帕基特诺夫所开发的教育用软件,之后开始提供授权给各个游戏公司,造成各平台上软件大量发行的现象。
Game Boy版的俄罗斯方块在日本卖出424万套,是Game Boy史上卖最好的游戏。海湾战争时,也是前线美军最常拿消磨时间的游戏之一。
由于俄罗斯方块具有的数学性、动态性与知名度,也经常拿来作为游戏程序设计的练习题材。
2 Python代码实现
2.1 展现
2.2 Python代码
import os
import sys
import random
from modules import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
#=============定义俄罗斯方块游戏类==============
class TetrisGame(QMainWindow):
def __init__(self, parent=None):
super(TetrisGame, self).__init__(parent)
# 是否暂停ing
self.is_paused = False
# 是否开始ing
self.is_started = False
self.initUI()
#===========界面初始化===============
def initUI(self):
# icon
self.setWindowIcon(QIcon(os.path.join(os.getcwd(), 'resources/icon.jpg')))
# 块大小
self.grid_size = 22
# 游戏帧率
self.fps = 200
self.timer = QBasicTimer()
# 焦点
self.setFocusPolicy(Qt.StrongFocus)
# 水平布局
layout_horizontal = QHBoxLayout()
self.inner_board = InnerBoard()
self.external_board = ExternalBoard(self, self.grid_size, self.inner_board)
layout_horizontal.addWidget(self.external_board)
self.side_panel = SidePanel(self, self.grid_size, self.inner_board)
layout_horizontal.addWidget(self.side_panel)
self.status_bar = self.statusBar()
self.external_board.score_signal[str].connect(self.status_bar.showMessage)
self.start()
self.center()
self.setWindowTitle('Tetris —— 九歌')
self.show()
self.setFixedSize(self.external_board.width() + self.side_panel.width(), self.side_panel.height() + self.status_bar.height())
#=============游戏界面移动到屏幕中间=======================
def center(self):
screen = QDesktopWidget().screenGeometry()
size = self.geometry()
self.move((screen.width() - size.width()) // 2, (screen.height() - size.height()) // 2)
#==================更新界面==============
def updateWindow(self):
self.external_board.updateData()
self.side_panel.updateData()
self.update()
#========开始================
def start(self):
if self.is_started:
return
self.is_started = True
self.inner_board.createNewTetris()
self.timer.start(self.fps, self)
#==========暂停/不暂停===============
def pause(self):
if not self.is_started:
return
self.is_paused = not self.is_paused
if self.is_paused:
self.timer.stop()
self.external_board.score_signal.emit('Paused')
else:
self.timer.start(self.fps, self)
self.updateWindow()
#============计时器事件=================
def timerEvent(self, event):
if event.timerId() == self.timer.timerId():
removed_lines = self.inner_board.moveDown()
self.external_board.score += removed_lines
self.updateWindow()
else:
super(TetrisGame, self).timerEvent(event)
#=================按键事件====================
def keyPressEvent(self, event):
if not self.is_started or self.inner_board.current_tetris == tetrisShape().shape_empty:
super(TetrisGame, self).keyPressEvent(event)
return
key = event.key()
# P键暂停
if key == Qt.Key_P:
self.pause()
return
if self.is_paused:
return
# 向左
elif key == Qt.Key_Left:
self.inner_board.moveLeft()
# 向右
elif key == Qt.Key_Right:
self.inner_board.moveRight()
# 旋转
elif key == Qt.Key_Up:
self.inner_board.rotateAnticlockwise()
# 快速坠落
elif key == Qt.Key_Space:
self.external_board.score += self.inner_board.dropDown()
else:
super(TetrisGame, self).keyPressEvent(event)
self.updateWindow()
#==========运行===================
if __name__ == '__main__':
app = QApplication([])
tetris = TetrisGame()
sys.exit(app.exec_())
来源:https://blog.csdn.net/weixin_46039719/article/details/123284718
标签:Python,俄罗斯方块,游戏
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
如何利用SQL Server来发送电子发邮件?
2010-01-01 15:37:00
在python中list作函数形参,防止被实参修改的实现方法
2022-11-15 19:27:25
![](https://img.aspxhome.com/file/2023/7/87777_0s.jpg)
TensorFlow人工智能学习创建数据实现示例详解
2022-04-20 12:58:27
![](https://img.aspxhome.com/file/2023/6/66796_0s.png)
常用python数据类型转换函数总结
2023-07-27 23:07:16
python爬取微博评论的实例讲解
2022-01-10 19:53:14
Python备份Mysql脚本
2024-01-16 05:19:28
python爬虫爬取图片的简单代码
2021-08-04 10:19:27
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2024-04-19 10:13:30
![](https://img.aspxhome.com/file/2023/4/135884_0s.jpg)
vue.js使用v-if实现显示与隐藏功能示例
2024-05-02 16:59:50
![](https://img.aspxhome.com/file/2023/2/130082_0s.png)
详解MySQL的Seconds_Behind_Master
2024-01-18 04:58:00
BootStrap Select清除选中的状态恢复默认状态
2024-04-28 09:42:05
![](https://img.aspxhome.com/file/2023/8/132818_0s.png)
Golang range slice 与range array 之间的区别
2024-05-21 10:26:31
![](https://img.aspxhome.com/file/2023/8/123968_0s.png)
MySQL数据库设置远程访问权限方法小结
2024-01-16 11:12:24
vue 实现特定条件下绑定事件
2023-07-02 16:39:42
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2021-12-14 17:30:24
![](https://img.aspxhome.com/file/2023/6/107496_0s.png)
关于ASP循环表格的问题之解答[比较详细]
2011-04-08 11:14:00
网页设计十大诀窍
2007-10-19 13:03:00
SQL Server中应当怎样得到自动编号字段
2009-01-15 12:48:00
golang中set数据结构的使用示例
2024-02-17 22:06:19
利用python实现可视化大屏
2023-08-17 17:29:17
![](https://img.aspxhome.com/file/2023/9/65489_0s.png)