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常用内置函数总结
Feb 08 Python
python创建关联数组(字典)的方法
May 04 Python
python获取当前时间对应unix时间戳的方法
May 15 Python
python脚本设置超时机制系统时间的方法
Feb 21 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
在Python中使用defaultdict初始化字典以及应用方法
Oct 31 Python
python处理两种分隔符的数据集方法
Dec 12 Python
Python远程视频监控程序的实例代码
May 05 Python
django框架使用方法详解
Jul 18 Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 Python
pycharm debug 断点调试心得分享
Apr 16 Python
Windows安装Anaconda3的方法及使用过程详解
Jun 11 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
B2K与车机的中波PK
2021/03/02 无线电
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
yii2安装详细流程
2018/05/23 PHP
javascript 浏览器检测代码精简版
2010/03/04 Javascript
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
Vue.js实战之组件的进阶
2017/04/04 Javascript
MUI  Scroll插件的使用详解
2017/04/13 Javascript
基于ES6 Array.of的用法(实例讲解)
2017/09/05 Javascript
vue项目中跳转到外部链接的实例讲解
2018/09/20 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
vue中使用better-scroll实现滑动效果及注意事项
2018/11/15 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
Python IDLE清空窗口的实例
2018/06/25 Python
Python爬虫常用库的安装及其环境配置
2018/09/19 Python
pyqt5 使用label控件实时显示时间的实例
2019/06/14 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
2020/07/07 Python
python如何删除列为空的行
2020/07/17 Python
英国天然宝石首饰购买网站:Gemondo Jewellery
2018/10/23 全球购物
前台文员我鉴定
2014/01/12 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
党员群众路线自我剖析材料
2014/10/06 职场文书
幼儿园辞职书
2015/02/26 职场文书
2015年感恩父亲节活动策划方案
2015/05/05 职场文书
郭明义观后感
2015/06/08 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
详细介绍python操作RabbitMq
2022/04/12 Python
Java 数组的使用
2022/05/11 Java/Android