Python实现简单的俄罗斯方块游戏

作者:红目香薰 时间:2022-11-17 16:56:58 

本文实例为大家分享了Python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下

玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速的。

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()

'''run'''
if __name__ == '__main__':
   app = QApplication([])
   tetris = TetrisGame()
   sys.exit(app.exec_())

来源:https://laoshifu.blog.csdn.net/article/details/120425285

标签:Python,俄罗斯方块
0
投稿

猜你喜欢

  • 解决django框架model中外键不落实到数据库问题

    2024-01-13 20:36:12
  • ASP XML制作菜单管理程序

    2011-04-04 11:15:00
  • python基础之函数的返回值

    2022-10-23 23:17:06
  • Vue ElementUI之Form表单验证遇到的问题

    2023-07-02 16:56:54
  • Python二分法搜索算法实例分析

    2023-11-01 13:13:15
  • 可以自动轮换的页签 tabs

    2008-02-21 12:25:00
  • 如何使用Python实现名片管理系统

    2022-11-24 03:13:09
  • Python中遇到的小问题及解决方法汇总

    2023-10-14 04:58:35
  • laravel中短信发送验证码的实现方法

    2023-11-15 08:05:16
  • Python多进程编程multiprocessing代码实例

    2022-11-20 20:25:51
  • 使用Python制作一个简易的远控终端

    2022-03-29 21:04:12
  • mysql中如何查看表空间

    2024-01-27 00:25:25
  • 使用pyecharts生成Echarts网页的实例

    2023-02-22 10:19:42
  • 关于 Python json中load和loads区别

    2021-04-24 20:30:51
  • SQL Server密码管理的六个危险判断

    2008-10-23 13:57:00
  • Python实现注册登录功能

    2023-09-07 22:24:50
  • sqlserver/mysql按天、按小时、按分钟统计连续时间段数据【推荐】

    2024-01-27 14:23:20
  • python filecmp.dircmp实现递归比对两个目录的方法

    2021-10-11 10:22:29
  • python学习之matplotlib绘制散点图实例

    2021-02-22 21:28:22
  • SQL语句练习实例之七 剔除不需要的记录行

    2011-11-03 16:50:51
  • asp之家 网络编程 m.aspxhome.com