用Python 优雅的打飞机

浏览: 1982

作者: Ahab
公众号: 程序员小王

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 循环(只贴了一小部分代码)来写整个游戏的逻辑部分,主要实现了以下功能:

  • 绘制出背景幕布

  • 绘制出玩家的战机,敌机

  • 绑定战机和敌机的鼠标和键盘响应事件

  • 发射子弹,通过坐标来判断子弹和敌机的碰撞,以及敌机和玩家战机的碰撞

  • 最后还要计算得分:

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

感谢阅读

推荐阅读

1:最新 | Python 官方中文文档正式发布!

2:影响Linux发展的四位天才黑客

3:110道python面试题

4:2018年Python爱好者社区历史文章合集(作者篇)

5:2018年终精心整理|Python爱好者社区历史文章合集(类型篇

↓↓↓点击下方阅读全文

免费学习小编的Python课程《破冰入门Python》

推荐 0
本文由 Python爱好者社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册