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中的__init__和__new__
Mar 12 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
May 03 Python
Python实现爬取需要登录的网站完整示例
Aug 19 Python
Python实现判断字符串中包含某个字符的判断函数示例
Jan 08 Python
python 请求服务器的实现代码(http请求和https请求)
May 25 Python
利用Python如何将数据写到CSV文件中
Jun 05 Python
Python求解任意闭区间的所有素数
Jun 10 Python
python sorted方法和列表使用解析
Nov 18 Python
详细分析Python可变对象和不可变对象
Jul 09 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
Jul 13 Python
Python如何截图保存的三种方法(小结)
Sep 01 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 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错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
layui-tree实现Ajax异步请求后动态添加节点的方法
2019/09/23 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
降低python版本的操作方法
2020/09/11 Python
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
《植物妈妈有办法》教学反思
2014/02/25 职场文书
求职简历自我评价范例
2014/03/12 职场文书
《一个小村庄的故事》教学反思
2014/04/13 职场文书
中华在我心中演讲稿
2014/09/13 职场文书
实习证明格式范文
2014/10/14 职场文书
2016情人节宣传语
2015/07/14 职场文书
婚礼父母致辞
2015/07/28 职场文书
详解TypeScript中的类型保护
2021/04/29 Javascript
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记