专栏首页程序员小王用Python 优雅的打飞机

用Python 优雅的打飞机

python可以做什么?

可以做日常任务,比如自动备份你的MP3;

可以做网站,很多著名的网站像知乎、YouTube就是Python写的;

可以做网络游戏的后台,很多在线游戏的后台都是Python开发的。

但是今天要教你用python打飞机。

简述:

相信很多朋友都用java 写过飞机大战,在自己学完python基础以后就开始写python版飞机大战,今天把用pygame实现飞机大战的游戏分享给大家。

Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。-----百度百科

pygame知识前瞻:

  • 1.游戏的初始化和退出 pygame.init() 导入并初始化 所有pygame模块 在使用其他模块之前 必须先调用init 方法 pygame.quit() 卸载所有pygame 模块 在游戏结束之前调用 2.理解游戏中的坐标系 原点 在左上角(0,0) x 轴 水平方向向右 逐渐增加 y 轴 垂直方向向下 逐渐增加 xy指定位置 宽和高指定大小 注: 游戏中所有可见元素 都是以矩形区域描述 pygame.Rect 用来描述 矩形区域 不需要使用init方法 3.创建游戏的主窗口 pygame.display pygame.display.set_mode()
  • resolution 指定屏幕的 宽和高 用元组指定
  • flags 指定屏幕的附加选项 是否全屏
  • depth 表示颜色的位数 默认自动匹配

代码结构:

main.py 主函数

myplane.py 英雄机类

enemy.py 敌机类

bullet.py 子弹类

supply.py 子弹供给类

程序执行流程:

代码:

整个游戏主要分三个角色,敌机,英雄机和子弹

敌机 enemy.py:

随机出现一堆敌人的飞机,直管往前冲,从屏幕的上方往下方蜂拥而至,没有其他的任何行为。

设置了三种敌机的等级,大中小,代码量比较大只贴主要代码。

def move(self):
    if self.rect.top < self.height:
        self.rect.top += self.speed
    else:
        self.reset()

def reset(self):
    self.active = True
    self.rect.left, self.rect.top = \
           randint(0, self.width - self.rect.width), \
           randint(-5 * self.height, 0)

敌机的行为就一个飞,而且是只会往前,同时敌机有几个重要的属性,比如它的飞行图片和击落的图片,然后获取的屏幕上的坐标。

英雄机 myplane.py:

英雄机总是要有点主角光环的,所以稍微复杂一点,它有这么几个主要的属性,飞行的图片,被击落的图片,屏幕坐标,它的子弹,我们需要控制它的飞机方向,向上,向下,左边和右边,发射子弹。

def moveUp(self):
    if self.rect.top > 0:
        self.rect.top -= self.speed
    else:
        self.rect.top = 0

def moveDown(self):
    if self.rect.bottom < self.height - 60:
        self.rect.top += self.speed
    else:
        self.rect.bottom = self.height - 60

def moveLeft(self):
    if self.rect.left > 0:
        self.rect.left -= self.speed
    else:
        self.rect.left = 0

def moveRight(self):
    if self.rect.right < self.width:
        self.rect.left += self.speed
    else:
        self.rect.right = self.width

def reset(self):
    self.rect.left, self.rect.top = \
                    (self.width - self.rect.width) // 2, \
                    self.height - self.rect.height - 60
    self.active = True
    self.invincible = True

子弹 bullet.py:

这里需要初始化子弹的图片,获取在坐标轴中的位置。

def __init__(self, position):
    pygame.sprite.Sprite.__init__(self)

    self.image = pygame.image.load\
        ("images/bullet1.png").convert_alpha()
    self.rect = self.image.get_rect()
    self.rect.left, self.rect.top = position
    self.speed = 12
    self.active = False
    self.mask = pygame.mask.\
      from_surface(self.image)

def move(self):
    self.rect.top -= self.speed

    if self.rect.top < 0:
        self.active = False

def reset(self, position):
    self.rect.left, self.rect.top = position
    self.active = True

子弹供给 supply.py:

  self.speed = 5
    self.active = False
    self.mask = pygame.mask.\
        from_surface(self.image)

def move(self):
    if self.rect.top < self.height:
        self.rect.top += self.speed
    else:
        self.active = False

def reset(self):
    self.active = True
    self.rect.left, self.rect.bottom = \
    randint(0, self.width - self.rect.width), -100

在这个游戏中还可以获得额外奖励,就是英雄机的子弹速度和大小发生变化。

主函数 main.py:

主要负责游戏逻辑的控制,背景音乐的引用,游戏界面的初始化和游戏循环。

running = True

while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

其实用一个大的while 循环(只贴了一小部分代码)来写整个游戏的逻辑部分,主要实现了以下功能:

  • 绘制出背景幕布
  • 绘制出玩家的战机,敌机
  • 绑定战机和敌机的鼠标和键盘响应事件
  • 发射子弹,通过坐标来判断子弹和敌机的碰撞,以及敌机和玩家战机的碰撞
  • 最后还要计算得分:

同时还有其他的代码实现了游戏的初始化和游戏终止。

- End -

本文分享自微信公众号 - 程序员小王(PythonLearningCamp)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PaddlePaddle实战 | KDD Cup Regular ML Track 基线实现解析

    素有数据挖掘领域“世界杯”之称的KDD Cup正在火热进行中,百度作为此次大赛的主办方,除了提供10,000美金特别奖,还为使用PaddlePaddle的参赛选...

    用户1386409
  • 未来是不是真的有只会python和不会python的小学生

    Python火了,有的人说这都是培训机构搞得鬼,但是我觉得你是不太高看培训机构了?他们有能力让那么多人疯狂学习Python编程?他们有能力让那么多大企业使用Py...

    诸葛青云
  • 春招苦短,我用百道Python面试题备战

    在这个项目中,作者 kenwoodjw 准备了近 300 道 Python 面试题,同时还包含解决方案与代码。作者主要从 Python 基础、高级语句、网页应用...

    IT派
  • Python入门-环境搭建详解(Window平台)

    安装成功后重启电脑,再重新打开Python安装程序就可以了。一定要看好Python的安装路径。

    秦子帅
  • Python 函数引入

    由若干语句组成的语句块,函数名称,参数列表构成,它是组织代码的最小单元,完成一定功能。

    江小白
  • SCF: “灰常”简单的车牌识别API制作

    本文的真正目的,并不是说要做一个完善的车牌识别工具,主要就是说想要通过简单的一些package组合(包括深度学习框架等在哪),实现一个简单的对外接口,用来进行车...

    Dfounderliu
  • GitHub 热门:各大网站的 Python 爬虫登录汇总

    项目地址:https://github.com/CriseLYJ/awesome-python-login-model

    IT派
  • 分类模型评估的方法及Python实现

    提到分类模型评估相信大家应该都不会觉得陌生(不陌生你点进来干嘛[捂脸]),本文就分类模型评估的基本原理进行讲解,并手把手、肩并肩地带您实现各种评估函数。完整实现...

    IT派
  • 10 分钟用 Python 搞定数据可视化!

    走在大街上,满眼都是广告(说明市场经济发达,这是好事情),再观察一下广告,多是以各种样式的图形呈现,而不是简简单单地把数字呈现出来,即使是数字,也会想办法把数字...

    IT派
  • 为Python云函数打包依赖

    在使用无服务器云函数(SCF)的时候通常会遇到导入第三方库的时候,这个时候很多小伙伴就比较头疼:我如何打包进去呢?其实这里有几个方法可以尝试。

    Dfounderliu

扫码关注云+社区

领取腾讯云代金券