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

系列文章目录

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

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

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

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

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

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

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


目录

系列文章目录

文章目录

前言

一、基本思路

二、消灭老鼠

三、补充老鼠

四、重构

总结


前言

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


**一、**基本思路

玩过游戏的都知道,游戏里有个名词叫碰撞体积,当我们玩躲避类游戏时,希望自己操控的角色碰撞体积越小越好,这样不容易被击中,而玩射击类游戏时,希望子弹的碰撞体积越大越好,这样更容易击中目标,肉眼区别就是大和小,比如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)

总结

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

相关推荐
JUNAI_Strive_ving3 分钟前
番茄小说逆向爬取
javascript·python
彤银浦4 分钟前
python学习记录7
python·学习
这可就有点麻烦了4 分钟前
强化学习笔记之【TD3算法】
linux·笔记·算法·机器学习
落落落sss7 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
简单.is.good25 分钟前
【测试】接口测试与接口自动化
开发语言·python
Yvemil744 分钟前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
程序员是干活的1 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
Envyᥫᩣ1 小时前
Python中的自然语言处理:从基础到高级
python·自然语言处理·easyui
哪 吒1 小时前
华为OD机试 - 几何平均值最大子数(Python/JS/C/C++ 2024 E卷 200分)
javascript·python·华为od
我是陈泽1 小时前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学