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判断文件和文件夹是否存在的方法
May 21 Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 Python
python使用两种发邮件的方式smtp和outlook示例
Jun 02 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
Jun 09 Python
Python实现KNN邻近算法
Jan 28 Python
Python编程实现线性回归和批量梯度下降法代码实例
Jan 04 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 Python
对python条件表达式的四种实现方法小结
Jan 30 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
使用python搭建服务器并实现Android端与之通信的方法
Jun 28 Python
Python统计文本词汇出现次数的实例代码
Feb 27 Python
Python创建临时文件和文件夹
Aug 05 Python
python超详细实现完整学生成绩管理系统
Mar 17 #Python
Python Pygame实战之塔防游戏的实现
pytorch中的 .view()函数的用法介绍
Mar 17 #Python
Python绘画好看的星空图
opencv深入浅出了解机器学习和深度学习
Python与C++中梯度方向直方图的实现
JAVA SpringMVC实现自定义拦截器
Mar 16 #Python
You might like
探讨方法的重写(覆载)详解
2013/06/08 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
Python读取properties配置文件操作示例
2018/03/29 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
Yahoo-PHP面试题2
2014/12/06 面试题
优秀应届生推荐信
2013/11/09 职场文书
工程业务员岗位职责
2013/12/31 职场文书
服务之星获奖感言
2014/01/21 职场文书
表决心的诗句大全
2014/03/11 职场文书
《从现在开始》教学反思
2014/04/15 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
广告业务员岗位职责
2015/02/13 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
如何解决.cuda()加载用时很长的问题
2021/05/24 Python
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫