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基础教程之缩进介绍
Aug 29 Python
Python写入数据到MP3文件中的方法
Jul 10 Python
Python递归函数定义与用法示例
Jun 02 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 Python
浅析python参数的知识点
Dec 10 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 Python
Python3 串口接收与发送16进制数据包的实例
Jun 12 Python
python3中利用filter函数输出小于某个数的所有回文数实例
Nov 24 Python
python numpy 矩阵堆叠实例
Jan 17 Python
Python3 pywin32模块安装的详细步骤
May 26 Python
django rest framework 过滤时间操作
Jul 12 Python
python中 Flask Web 表单的使用方法
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
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
2018/05/23 PHP
清除网页历史记录,屏蔽后退按钮!
2008/12/22 Javascript
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
easyui validatebox验证
2016/04/29 Javascript
JavaScript中的操作符类型转换示例总结
2016/05/30 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
2017/09/11 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
深入理解Python中的内置常量
2017/05/20 Python
python添加模块搜索路径方法
2017/09/11 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
2018/01/04 Python
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
python正则表达式之对号入座篇
2018/07/24 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
基于python检查矩阵计算结果
2020/05/21 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
师范应届生语文教师求职信
2013/10/29 职场文书
成绩单公证书
2014/04/10 职场文书
就业协议书
2014/09/12 职场文书
2015年驾驶员工作总结
2015/04/29 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js