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实现中文输出的两种方法
May 09 Python
python opencv实现运动检测
Jul 10 Python
python去重,一个由dict组成的list的去重示例
Jan 21 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
python 读写文件包含多种编码格式的解决方式
Dec 20 Python
基于打开pycharm有带图片md文件卡死问题的解决
Apr 24 Python
Jupyter notebook如何实现指定浏览器打开
May 13 Python
Python绘制动态水球图过程详解
Jun 03 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
python创建字典及相关管理操作
Apr 13 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一些公用函数的集合
2008/03/27 PHP
PHP自定义错误用法示例
2016/09/28 PHP
PHP实现的策略模式示例
2019/03/20 PHP
php函数式编程简单示例
2019/08/08 PHP
js和jquery批量绑定事件传参数一(新猪猪原创)
2010/06/23 Javascript
jquery下实现overlay遮罩层代码
2010/08/25 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
jQuery过滤特殊字符及JS字符串转为数字
2016/05/26 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
详解jQuery的Cookie插件
2016/11/23 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
python用reduce和map把字符串转为数字的方法
2016/12/19 Python
python3实现猜数字游戏
2020/12/07 Python
利用python计算时间差(返回天数)
2019/09/07 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
selenium携带cookies模拟登陆CSDN的实现
2021/01/19 Python
捷科时代的软件测试笔试题
2015/11/09 面试题
财务会计应届生求职信
2013/11/24 职场文书
食品安全责任书
2014/04/15 职场文书
婚礼秀策划方案
2014/05/19 职场文书
自主招生自荐信范文
2015/03/04 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android
Python使用Web框架Flask开发项目
2022/06/01 Python