Python篇-pygame篇-<<飞机战僵尸>

作者: TianTianBaby223 | 来源:发表于2017-11-08 14:02 被阅读294次
效果图.gif

TZ : 眼睛睁开的那一刻就会有不同发生,生活处处有惊喜

在评论处留下邮箱地址即可获得全注释源码

一 : 科普一分钟

上大学时候我们利用上机课,玩了不少小游戏,比如接头快打之类的,为了换回童年的欢乐和挖掘对python语言的了解和使用,我们用pygame来制作一款简单的小游戏
Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。 我们来挖掘一下怎么用这个模块做一小游戏,游戏的设计,对各个函数的封装,游戏从何开始,从何结束.

二 : pygame 模块的安装和配置

我们在Mac系统上配置pygame模块 和其他三方库 需要用到pip-python的包管理管理工具,因为现在我们学习的多是python3所以安装的是pip3

pip3的安装方法:

1.点击下面链接
https://pip.readthedocs.io/en/stable/installing/

2.复制粘贴另存为链接中的文本,可以保存为get-pip.py,等网页加载完再复制

3.通过已经安装的python3解释器解释执行另存为的文件

pip3安装完成后我们就要进行pygame模块的安装了,我用的编译器是pycharm,所以在工具包总搜索,下载就可以导入了.

配置.png

三 : 游戏程序结构分析

1. 构建模块文件

从运行效果不难看出,游戏的主要对象结构分别有:
(1) .僵尸群 -- alien模块
(2).飞机--ship模块
(3).子弹--Bullet模块
如果我们给其加上管理设置的类,用来封装一些设置,如游戏背景颜色,子弹最大数量,子弹移动速度,僵尸移动速度等等细节的封装类所以我们建立设置模块:
(4).设置 -- settings模块

当我们对游戏进行操作的时候,pygame模块捕获我们的动作,键盘,鼠标,按下,抬起,屏幕的绘制等等,操作有关的东西,我们可以单独再写一个模块,尽量减少程序的耦合是一个需要掌握的技能和聪明的做法.
(5)游戏使用函数--game_functions模块

游戏从何开始从何结束,怎么样算是失败,怎么样算是通关,一共有多少条生命,怎么样式GAME OVER 所以我们要思考建立一个模块来进行封装
(6)状态--game_stats模块

分析:

程序的编写,并不是一蹴而就,一气呵成的.在编写之前应该做好结构分析,更佳合理的解耦.做好草稿工作,但并不是意味着,写程序的时候不能再添加或者更改,只是分析结构能够极大的提高开发效率,减低风险和成本.

四 : 模块编写与构建联系

分析好结构以后我们就可以进行各个模块的编写了.对于代码展示只展示了核心代码.

(1).入口模块编写,我们需要写一个主程序的入口,之前建立的所有模块都在入口进行调用,循环,和操作,相当于一个主体,好比是一个 main函数

import  pygame

from  settings import settings
from  ship import TZship
import game_functions as gf
from  pygame.sprite import Group
from  game_stats import GameStats

def TZrungame():

    #初始化游戏并且创建一个屏幕对象,设置
    pygame.init()
/ *创建设置实体*/
    ai_setting = settings()

/*设置游戏显示*/
    screen = pygame.display.set_mode((ai_setting.screen_width,ai_setting.screen_height))
    pygame.display.set_caption("飞机大战僵尸")

    #创建一艘飞船
    ship = TZship(ai_setting,screen)


    #创建一个与存储子弹的编组
    bullets = Group()

    #创建僵尸群
    aliens = Group()
    gf.Creat_fleet(ai_setting,screen,ship,aliens)

    #创建一个存储游戏信息的实例
    stats = GameStats(ai_setting)

    # 游戏主循环
    while True:

       #响应按键方法(捕获操作)
        gf.check_event(ai_setting,screen,ship,bullets)

    #判断:如果飞机还有生命次数
        if stats.game_active:

           #飞船位置更新
             ship.update()
    
      #子弹组更新位置
            bullets.update()

     #捕获子弹和僵尸撞击事件
           gf.update_bullets(ai_setting,screen,ship,aliens,bullets)
           
     #捕获僵尸的撞击事件(与飞船和)
           gf.update_aliens(ai_setting,stats,screen,ship,aliens,bullets)

     #更新屏幕绘制
        gf.update_screen(ai_setting,screen,ship,bullets,aliens)

TZrungame()
分析:

入口模块通过不断的循环,来判断捕获的事件,屏幕的绘制,把各个模块联系在一起,让游戏正常的执行,当然,我们不可能开始就会完成在主接口方法的构建,都是在各个模块做一部分,放在入口调试执行,添加或者修改.为了更好的分析入口做了哪些事,也让我们对程序主体有一个明确的了解,进而放在第一位说明.

(2).飞船模块的移动
如何来捕获飞船的移动呢,根据我们自己创建的标识moving_rightmoving_left进行判断

    def update(self):
        '''根据标志调成飞船位置'''
        if self.moving_right:
            if self.moving_right and self.rect.right < self.screen_rect.right:

                self.center += self.ai_settings.ship_speed

        if self.moving_left:
            if self.moving_left and self.rect.left > 0:
                self.center -= self.ai_settings.ship_speed

        #根据self.center更新rect对象
        self.rect.centerx = self.center

(3).僵尸的模块的移动方法
如何来让僵尸动起来呢,通过判断屏幕宽度和僵尸宽度和间距算出 僵尸个数,同理算出僵尸的行数,也可以进行随机的排布和随机出现僵尸个数.
通过当位置碰到屏幕右侧向左边移动,碰到屏幕左边向右侧移动
ai_settings.fleet_direction是移动方向标识
ai_settings.aliens_speed是移动速度标识
统一放在设置模块里并引用.

    def update(self, *args):
        '''移动'''
        self.x += (self.ai_settings.aliens_speed*self.ai_settings.fleet_direction)
        self.rect.x = self.x

(4)子弹模块的移动
随着射击,子弹向上移动,最终击中目标,僵尸消失

    def update(self, *args):
        '''向上移动子弹'''
        # 更新子弹
        self.y -= self.speed

        #更新子弹rect位置
        self.rect.y = self.y

(5).游戏核心函数模块
为了尽量的增加程序的可移植性和封装性,我们把各个部分之间的操作和方法放入一个函数模块,我们在次模块里写一些核心的业务逻辑分析.避免大量代码暴露在各个角落,方便管理与更新.

  • 更新视图功能
def update_screen(ai_settings,screen,ship,bullets,aliens):
    '''更新屏幕图像,并切换到新屏幕'''
    # 每次循环时都重绘屏幕
    screen.fill(ai_settings.bg_color)


    #在飞船和僵尸后面重绘所有子弹
    for bullet in bullets.sprites():
         bullet.draw_bullet()

    ship.blitme()
    aliens.draw(screen)


    # 让最近绘制的屏幕可见
    pygame.display.flip()
  • 子弹的业务逻辑
def update_bullets(ai_settings,screen,ship,aliens,bullets):
    '''更新子弹位置,并删除已消失的子弹'''

    #更新子弹位置
    bullets.update()

    #删除已消失的子弹
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)
#判断子弹与僵尸撞击    
check_bullet_alien_colleisions(ai_settings,screen,ship,aliens,bullets)
  • 僵尸的业务逻辑
def update_aliens(ai_settings,stats,screen,ship,aliens,bullets):

    ''''检查是否有僵尸位于边缘,更新僵尸位置'''
    check_fleet_edges(ai_settings,aliens)

    '''更新僵尸群中所有僵尸的位置'''
    aliens.update()

    #检测僵尸和飞船之间的碰撞
    if pygame.sprite.spritecollideany(ship,aliens):
        ship_hit(ai_settings,stats,screen,ship,aliens,bullets)

    #检测僵尸是否到达屏幕底端
    check_aliens_bottom(ai_settings,stats,screen,ship,aliens,bullets)

五 : 总结

通过这款小游戏,可以看出所有的功能函数单独都很简单,放在一起组成了复杂的业务逻辑.
对于此我们做的就是尽可能简单化复杂的业务逻辑,分离复杂的业务再进行封装.把各个实体对象通过分离的业务逻辑再次进行组合.这样就可以写出调理清晰,思路清晰的代码,假如在配合上高效的算法,那这就是一个非常棒的程序了.

相关文章

网友评论

本文标题:Python篇-pygame篇-<<飞机战僵尸>

本文链接:https://www.haomeiwen.com/subject/pbljmxtx.html