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之让人欢喜让人忧的迭代
Oct 02 Python
Python 列表list使用介绍
Nov 30 Python
Python实现的数据结构与算法之链表详解
Apr 22 Python
Python SQL查询并生成json文件操作示例
Aug 17 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
浅谈python的输入输出,注释,基本数据类型
Apr 02 Python
Python寻找路径和查找文件路径的示例
Jul 10 Python
Python的互斥锁与信号量详解
Sep 12 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
tensorflow模型保存、加载之变量重命名实例
Jan 21 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
Dec 01 Python
Python爬取酷狗MP3音频的步骤
Feb 26 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
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
2013/05/08 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
Javascript开发之三数组对象实例介绍
2012/11/12 Javascript
JavaScript栏目列表隐藏/显示简单实现
2013/04/03 Javascript
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
javascript实现瀑布流加载图片原理
2016/02/02 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
Django rest framework基本介绍与代码示例
2018/01/26 Python
Python装饰器原理与用法分析
2018/04/30 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
优秀毕业生事迹材料
2014/02/12 职场文书
三八妇女节活动总结
2014/05/04 职场文书
办理收楼委托书范本
2014/10/09 职场文书
大学生上课迟到检讨书
2014/10/15 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
2016年教师党员创先争优承诺书
2016/03/24 职场文书
Python基础之进程详解
2021/05/21 Python
Java实现多文件上传功能
2021/06/30 Java/Android
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技
SQL Server 中的事务介绍
2022/05/20 SQL Server