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中print的不换行即时输出的快速解决方法
Jul 20 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
基于python中的TCP及UDP(详解)
Nov 06 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
Jun 20 Python
Selenium chrome配置代理Python版的方法
Nov 29 Python
对Python协程之异步同步的区别详解
Feb 19 Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 Python
Python中print函数简单使用总结
Aug 05 Python
pycharm运行scrapy过程图解
Nov 22 Python
Pytorch训练过程出现nan的解决方式
Jan 02 Python
python编写五子棋游戏
May 25 Python
python超详细实现完整学生成绩管理系统
Mar 17 #Python
Python Pygame实战之塔防游戏的实现
pytorch中的 .view()函数的用法介绍
Mar 17 #Python
Python绘画好看的星空图
opencv深入浅出了解机器学习和深度学习
Python与C++中梯度方向直方图的实现
JAVA SpringMVC实现自定义拦截器
Mar 16 #Python
You might like
什么是短波收听SWL
2021/03/01 无线电
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
用php代码限制国内IP访问我们网站
2015/09/26 PHP
php使用strip_tags()去除html标签仍有空白的解决方法
2016/07/28 PHP
对象的类型:本地对象(1)
2006/12/29 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
JS实现可改变列宽的table实例
2013/07/02 Javascript
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:01:22]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
pytyon 带有重复的全排列
2013/08/13 Python
python中的字典操作及字典函数
2018/01/03 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
python3 读取Excel表格中的数据
2018/10/16 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
行政助理的职责
2013/11/14 职场文书
安全在我心中演讲稿
2014/09/01 职场文书
十八大宣传标语
2014/10/09 职场文书
基层党组织整改方案
2014/10/25 职场文书
2014五年级班主任工作总结
2014/12/05 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
报案材料怎么写
2015/05/25 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
python 爬取京东指定商品评论并进行情感分析
2021/05/27 Python