Python篇-pygame篇-<<飞机战僵尸>>开发思路

效果图.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)

五 : 总结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,513评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,312评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,124评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,529评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,937评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,913评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,084评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,816评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,593评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,788评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,267评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,601评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,265评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,158评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,953评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,066评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,852评论 2 277

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,591评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,107评论 18 139
  • 先添上最终完成效果图 Github代码仓库链接 https://github.com/happyte/plane,...
    happyte阅读 2,558评论 9 29
  • 喜欢这首歌、喜欢这部剧、喜欢这群演这部剧的人,琼瑶阿姨的爱情剧似乎都是这么让人难以忘记,让人如此感动。 记得当时因...
    Amy的书阅读 228评论 0 1
  • 这个看目录结构也是一个angular的发布方式,所以一样进入根目录,输入 各种报错,不是废话的就是这句: 'bow...
    环零弦阅读 4,058评论 5 2