外星人入侵之武装飞船(3)

简介: 经过几个月的学习,自己也有了一些学习python的经验,想通过几个稍微大一点的项目的来对自己的开发能力进行训练和评估,从今天继续进行学习和练习Python编程从入门到实践这本书里面的项目。本项目中,自己会对项目中使用的一些方法和构造进行解读,自己学会就是自己的东西。本文章主要是对前面写的一些代码的重构,方便对后续越来越多功能,与代码的简化,为后续代码的进一步管理提供了便利.也增加了飞船向右移动的功能,并增加了按着按键不动,飞船会一直向右移动,使得游戏更加合理,总的来说都是对我在项目制作过程中的一种思路的培养,使我对于项目开发的流程有了更加清晰的了解.

前言


版权声明:本文为本博主在CSDN的原创文章搬运而来,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                            

原文链接:https://blog.csdn.net/weixin_72543266/article/details/132640084


 经过几个月的学习,自己也有了一些学习python的经验,想通过几个稍微大一点的项目的来对自己的开发能力进行训练和评估,从今天继续进行学习和练习Python编程从入门到实践这本书里面的项目。本项目中,自己会对项目中使用的一些方法和构造进行解读,自己学会就是自己的东西。


思维导图

image.gif


1,重构:模块 game_functions

在大型项目中,经常需要在添加新代码前重构既有代码。重构旨在简化既有代码的结构,使其更容易扩展。在本节中,我们将创建一个名为game_functions的新模块,它将存储大量让游戏 《外星人入侵》运行的函数。通过创建模块game_functions,可alien_invasion.py太长,并使 其逻辑更容易理解。这里我们会通过重构函数,并将之前写的一些代码放入函数中,方便对代码和游戏进行管理.


2,创建game_functions.py 文件

2.1,导入模块

import sys
import pygame

image.gif

2.2,进行退出游戏事件转移

然后我们将alien_invasion.py文件中控制游戏退出的代码剪切过来

# 定义监查事件函数
def check_events():
    """响应按键和鼠标事件"""
    # 监听键盘和鼠标事件
    for event in pygame.event.get():  # 使用方法pygame.event.get()。所有键盘和鼠标事件都将促使for循环运行
        if event.type == pygame.QUIT:  # 如果玩家单机游戏窗口关闭按钮,则将检测到pygame.QUIT事件
            sys.exit()  # 监测到事件后,退出游戏

image.gif

2.3,修改alien_invasion.py文件

2.3.1,导入模块

import game_functions as gf  # 导入game_functions模块

image.gif

alien_invasion.py文件中导入模块,方便对退出游戏函数的调用

2.3.2,调用函数

gf.check_events()  # 调用gf.模块中的check_events()函数

image.gif

image.gif

在之前剪切代码的位置进行函数的调用  

2.4,在game_functions.py文件中创建函数 update_screen()

为进一步简化run_game(),下面将更新屏幕的代码移到一个名为update_screen()的函数中, 并将这个函数放在模块game_functions.py中:

2.4.1,创建update_screen() 函数

注意需要包含三个参数,分别是控制屏幕颜色的,飞船和显示窗口的screen

def update_screen(S_settings, screen, ship):

image.gif

2.4.2,将游戏背景,飞船等事件代码转移

将while部分剩余部分的代码剪切过来

# 每次循环时都重绘屏幕
    screen.fill(S_settings.bg_color)
    ship.blitme()  # 调用ship.blitme()将飞船绘制到屏幕上
    # 让最近绘制的屏幕可见
    pygame.display.flip()
    """命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可见。在我们移动游戏元
素时,pygame.display.flip()将不断更新屏幕,以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果。"""

image.gif

2.4.3, 调用函数

这里因为上面导入过模块了,所以只需要将模块调用一下即可.

gf.update_screen(S_settings, screen, ship)  # 调用gf.模块中的update_screen()函数

image.gif

image.gif

3,飞船移动

下面来让玩家能够左右移动飞船。我们将编写代码,在用户按左或右箭头键时作出响应。我们将首先专注于向右移动,再使用同样的原理来控制向左移动。通过下面的操作来学习如何控制屏幕图像的移动.

3.1,按键响应

3.1.1,修改game_functions.py文件

玩家按键时,都将在Pygame中触发一个事件。事件都是通过方法pygame.event.get()获取的,因此在函数check_events()中,我们需要指定要检查哪些类型的事件。

我们每次按建都会注册一个KEYDOWN事件.当监测到为一个KEYDOWN事件。如果我们按的是右键,那么,我们就增大飞船的rect.centerx值,将飞船向右移动:这里我们需要给检查事件的函数传入一个ship参数,因为按键影响的是飞船的参数

def check_events(ship):

image.gif

elif event.type == pygame.KEYDOWN:   # 如果事件为KEYDOWN事件
            if event.key == pygame.K_RIGHT:  # 如果是游戏的特定键
                # 向右移动飞船
                ship.rect.centerx += 1

image.gif

3.1.2,修改alien_invasion.py文件

既然给传入check_events(ship):传入了ship参数,那么必须要给控制游戏运行的函数传参

gf.check_events(ship)  # 调用gf.模块中的check_events()函数

image.gif

3.2,允许不断移动

3.2.1,设计思路

玩家按住右箭头键不放时,我们让飞船不断地向右移动,直到玩家松开为止。我们将让游戏检测pygame.KEYUP事件,以便玩家松开右箭头键时我们能够知道;

然后,我们将结合使 用KEYDOWN和KEYUP事件,以及一个名为moving_right的标志来实现持续移动。 飞船不动时,标志moving_right将为False。玩家按下右箭头键时,我们将这个标志设置为

True;而玩家松开时,我们将这个标志重新设置为False

3.2.2,思路实现

3.2.2.1,修改ship.py文件

修改ship.py文件中的代码,增加了移动标志,和update函数,我们先定义移动标志为False在初次运行代码时,初始定义,并定义了移动函数,移动函数中的代码为从上一步3.1.1中移动的地方剪切而来.因后面会对那一部分进行修改.

# 移动标志
        self.moving_right = False  # 因为飞船初始为不动的状态,所以直接设置为false
    def update(self):
        """根据移动标志调整飞船的位置"""
        if self.moving_right:  # 当飞船事件为True时飞船移动
            self.rect.centerx += 1

image.gif

image.gif 编辑

3.2.2.2,修改game_functions.py文件

这里,我们因为先将修改过的地方,加上按下右键会将初始设置的False改为True.并且增加了监测响应松开按键的事件,并且松开的是右键时,又会设置为False.

ship.moving_right = True     # 按下右键件后将moving_right设置为True
    # 监测是否松开键
        elif event.type == pygame.KEYUP:     # 响应KEYUP事件
            if event.key == pygame.K_RIGHT:  # 如果是松开键,并且松开的是右键
                ship.moving_right = False    # 松开右键后将moving_right设置为False

image.gif

3.2.3,修改alien_invasion.py文件调用函数

最后,我们需要修改alien_invasion.py中的while循环,以便每次执行循环时都调用飞船的方法update()

ship.update()  # 飞船移动

image.gif

这里我们将调用的函数放在,更改屏幕之前的作用:飞船的位置将在检测到键盘事件后(但在更新屏幕前)更新。这样,玩家输入时,飞船的位置将更新,从而确保使用更新后的位置将飞船绘制到屏幕上。

image.gif

3.3,制作效果展示

第一次,没有设置不断移动前,做到3.1按键响应那里:我们按一次右键只会移动图中圈1一小方块.增加了不断移动后:我们可以移动圈2 那么一大块位置.

image.gif

4,总结

本文章主要是对前面写的一些代码的重构,方便对后续越来越多功能,与代码的简化,为后续代码的进一步管理提供了便利.也增加了飞船向右移动的功能,并增加了按着按键不动,飞船会一直向右移动,使得游戏更加合理,总的来说都是对我在项目制作过程中的一种思路的培养,使我对于项目开发的流程有了更加清晰的了解.


每日一言

如果你能在浪费时间中获得乐趣,就不算浪费时间。


相关文章
|
3天前
|
存储 Python
外星人入侵之武装飞船(2)
文章介绍了如何使用Python进行游戏开发,特别是通过创建外星人入侵游戏来学习Python编程。并提供了项目的思维导图。文章分为几个部分,首先介绍了如何设置游戏屏幕的背景色,通过调用pygame.display.set_caption()和screen.fill(bg_color)方法实现。接着,作者创建了一个名为`Settings`的类,存储游戏设置,如屏幕尺寸和背景颜色,以便于管理和修改。通过这种方式,初学者不仅可以学习Python编程基础,还能了解到类和对象的概念,以及如何组织代码以实现更复杂的功能。文章还鼓励读者自己寻找合适的图片资源,以避免侵权,并提供了一个简单的飞船图片作为参考。
|
3天前
|
Python
外星人入侵之武装飞船(1)
本文是关于使用Python编程语言开发游戏《外星人入侵》的项目介绍。分享了自己学习Python的心得,并决定通过该项目来提升自己的编程技能,文章详细讲解了如何安装Pygame库,并逐步展示了创建游戏窗口、设置游戏标题、监听用户输入(包括键盘和鼠标事件)、处理关闭窗口的请求以及不断更新屏幕以实现平滑动画效果的代码。通过这些步骤,构建了一个基础的游戏框架。最后,文章总结了已完成的工作,并预告了接下来的开发计划。 注意:以上内容是摘要,原始文章包含更多详细解释和代码示例。
|
5月前
|
Python
外星人入侵游戏-(创新版)
外星人入侵游戏-(创新版)
37 1
|
12月前
|
SQL 安全 前端开发
|
安全 机器人 网络安全
盘点3款高端大气上档次的黑客游戏
盘点3款高端大气上档次的黑客游戏
120 0
盘点3款高端大气上档次的黑客游戏
|
C#
C#黎明前的黑暗
  学习编程已经很久了,然而技术还停留在远古时代,丝毫没有什么进步的痕迹,平常也就写一些小软件来处理工作上面遇到的一些很繁杂的问题,天生愚笨或许就是说的我。   黎明前的黑暗期,真的太长了,烂烂的文章就像烂烂的代码一样,没有逻辑感,没有篇幅,简简短短的几行就草草的解决着一个又一个的小问题,却没有一套完整或者大一点的程序。
835 0
|
安全
恶意软件“玻璃老鼠”隐藏数年之久专门攻击中国
本文讲的是恶意软件“玻璃老鼠”隐藏数年之久专门攻击中国,RSA本周公布了一个隐藏了数年之久的远程访问木马(RAT),目标是与跨国公司有联系的中国公民。
1257 0