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 解析XML python模块xml.dom解析xml实例代码
Feb 07 Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 Python
Python上下文管理器和with块详解
Sep 09 Python
django项目搭建与Session使用详解
Oct 10 Python
python kafka 多线程消费者&手动提交实例
Dec 21 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
Jan 14 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
Feb 15 Python
Django更新models数据库结构步骤
Apr 01 Python
jupyter notebook 的工作空间设置操作
Apr 20 Python
使用python实现微信小程序自动签到功能
Apr 27 Python
去除python中的字符串空格的简单方法
Dec 22 Python
Python学习之异常中的finally使用详解
Mar 16 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中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
JavaScript学习历程和心得小结
2010/08/16 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
前端Electron新手入门教程详解
2019/06/21 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
2020/08/19 Javascript
Python格式化压缩后的JS文件的方法
2015/03/05 Python
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
Python实现自动添加脚本头信息的示例代码
2016/09/02 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
python中import与from方法总结(推荐)
2019/03/21 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
大学生就业自荐书
2014/06/16 职场文书
国际贸易系求职信
2014/08/09 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
借款民事起诉状范文
2015/05/19 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL