飞船游戏
这虽然只是个小游戏,但是代码也不少,为了避免出错并且让代码清楚整洁我们把代码分为9个模块,同时还有一个image文件夹储存图像还有编辑过程中Python自己生成的一个文件夹。9个模块中,每个模块都有自己的功能,来为我们最终的游戏服务。我们看一下做出来游戏的效果。
1.主函数模块alien_invasion
这是主函数模块,也是启动游戏的模块,启动游戏只需要点击此模块即可。
代码:
import pygame
from pygame.sprite import Group
from settings import Settings
from ship import Ship
from alien import Alien
from game_stats import GameStats
from button import Button
from scoreboard import Scoreboard
import game_functions as gf
def run_game():
#初始化pygame、设置和屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode(
(ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
#创建Play按钮
play_button = Button(ai_settings,screen,"Play")
#创建一艘飞船、一个子弹的编组和一个外星人编组
ship = Ship(ai_settings,screen)
bullets = Group()
aliens = Group()
#创建外星人群
gf.create_fleet(ai_settings,screen,ship,aliens)
#创建一个用于储存游戏统计信息的实例,并创建记分牌
stats = GameStats(ai_settings)
sb = Scoreboard(ai_settings,screen,stats)
#开始游戏的主循环
while True:
gf.check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,
bullets)
if stats.game_active:
ship.update()
gf.update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets)
gf.update_aliens(ai_settings,screen,stats,sb,ship,aliens,bullets)
gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,
play_button)
run_game()
2.游戏配置的settings模块
此模块实现游戏相关信息的配置和初始化
代码:
class Settings():
"""储存《外星人入侵》的所有设置的类"""
def __init__(self):
"""初始化游戏的静态设置"""
#屏幕设置
self.screen_width = 1200
self.screen_height = 700
self.bg_color = (230,230,230)
#飞船的设置
self.ship_limit = 3
#子弹设置
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = 60,60,60
self.bullets_allowed = 3
#外星人设置
self.fleet_drop_speed = 10
#以什么样的速度加快游戏节奏
self.speedup_scale = 1.1
#外星人点数的提高
self.score_scale = 1.5
self.initialize_dynamic_settings()
def initialize_dynamic_settings(self):
"""初始化随游戏进行而变化的设置"""
self.ship_speed_factor = 1.5
self.bullet_speed_factor = 3
self.alien_speed_factor = 1
#fleet_direction为1表示向右;为-1表示向左
self.fleet_direction = 1
#记分
self.alien_points = 50
def increase_speed(self):
"""提高速度设置和外星人点数"""
self.ship_speed_factor *= self.speedup_scale
self.bullet_speed_factor *= self.speedup_scale
self.alien_speed_factor *= self.speedup_scale
self.alien_points = int(self.alien_points * self.score_scale)
3.game_stats模块
用于游戏信息的统计
代码:
class GameStats():
"""跟踪游戏的统计信息"""
def __init__(self,ai_settings):
"""初始化统计信息"""
self.ai_settings = ai_settings
self.reset_stats()
#让游戏一开始处于非活动状态
self.game_active = False
#任何情况都不应该清除最高分
self.high_score = 0
def reset_stats(self):
"""初始化在游戏运行期间可能变化的统计信息"""
self.ships_left = self.ai_settings.ship_limit
self.score = 0
self.level = 1
4.用于储存函数的game_functions模块
此模块用于储存让游戏运行的函数,可避免主函数太长,并让其代码更易理解。
具体代码:
import sys
from time import sleep
import pygame
from bullet import Bullet
from alien import Alien
def check_keydown_events(event,ai_settings,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(ai_settings,screen,ship,bullets)
elif event.key == pygame.K_q:
sys.exit()
def fire_bullet(ai_settings,screen,ship,bullets):
"""如果没有到达限制,就发射一颗子弹"""
#创建一颗子弹,并将其加入到编组bullets中
if len(bullets) < ai_settings.bullets_allowed:
new_bullet = Bullet(ai_settings,screen,ship)
bullets.add(new_bullet