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使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
Python操作SQLite简明教程
Jul 10 Python
用Python脚本来删除指定容量以上的文件的教程
May 04 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
使用Python做定时任务及时了解互联网动态
May 15 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 Python
Jacobi迭代算法的Python实现详解
Jun 29 Python
Python pandas.DataFrame 找出有空值的行
Sep 09 Python
django之导入并执行自定义的函数模块图解
Apr 01 Python
如何在 Matplotlib 中更改绘图背景的实现
Nov 26 Python
pycharm如何设置官方中文(如何汉化)
Dec 29 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之第七天
2006/10/09 PHP
php访问查询mysql数据的三种方法
2006/10/09 PHP
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
PHP基于PDO扩展操作mysql数据库示例
2018/12/24 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
喜大普奔!jQuery发布 3.0 最终版
2016/06/12 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
通过构造函数实例化对象的方法
2017/06/28 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
vue表单自定义校验规则介绍
2018/08/28 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
python实现的一个p2p文件传输实例
2014/06/04 Python
python字符串连接方式汇总
2014/08/21 Python
python 换位密码算法的实例详解
2017/07/19 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
python 用下标截取字符串的实例
2018/12/25 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
canvas学习笔记之绘制简单路径
2019/01/28 HTML / CSS
COS美国官网:知名服装品牌
2019/04/08 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
计算机个人求职信范例
2014/01/24 职场文书
春季运动会广播稿大全
2014/02/19 职场文书
浅谈MySQL函数
2021/10/05 MySQL