Python Pygame实战在打砖块游戏的实现


Posted in Python onMarch 17, 2022

导语

想起来好久没更这个系列的文章了,周末过来补一波好了。本期我们将利用python制作一个打砖块小游戏,废话不多说,让我们愉快地开始吧~

开发工具

Python版本:3.6.4

相关模块:

pygame模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

效果展示

在cmd窗口运行Game18.py文件即可。

效果如下:

视频链接

原理简介

游戏规则(摘自维基百科):

打砖块是一种电子游戏。屏幕上部有若干层砖块,一个球在屏幕上方的砖块和墙壁、屏幕下方的移动短板和两侧墙壁之间来回弹,当球碰到砖块时,球会反弹,而砖块会消失。玩家要控制萤幕下方的板子,让“球”通过撞击消去所有的“砖块”,球碰到萤幕底边就会消失,所有的球消失则游戏失败。把砖块全部消去就可以破关。

板子操作方式:按“→”向右,按“←”向左。

逐步实现:

游戏实现起来其实非常简单。首先,我们根据游戏规则定义3个游戏精灵类,分别是:

  • 板子类;
  • 球类;
  • 砖块类。

先定义游戏精灵的好处是方便后续游戏精灵类之间的碰撞检测以及游戏精灵的操作管理等。具体而言,对于板子类,其应当具有根据玩家操作而移动等功能,其代码实现如下:

'''板子'''
class Paddle(pygame.sprite.Sprite):
    def __init__(self, x, y, width, height, SCREENWIDTH, SCREENHEIGHT, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        self.init_state = [x, y, width, height]
        self.rect = pygame.Rect(x, y, width, height)
        self.base_speed = 10
        self.SCREENWIDTH = SCREENWIDTH
        self.SCREENHEIGHT = SCREENHEIGHT
    '''移动板子'''
    def move(self, direction):
        if direction == 'left':
            self.rect.left = max(0, self.rect.left-self.base_speed)
        elif direction == 'right':
            self.rect.right = min(self.SCREENWIDTH, self.rect.right+self.base_speed)
        else:
            raise ValueError('Paddle.move.direction unsupport <%s>...' % direction)
        return True
    '''绑定到屏幕上'''
    def draw(self, screen, color):
        pygame.draw.rect(screen, color, self.rect)
        return True
    '''重置'''
    def reset(self):
        self.rect = pygame.Rect(self.init_state[0], self.init_state[1], self.init_state[2], self.init_state[3])
        return True

对于球类,则由电脑控制其移动方式(比如撞到墙自动换方向等),其代码实现如下:

'''球'''
class Ball(pygame.sprite.Sprite):
    def __init__(self, x, y, radius, SCREENWIDTH, SCREENHEIGHT, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        self.init_state = [x, y, radius*2, radius*2]
        self.rect = pygame.Rect(x, y, radius*2, radius*2)
        self.base_speed = [5, 5]
        self.direction = [random.choice([1, -1]), -1]
        self.radius = radius
        self.SCREENWIDTH = SCREENWIDTH
        self.SCREENHEIGHT = SCREENHEIGHT
    '''移动球'''
    def move(self):
        self.rect.left += self.direction[0] * self.base_speed[0]
        self.rect.top += self.direction[1] * self.base_speed[1]
        if self.rect.left <= 0:
            self.rect.left = 0
            self.direction[0] = -self.direction[0]
        elif self.rect.right >= self.SCREENWIDTH:
            self.rect.right = self.SCREENWIDTH
            self.direction[0] = -self.direction[0]
        if self.rect.top <= 0:
            self.rect.top = 0
            self.direction[1] = -self.direction[1]
        elif self.rect.bottom >= self.SCREENHEIGHT:
            return False
        return True
    '''改变运动速度和方向(与拍相撞时)'''
    def change(self):
        self.base_speed = [random.choice([4, 5, 6]), random.choice([4, 5, 6])]
        self.direction = [random.choice([1, -1]), -1]
        return True
    '''绑定到屏幕上'''
    def draw(self, screen, color):
        pygame.draw.circle(screen, color, (self.rect.left+self.radius, self.rect.top+self.radius), self.radius)
        return True
    '''重置'''
    def reset(self):
        self.rect = pygame.Rect(self.init_state[0], self.init_state[1], self.init_state[2], self.init_state[3])
        return True

对于砖块类,则比较简单,其代码实现如下:

'''砖块'''
class Brick(pygame.sprite.Sprite):
    def __init__(self, x, y, width, height, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        self.init_state = [x, y, width, height]
        self.rect = pygame.Rect(x, y, width, height)
    '''绑定到屏幕上'''
    def draw(self, screen, color):
        pygame.draw.rect(screen, color, self.rect)
        return True
    '''重置'''
    def reset(self):
        self.rect = pygame.Rect(self.init_state[0], self.init_state[1], self.init_state[2], self.init_state[3])
        return True

然后和以前一样,多弄几个关卡,每个关卡地图都用一个.level文件来设计定义,例如这样:

Python Pygame实战在打砖块游戏的实现

其中B代表砖块所在的位置。

OK,接下来可以考虑实现游戏主循环了。基本的逻辑就是:

Python Pygame实战在打砖块游戏的实现

即每关结束判断一下是过关了还是GG了,过关了就进入下一关,否则就直接进入结束界面。当然最后一关是个例外,因为结束之后肯定要进入结束界面。具体而言,主逻辑代码实现如下:

def run(self):
    while True:
        self.__startInterface()
        for idx, levelpath in enumerate(self.cfg.LEVELPATHS):
            state = self.__runLevel(levelpath)
            if idx == len(self.cfg.LEVELPATHS)-1:
                break
            if state == 'win':
                self.__nextLevel()
            else:
                break
        if state == 'fail':
            self.__endInterface(False)
        else:
            self.__endInterface(True)

到此这篇关于Python Pygame实战在打砖块游戏的实现的文章就介绍到这了,更多相关Python Pygame打砖块内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python Flask-web表单使用详解
Nov 18 Python
浅析python协程相关概念
Jan 20 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
python 对key为时间的dict排序方法
Oct 17 Python
对numpy中数组转置的求解以及向量内积计算方法
Oct 31 Python
python 使用 requests 模块发送http请求 的方法
Dec 09 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
关于PyTorch源码解读之torchvision.models
Aug 17 Python
python性能测量工具cProfile使用解析
Sep 26 Python
python模块hashlib(加密服务)知识点讲解
Nov 25 Python
在Python中用GDAL实现矢量对栅格的切割实例
Mar 11 Python
python中Pyqt5使用Qlabel标签播放视频
Apr 22 Python
python超详细实现完整学生成绩管理系统
Mar 17 #Python
Python Pygame实战之塔防游戏的实现
pytorch中的 .view()函数的用法介绍
Mar 17 #Python
Python绘画好看的星空图
opencv深入浅出了解机器学习和深度学习
Python与C++中梯度方向直方图的实现
JAVA SpringMVC实现自定义拦截器
Mar 16 #Python
You might like
php 时间计算问题小结
2009/01/04 PHP
PHP explode()函数用法、切分字符串
2012/10/03 PHP
php实现RSA加密类实例
2015/03/26 PHP
PHP基于MySQL数据库实现对象持久层的方法
2015/06/17 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
window.addEventListener来解决让一个js事件执行多个函数
2012/12/26 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
2016/08/01 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
JS实现超级好看的鼠标小尾巴特效
2020/12/01 Javascript
python类装饰器用法实例
2015/06/04 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
python软件都是免费的吗
2020/06/18 Python
英国鞋网:Rubber Sole
2020/03/03 全球购物
七年级数学教学反思
2014/01/22 职场文书
绿化工程实施方案
2014/03/17 职场文书
学用政策心得体会
2014/09/10 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
婚内房产协议书范本
2014/10/02 职场文书
现实表现材料范文
2014/12/23 职场文书
初三语文教学计划
2015/01/22 职场文书
《月光曲》教学反思
2016/02/16 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
详解PHP Swoole与TCP三次握手
2021/05/27 PHP
NASA 机智号火星直升机拍到了毅力号设备碎片
2022/04/29 数码科技