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 list 合并连接字符串的方法
Mar 09 Python
Python多线程编程(六):可重入锁RLock
Apr 05 Python
Python可变参数函数用法实例
Jul 07 Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
python面试题小结附答案实例代码
Apr 11 Python
Python Image模块基本图像处理操作小结
Apr 13 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 Python
python Selenium 库的使用技巧
Oct 16 Python
如何用tempfile库创建python进程中的临时文件
Jan 28 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容易忘记的知识点分享
2013/04/30 PHP
php用户注册时常用的检验函数实例总结
2014/12/22 PHP
php实现的简单检验登陆类
2015/06/18 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
js获取页面引用的css样式表中的属性值方法(推荐)
2016/08/19 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
python中for语句简单遍历数据的方法
2015/05/07 Python
python使用nntp读取新闻组内容的方法
2015/05/08 Python
Python functools模块学习总结
2015/05/09 Python
Python编程中使用Pillow来处理图像的基础教程
2015/11/20 Python
python的Crypto模块实现AES加密实例代码
2018/01/22 Python
python OpenCV学习笔记直方图反向投影的实现
2018/02/07 Python
python编写简单端口扫描器
2019/09/04 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
python识别验证码的思路及解决方案
2020/09/13 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
C/C++程序员常见面试题一
2012/12/08 面试题
公证书样本
2014/04/10 职场文书
资产运营委托书范本
2014/10/16 职场文书
行政处罚决定书
2015/06/24 职场文书
自考生自我评价
2019/06/21 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书