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实现登陆知乎获得个人收藏并保存为word文件
Mar 16 Python
编写Python脚本使得web页面上的代码高亮显示
Apr 24 Python
详解Python编程中基本的数学计算使用
Feb 04 Python
使用pip安装python库的多种方式
Jul 31 Python
Django 请求Request的具体使用方法
Nov 11 Python
Python 类的魔法属性用法实例分析
Nov 21 Python
python 实现让字典的value 成为列表
Dec 16 Python
Python类继承和多态原理解析
Feb 05 Python
TensorFlow实现批量归一化操作的示例
Apr 22 Python
python文件操作seek()偏移量,读取指正到指定位置操作
Jul 05 Python
python将数据插入数据库的代码分享
Aug 16 Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 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写的资源下载防盗链类分享
2014/05/12 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
浅谈JavaScript事件的属性列表
2015/03/01 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
JavaScript实现点击按钮就复制当前网址
2015/12/14 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
纯JS实现轮播图
2017/02/22 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
JavaScript模拟实现自由落体效果
2018/08/28 Javascript
详解Vue组件之作用域插槽
2018/11/22 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
javascript实现手动点赞效果
2019/04/09 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
Python批量修改文件后缀的方法
2014/01/26 Python
Python实现一个简单的验证码程序
2017/11/03 Python
浅析python打包工具distutils、setuptools
2018/04/20 Python
实例讲解Python爬取网页数据
2018/07/08 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
会计辞职信范文
2014/01/15 职场文书
十佳护士获奖感言
2014/02/18 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
毕业设计论文致谢词
2015/05/14 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
Mysql排序的特性详情
2021/11/01 MySQL
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python
千万级用户系统SQL调优实战分享
2022/03/03 MySQL