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设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
Python 判断奇数偶数的方法
Dec 20 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
May 04 Python
利用PyCharm Profile分析异步爬虫效率详解
May 08 Python
python3.6根据m3u8下载mp4视频
Jun 17 Python
python networkx 包绘制复杂网络关系图的实现
Jul 10 Python
pymysql 开启调试模式的实现
Sep 24 Python
Python3和pyqt5实现控件数据动态显示方式
Dec 13 Python
python圣诞树编写实例详解
Feb 13 Python
基于python3实现倒叙字符串
Feb 18 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
python如何利用Mitmproxy抓包
Oct 10 Python
python超详细实现完整学生成绩管理系统
Mar 17 #Python
Python Pygame实战之塔防游戏的实现
pytorch中的 .view()函数的用法介绍
Mar 17 #Python
Python绘画好看的星空图
opencv深入浅出了解机器学习和深度学习
Python与C++中梯度方向直方图的实现
JAVA SpringMVC实现自定义拦截器
Mar 16 #Python
You might like
德生PL660的电路分析和打磨
2021/03/02 无线电
php4的彩蛋
2006/10/09 PHP
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
php安装xdebug/php安装pear/phpunit详解步骤(图)
2013/12/22 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
jQuery实用基础超详细介绍
2013/04/11 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
js实现删除li标签一行内容
2019/04/16 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
Python判断字符串与大小写转换
2015/06/08 Python
Python实现周期性抓取网页内容的方法
2015/11/04 Python
windows下ipython的安装与使用详解
2016/10/20 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
python 将md5转为16字节的方法
2018/05/29 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
详解python数据结构和算法
2019/04/18 Python
Python实现决策树并且使用Graphviz可视化的例子
2019/08/09 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
Python 简单计算要求形状面积的实例
2020/01/18 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
Python用dilb提取照片上人脸的示例
2020/10/26 Python
HTML5学习笔记之History API
2015/02/26 HTML / CSS
高中语文课后反思
2014/04/27 职场文书
同意报考证明
2015/06/17 职场文书
篮球拉拉队口号
2015/12/25 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书