Python完整实现俄罗斯方块游戏全解

作者:是梦吧,是你吧! 时间:2022-10-23 16:52:52 

1 俄罗斯方块游戏

《俄罗斯方块》原本是前苏联科学家阿列克谢·帕基特诺夫所开发的教育用软件,之后开始提供授权给各个游戏公司,造成各平台上软件大量发行的现象。

Game Boy版的俄罗斯方块在日本卖出424万套,是Game Boy史上卖最好的游戏。海湾战争时,也是前线美军最常拿消磨时间的游戏之一。

由于俄罗斯方块具有的数学性、动态性与知名度,也经常拿来作为游戏程序设计的练习题材。

2 Python代码实现 

2.1 展现

Python完整实现俄罗斯方块游戏全解

Python完整实现俄罗斯方块游戏全解

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,俄罗斯方块,游戏
0
投稿

猜你喜欢

  • 如何利用SQL Server来发送电子发邮件?

    2010-01-01 15:37:00
  • 在python中list作函数形参,防止被实参修改的实现方法

    2022-11-15 19:27:25
  • TensorFlow人工智能学习创建数据实现示例详解

    2022-04-20 12:58:27
  • 常用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
  • vue.js使用v-if实现显示与隐藏功能示例

    2024-05-02 16:59:50
  • 详解MySQL的Seconds_Behind_Master

    2024-01-18 04:58:00
  • BootStrap Select清除选中的状态恢复默认状态

    2024-04-28 09:42:05
  • Golang range slice 与range array 之间的区别

    2024-05-21 10:26:31
  • MySQL数据库设置远程访问权限方法小结

    2024-01-16 11:12:24
  • vue 实现特定条件下绑定事件

    2023-07-02 16:39:42
  • Python高级编程之消息队列(Queue)与进程池(Pool)实例详解

    2021-12-14 17:30:24
  • 关于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
  • asp之家 网络编程 m.aspxhome.com