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


Posted in Python onSeptember 25, 2021

本文实例为大家分享了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_())

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中比较特别的除法运算和幂运算介绍
Apr 05 Python
详细介绍Python中的偏函数
Apr 27 Python
Django中更改默认数据库为mysql的方法示例
Dec 05 Python
正确理解Python中if __name__ == '__main__'
Jan 24 Python
django使用admin站点上传图片的实例
Jul 28 Python
pytorch 归一化与反归一化实例
Dec 31 Python
解决Python import docx出错DLL load failed的问题
Feb 13 Python
python代码中怎么换行
Jun 17 Python
python实现梯度下降算法的实例详解
Aug 17 Python
pandas按条件筛选数据的实现
Feb 20 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 Python
Python使用BeautifulSoup4修改网页内容
May 20 Python
Python实现滑雪小游戏
利用python实时刷新基金估值(摸鱼小工具)
Sep 15 #Python
Python极值整数的边界探讨分析
Sep 15 #Python
Python办公自动化PPT批量转换操作
Sep 15 #Python
Python办公自动化解决world文件批量转换
Sep 15 #Python
Python函数式编程中itertools模块详解
Sep 15 #Python
Python编程中Python与GIL互斥锁关系作用分析
Sep 15 #Python
You might like
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
PHP实现链式操作的原理详解
2016/09/16 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
JavaScript SHA512加密算法详细代码
2016/10/06 Javascript
Vue 拦截器对token过期处理方法
2018/01/23 Javascript
node实现登录图片验证码的示例代码
2018/04/20 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
2020/08/19 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
深入讲解Python中的迭代器和生成器
2015/10/26 Python
Python django实现简单的邮件系统发送邮件功能
2017/07/14 Python
python中验证码连通域分割的方法详解
2018/06/04 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
工地例会施工汇报材料
2014/08/22 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
2014年残联工作总结
2014/11/21 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
毕业生个人自荐书
2015/03/05 职场文书
检讨书格式范文
2015/05/07 职场文书
高中议论文(范文2篇)
2019/08/19 职场文书