【python3小白上路系列】外星人入侵——重构

2020-08-05  本文已影响0人  Charles_DT

今天真是非常疲惫的一天,逻辑学的书到啦!正式入坑,赶紧学完今天的内容我要去入坑啦。

1.3 重构

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

1.3.1 函数check_events()

我们将首先把管理事件的代码移到一个名为check_events() 的函数中,以简化run_game() 并隔离事件管理循环。通过隔离事件循环,可将事件管理与游戏的其他方面(如更新屏幕)分离。
将check_events() 放在一个名为game_functions 的模块中:

import sys
import pygame

def check_events():
    #响应案件和鼠标事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

这个模块中导入了事件检查循环要使用的sys 和pygame 。当前,函数check_events() 不需要任何形参,其函数体复制了alien_invasion.py的事件循环。

下面来修改alien_invasion.py,使其导入模块game_functions ,并将事件循环替换为对函数check_events() 的调用:

import pygame

from setting import Settings
from ship import Ship
import game_functions as gf

def rungame():
    #初始化游戏并创建一个屏幕对象
    pygame.init()

    #实例化设置对象
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    #创建一只飞船
    ship = Ship(screen)
      
    #开始游戏主循环
    while True:
        gf.check_events()

        #每次循环时都重绘屏幕
        screen.fill(ai_settings.bg_color)
        # 屏幕上绘制飞船
        ship.blitme()
            
        #让最近绘制的屏幕可见#
        pygame.display.flip()

rungame()

导入自定义模块前一定要保存那个要导入的模块再导入!!!不然会报错!!!

1.3.2 函数update_screen()

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

import sys
import pygame

def check_events():
    #响应案件和鼠标事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

def update_screen(ai_settings,screen,ship):
    #每次循环时都重绘屏幕
        screen.fill(ai_settings.bg_color)
        # 屏幕上绘制飞船
        ship.blitme()
            
        #让最近绘制的屏幕可见#
        pygame.display.flip()

新函数update_screen() 包含三个形参:ai_settings 、screen 和ship 。现在需要将alien_invasion.py的while 循环中更新屏幕的代码替换为对函数update_screen()
的调用:

import pygame

from setting import Settings
from ship import Ship
import game_functions as gf

def rungame():
    #初始化游戏并创建一个屏幕对象
    pygame.init()

    #实例化设置对象
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    #创建一只飞船
    ship = Ship(screen)
      
    #开始游戏主循环
    while True:
        gf.check_events()
        gf.update_screen(ai_settings,screen,ship)

rungame()

这两个函数让while 循环更简单,并让后续开发更容易:在模块game_functions 而不是run_game() 中完成大部分工作。
鉴于我们一开始只想使用一个文件,因此没有立刻引入模块game_functions 。这让你能够了解实际的开发过程:一开始将代码编写得尽可能简单,并在项目越来越复杂时进行重构。

对代码进行重构使其更容易扩展后,明天可以开始处理游戏的动态方面了!
溜了溜了!夯实基础去咯!

上一篇下一篇

猜你喜欢

热点阅读