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 yield使用方法示例
Dec 04 Python
简单介绍Python中的JSON模块
Apr 08 Python
python实现基本进制转换的方法
Jul 11 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
python merge、concat合并数据集的实例讲解
Apr 12 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
python实现祝福弹窗效果
Apr 07 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 Python
python删除某个目录文件夹的方法
May 26 Python
python自动化办公操作PPT的实现
Feb 05 Python
python基于tkinter制作下班倒计时工具
Apr 28 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开发工具之vs2005图解
2008/01/12 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
Swoole实现异步投递task任务案例详解
2019/04/02 PHP
php实现登录页面的简单实例
2019/09/29 PHP
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
2009/04/24 Javascript
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
Python Web服务器Tornado使用小结
2014/05/06 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
Python for循环中的陷阱详解
2018/07/13 Python
Python爬虫常用库的安装及其环境配置
2018/09/19 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
2019/06/21 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
python实现图像全景拼接
2020/03/27 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
Python使用openpyxl复制整张sheet
2021/03/24 Python
霸气押韵的班级口号
2014/06/09 职场文书
解除劳动合同协议书
2014/09/17 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python
win10更新失败无限重启解决方法
2022/04/19 数码科技