星际争霸之小霸王之小蜜蜂(十一)--杀杀杀

系列文章目录

星际争霸之小霸王之小蜜蜂(十)--鼠道

星际争霸之小霸王之小蜜蜂(九)--狂鼠之灾

星际争霸之小霸王之小蜜蜂(八)--蓝皮鼠和大脸猫

星际争霸之小霸王之小蜜蜂(七)--消失的子弹

星际争霸之小霸王之小蜜蜂(六)--让子弹飞

星际争霸之小霸王之小蜜蜂(五)--为小蜜蜂降速

星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来


目录

系列文章目录

文章目录

前言

一、基本思路

二、消灭老鼠

三、补充老鼠

四、重构

总结


前言

昨天我们已经创建了一大群老鼠,今天我们将一只只消灭他们,这让我想起了除四害。


**一、**基本思路

玩过游戏的都知道,游戏里有个名词叫碰撞体积,当我们玩躲避类游戏时,希望自己操控的角色碰撞体积越小越好,这样不容易被击中,而玩射击类游戏时,希望子弹的碰撞体积越大越好,这样更容易击中目标,肉眼区别就是大和小,比如DOTA里面的屠夫碰撞体积就大,隐刺碰撞体积就小。
回到今天我们要实现的内容,让子弹消灭老鼠,那么我们就需要知道子弹的碰撞体积和小老鼠的碰撞体积,当他们接触时,双方都自爆消失。我们可以以子弹为中心,每次调整子弹位置前判断是否碰到老鼠,也可以以老鼠为中心,判断是否遇到子弹。书上是以子弹为中心写的,那么我也按照子弹中心写。

二、消灭老鼠

首先我们写一个函数,判断子弹的rect和小老鼠的rect有没有交集,并创建一个字典,将消失的子弹和小老鼠存进去,为后期统计做准备。
按照上面的思路,我们修改game_functions模块里面update_bullets()函数,在改变子弹前增加代码:

def update_bullets(bullets,aliens):
    collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)
    bullets.update()
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)

我们发现代码比我们想象的要容易,本来以为会写一个嵌套循环,再加上判断语句,结果书上是直接调用pygame里面的函数,不要太方便。
pygame.sprite.groupcollide()函数用于查找在两个组之间发生碰撞的所有精灵。它接受四个参数:group1、group2、dokill1和dokill2。其中,group1和group2是要检查的精灵组,dokill1和dokill2是布尔值,用于指定是否在碰撞后删除精灵。如果dokill1和dokill2都为True,则在碰撞后删除精灵;如果其中一个为True,则在碰撞后保留精灵 。
我们来看看这个好用的函数的效果。

三、补充老鼠

这个游戏本质还是一个逻辑比较简单的游戏,如果单纯的消灭屏幕上的老鼠游戏有点过于简单,如何在增加游戏复杂性和代码难度的基础上增加游戏性,书上给出的策略是增加更多的老鼠,当老鼠被全部消灭后,再产生一批老鼠,最后是以消灭的老鼠数量记分。
要实现上述功能,我们也只需要增加一个判断,当aliens为空时,我们就调用create_fleet函数,生成一批新的老鼠,我们在子弹和老鼠碰撞消失后增加判断代码:

def update_bullets(new_setting,screen,bullets,aliens):
    collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)
    if len(aliens)==0:
        bullets.empty()
        create_fleet(new_setting,screen,aliens)
    bullets.update()
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)

我们可以看出,我们再创建新老鼠前将多余的子弹清空了,避免产生一些视觉上的错误,为了测试我们代码的运行效果,我将老鼠的数量减少,子弹的数量和速度增加了。

  self.bullet_speed_factor = 0.5
        self.bullet_width = 2
        self.bullet_hight = 5
        self.bullet_color = 60,60,60
        self.bullets_allowed = 20
        self.alien_speed_factor = 0.2
        self.fleet_drop_speed = 20
        self.fleet_direction = 1

我们来测试一下效果:

四、重构

又到了重构时间,专业的就是专业,我是永远不会想到把代码重构的,能实现就行了,还改来改去。
书上是重构update_bullets(),将子弹和外星人碰撞的代码移出去,放在新建的函数check_bullet_alien_collisions()中(ps:名字真长)

def update_bullets(new_setting,screen,bullets,aliens):
    check_bullet_alien_collisions(new_setting,screen,bullets,aliens)
    bullets.update()
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)

def check_bullet_alien_collisions(new_setting,screen,bullets,aliens):
    collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
    if len(aliens) == 0:
        bullets.empty()
        create_fleet(new_setting, screen, aliens)

总结

截至目前,感觉终于完成了主要部分,加油!

相关推荐
bryant_meng33 分钟前
【python】OpenCV—Image Moments
开发语言·python·opencv·moments·图片矩
若亦_Royi1 小时前
C++ 的大括号的用法合集
开发语言·c++
KevinRay_1 小时前
Python超能力:高级技巧让你的代码飞起来
网络·人工智能·python·lambda表达式·列表推导式·python高级技巧
Captain823Jack2 小时前
nlp新词发现——浅析 TF·IDF
人工智能·python·深度学习·神经网络·算法·自然语言处理
资源补给站2 小时前
大恒相机开发(2)—Python软触发调用采集图像
开发语言·python·数码相机
Captain823Jack2 小时前
w04_nlp大模型训练·中文分词
人工智能·python·深度学习·神经网络·算法·自然语言处理·中文分词
m0_748247552 小时前
Web 应用项目开发全流程解析与实战经验分享
开发语言·前端·php
6.942 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
PieroPc3 小时前
Python 自动化 打开网站 填表登陆 例子
运维·python·自动化
Aileen_0v03 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper