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

news2024/10/7 6:47:21

系列文章目录

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

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

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

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

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

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


目录

系列文章目录

前言

一、p向右移动小老鼠

二、设置边界

1.设置属性变量

2.检查是否撞到边界

3、实现向下并转向

总结



前言

昨天我们创建了一大群大老鼠,按照学习步骤,今天我们应该让他们动起来了,本来以为会像我们玩的飞机大战类游戏一样,随机产生飞机,然后向下移动,但是书上是每一只老鼠的运行轨迹一样,一口气吃不了个胖子,我们先按照书上来。


一、p向右移动小老鼠

很奇怪,书上的移动方式是先向右移动小老鼠,遇到边界再向下,然后再向左,遇到边界再向下,然后向右,依次类推,整体就是一个蛇形S走位,这样设置的话,我们只要站在第一只老鼠位置不停的射子弹,只要子弹的速度比老鼠的移动快,那么就能赢,慢就是输,没有任何操作可言。

 不管游戏性如何,我们还是先按照书上的步骤来,要实现上面的功能,我们需要创建一个函数来实现向右移动,参照ship的update函数,我们来编写代码,首先我们在settings模块里创建小老鼠移动的变量。

class Settings():

    def __init__(self):

        self.screen_width = 800
        self.screen_height = 600
        self.bg_color = (255,255,255)
        self.ship_speed_factor = 0.1


        self.bullet_speed_factor = 0.3
        self.bullet_width = 2
        self.bullet_hight = 5
        self.bullet_color = 60,60,60
        self.bullets_allowed = 3
        self.alien_speed_factor = 1

 然后我们在alien模块创建update函数:

 def update(self):
        self.x += self.new_setting.alien_speed_factor
        self.rect.x = self.x

 下一步,我们就需要在game_functions模块设置让所有的小老鼠一起移动

def update_aliens(aliens):
aliens.update()

 我们在game_functions模块添加了update_aliens函数,aliens.update()语句的目的就是让aliens里所有的alien对象调用update函数

 最后我们在主函数里调用update_aliens函数

  while True:
        gf.check_events(new_setting,screen,ship,bullets)
        ship.update()
        gf.update_bullets(bullets)
        gf.update_aliens(aliens)
        gf.update_screen(new_setting,screen,ship,bullets,aliens)

 到这里,向右移动我们全部写完了,我们运行一下看看效果。试了一下,1的速度太快了,我改成了0.1

 

 我们发现,小老鼠全部跑到屏幕外面去了。

二、设置边界

1.设置属性变量

一是向下移动的速度,二是移动的方向。

class Settings():

    def __init__(self):

        self.screen_width = 800
        self.screen_height = 600
        self.bg_color = (255,255,255)
        self.ship_speed_factor = 0.1


        self.bullet_speed_factor = 0.3
        self.bullet_width = 2
        self.bullet_hight = 5
        self.bullet_color = 60,60,60
        self.bullets_allowed = 3
        self.alien_speed_factor = 0.1
        self.fleet_drop_speed = 1
        self.fleet_direction = 1
这里要着重解释下 self.fleet_direction这个变量,初始的时候我们设置为1,在使用中我们可以设置其为1或者-1,当小老鼠到最右边时,我们设置其为-1,让它和self.alien_speed_factor相乘,那么每次移动self.x += self.new_setting.alien_speed_factor就相当于是减去alien_speed_factor,就实现了向左移动。

2.检查是否撞到边界

我们先创建一个函数判断是否撞到边界,后续在使用中调用

 def update(self):
        self.x += (self.new_setting.alien_speed_factor*self.new_setting.fleet_direction)
        self.rect.x = self.x
        
        
   def check_edges(self):
        screen_rect = self.screen.get_rect()
        if self.rect.right >= screen_rect.right:
            return True
        elif self.rect.left<=0:
            return True

可以看出,函数的意思是超出边界就返回True。到现在我才明白这个游戏的机制,我一直担心上一行的小老鼠撞到边界后向下然后反方向移动会撞到下一行正在移动的小老鼠,其实不会,这个程序的设置是,如果有一只小老鼠撞到边界,所有的老鼠集体向下,然后换方向移动,他们虽然是独立的,但是行动是一个整体,我们一会看效果。

3、实现向下并转向

 我们在game_functions模块里实现该功能,首先我们设置向下和改变方向的属性

def change_fleet_direction(new_setting,aliens):
    for alien in aliens.sprites():
        alien.rect.y += new_setting.fleet_drop_speed
new_setting.fleet_
direction *=-1

 设置好属性后,我们编写函数判断是否撞到边界

def check_fleet_edges(new_setting,aliens):
    for alien in aliens.sprites():
        if alien.check_edges():
            change_fleet_direction(new_setting,aliens)
            Break

这个函数对每一个小老鼠对象判断,通过前面代码我们知道,当一只小老鼠撞到边界时,返回True,执行向下并转向,这时循环不用再执行了,所以break。

 最后我们再update_aliens函数里调用check_fleet_edges函数,我们看下game_functions的完整代码:

import sys
import pygame
from bullet import Bullet
from alien import Alien


def check_keydown_events(event,new_setting,screen,ship,bullets):
    if event.key == pygame.K_RIGHT:
        ship.moving_right = True

    elif event.key == pygame.K_LEFT:
        ship.moving_left = True

    elif event.key == pygame.K_SPACE:
        fire_bullet(new_setting, screen, ship, bullets)

    elif event.key ==pygame.K_q:
        sys.exit()


def check_keyup_events(event,ship):
    if event.key == pygame.K_RIGHT:
        ship.moving_right = False

    if event.key == pygame.K_LEFT:
        ship.moving_left = False


def check_events(new_setting,screen,ship,bullets):
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN:
            check_keydown_events(event,new_setting,screen,ship,bullets)

        elif event.type==pygame.KEYUP:
            check_keyup_events(event, ship)

def fire_bullet(new_setting,screen,ship,bullets):
    if len(bullets) < new_setting.bullets_allowed:
        new_bullet = Bullet(new_setting, screen, ship)
        bullets.add(new_bullet)


def update_bullets(bullets):
    bullets.update()
    for bullet in bullets.copy():
        if bullet.rect.bottom <= 0:
            bullets.remove(bullet)


def create_fleet(new_setting,screen,aliens):
    for row_number in range(3):
        for alien_number in range(12):
            alien = Alien(new_setting,screen)
            alien.x = alien.rect.width+2*alien.rect.width*alien_number
            alien.rect.x = alien.x
            alien.rect.y = alien.rect.height+2*alien.rect.height*row_number
            aliens.add(alien)

def update_screen(new_setting,screen,ship,bullets,aliens):
    screen.fill(new_setting.bg_color)
    for bullet in bullets.sprites():
        bullet.draw_bullet()
    ship.blitme()
    aliens.draw(screen)
    pygame.display.flip()


def update_aliens(new_setting,aliens):
    check_fleet_edges(new_setting,aliens)
    aliens.update()


def change_fleet_direction(new_setting,aliens):
    for alien in aliens.sprites():
        alien.rect.y += new_setting.fleet_drop_speed
    new_setting.fleet_direction *=-1


def check_fleet_edges(new_setting,aliens):
    for alien in aliens.sprites():
        if alien.check_edges():
            change_fleet_direction(new_setting,aliens)
            break

运行之后我发现,一是向下的速度太快,二是我们初始设置的时候把小老鼠铺满了屏幕,在用子弹消灭之前,小老鼠没有左右移动的空间,所以我进行修改,减少了每一行的数量,由12只改成5只,大家看效果。

 我发现,在修改12之前,小老鼠们是一直向下,当我改成5后,小老鼠们转向了,但是没有向下移动。经过反复测试,每行代码都正确运行后,我发现其实小老鼠向下移动了,只是肉眼难以发觉,于是我将向下的速度self.fleet_drop_speed改为15,效果就是非常好了。

 

 


总结

今天完成了小老鼠的移动,小老鼠有了自己的道,下一步我们就该除四害了,用子弹消灭他们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/971261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据课程K20——Spark的SparkSql概述

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Spark的SparkSQL由来; ⚪ 了解Spark的SparkSQL特点; ⚪ 了解Spark的SparkSQL优势; ⚪ 掌握Spark的SparkSQL入门; 一、SparkSQL概述 1. 概述 Spark为结构化数据处理引入了一个称…

SQLI-labs-第四关

知识点&#xff1a;get双引号(")和括号注入 思路&#xff1a; 1、判断注入点 首先&#xff0c;输入?id1 --&#xff0c;看看正常的回显状态 接着输入?id1 --&#xff0c;结果还是正常回显&#xff0c;说明这里不存在单引号问题 试试双引号&#xff0c;这里爆出了sql语…

深入了解GCC编译过程

关于Linux的编译过程&#xff0c;其实只需要使用gcc这个功能&#xff0c;gcc并非一个编译器&#xff0c;是一个驱动程序。其编译过程也很熟悉&#xff1a;预处理–编译–汇编–链接。在接触底层开发甚至操作系统开发时&#xff0c;我们都需要了解这么一个知识点&#xff0c;如何…

C# 如何读取dxf档案

需求来源&#xff1a; 工作中&#xff0c;客户提供一张CAD导出的dxf 档案&#xff0c;然后需要机器人将其转成点位&#xff0c;走到对应的位置。 下面介绍一下dxf档案到底是什么&#xff1f;以及语法规则。 dxf 格式介绍&#xff1a;DXF 格式 dxf LINE 格式。 其实上述文档…

软考:中级软件设计师:多媒体基础,音频,图像,颜色,多媒体技术的种类,图像音频视频的容量计算,常见的多媒体标准

软考&#xff1a;中级软件设计师:多媒体基础 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &am…

在公网上使用SSH远程连接安卓手机Termux:将Android手机变身为远程服务器

文章目录 前言1.安装ssh2.安装cpolar内网穿透3.远程ssh连接配置4.公网远程连接5.固定远程连接地址 前言 使用安卓机跑东西的时候&#xff0c;屏幕太小&#xff0c;有时候操作不习惯。不过我们可以开启ssh&#xff0c;使用电脑PC端SSH远程连接手机termux。 本次教程主要实现在…

介绍OpenCV

OpenCV是一个开源计算机视觉库&#xff0c;可用于各种任务&#xff0c;如物体识别、人脸识别、运动跟踪、图像处理和视频处理等。它最初由英特尔公司开发&#xff0c;目前由跨学科开发人员社区维护和支持。OpenCV可以在多个平台上运行&#xff0c;包括Windows、Linux、Android和…

高等数学刷题

分段函数主要看在临界点处的左右极限是否相等&#xff0c;若相等则整段函数即为连续 &#xff08;反之若是连续函数&#xff0c;在某一点为间断点&#xff0c;则可推导出一定为可去间断点&#xff09; 无定义的点一定为间断点 如果该点有极限则为可去间断点 由于x的不确定导…

RK3568-spi-适配1.8寸TFT彩屏驱动芯片st7735s

RK3568-spi-适配1.8寸TFT彩屏 驱动芯片st7735s 显示分辨率128x160硬件连接 VCC -- 3.3V GND -- GND BL -- 背光控制 CS -- 片选引脚 DC -- 数据/命令控制 RES -- 屏幕复位 SCL -- i2c时钟引脚 SDA -- i2c数据引脚设备树编写 &spi0 {pinctrl-names = "default"…

docker安装Apache NIFI

说明 系统&#xff1a;CentOS7.9 nifi版本&#xff1a;1.23.2 下载镜像 nifi的镜像比较大&#xff0c;大概有2G左右&#xff0c;下载时间根据个人网速而定 docker pull apache/nifi:1.23.2 查看下载好的镜像 docker images 复制容器数据 创建挂载目录 创建挂载目录的目…

【Yolov5+Deepsort】训练自己的数据集(3)| 目标检测追踪 | 轨迹绘制 | 报错分析解决

&#x1f4e2;前言&#xff1a;本篇是关于如何使用YoloV5Deepsort训练自己的数据集&#xff0c;从而实现目标检测与目标追踪&#xff0c;并绘制出物体的运动轨迹。本章讲解的为第三部分内容&#xff1a;数据集的制作、Deepsort模型的训练以及动物运动轨迹的绘制。本文中用到的数…

qt day 6

登录界面 #include "window.h" #include<QDebug> #include<QIcon> Window::Window(QWidget *parent) //构造函数的定义: QWidget(parent) //显性调用父类的构造函数 {//判断数据库对象是否包含了自己使用的数据库Student.dbif(!db.contains(&…

20230904 QT客户端服务器搭建聊天室

Ser cpp#include "app.h" #include "ui_app.h"APP::APP(QWidget *parent):QWidget(parent),ui(new Ui::APP) {ui->setupUi(this);this->resize(550,400);ui->Line->setAlignment(Qt::AlignCenter);//标签文本对齐方式 居中ui->Line->se…

爬虫源码---爬取自己想要看的小说

前言&#xff1a; 小说作为在自己空闲时间下的消遣工具&#xff0c;对我们打发空闲时间很有帮助&#xff0c;而我们在网站上面浏览小说时会被广告和其他一些东西影响我们的观看体验&#xff0c;而这时我们就可以利用爬虫将我们想要观看的小说下载下来&#xff0c;这样就不会担…

突破瓶颈:如何应对高级职位的面试

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

K8S自动化运维容器Docker集群

K8S&#xff1a;K8S自动化运维容器化(Docker)集群 一.k8s概述 1.k8s是什么 &#xff08;1&#xff09;K8S全程为Kubernetes&#xff0c;由于K到S直接有8个字母简称为K8S。 &#xff08;2&#xff09;版本&#xff1a;目前一般是1.18~1.2.0&#xff0c;后续可能会到1.24-1.2…

Qt 开发 CMake工程

Qt 入门实战教程&#xff08;目录&#xff09; 为何要写这篇文章 目前CMake作为C/C工程的构建方式在开源社区已经成为主流。 企业中也是能用CMake的尽量在用。 Windows 环境下的VC工程都是能不用就不用。 但是&#xff0c;这个过程是非常缓慢的&#xff0c;所以&#xff0…

Linux 学习笔记(2)—— 关于文件和目录

目录 1、切换目录 2、查看系统信息 3、文本的创建和编辑 3-1&#xff09;创建文件 3-2&#xff09;查看文件 3-3&#xff09;输出重定向和追加重定向 3-4&#xff09;使用 vi 编辑器编辑文件 4、文件和文件夹的处理 4-1&#xff09;对文件的处理 4-2&#xff09;查看…

avue实现用户本地保存自定义配置字段属性及注意事项(基于tj-vue2-tools)

avue实现用户本地保存自定义配置字段属性及注意事项&#xff08;基于tj-vue2-tools&#xff09; tj-vue2-tools项目地址&#xff1a;https://www.npmjs.com/package/tj-vue2-tools 文档请看项目官方 依赖js-base64 安装依赖 npm install js-base64安装 npm install tj-vue2-t…

Linux代码初试__进度条

前言 在我们的日常生活中&#xff0c;进度条是十分常见的&#xff0c;比如在软件下载中&#xff0c;应用加载中等等~~~那么进度条有什么特点&#xff1f;他又如何实现。 下面我们将结合下面的图展开讲解 一、前置理论知识 1.1回车和换行的区别 在我们的日常生活中&#x…