效果图如图所示。

文件名 功能
alien_invasion.py 程序入口
settings.py <http://settings.py> 程序配置文件
ships.py <http://ships.py> 飞船模块
alien.py <http://alien.py> 外星人模块
game_stats.py 统计数据模块
scoreboard.py <http://scoreboard.py> 积分板模块
game_functions.py 游戏功能函数模块
bullet.py <http://bullet.py> 子弹模块
button.py <http://button.py> 按钮模块
下面是源代码:

主程序文件:

alien_invasion.py
import pygame import game_functions as gf from settings import Settings from
shipimport Ship from alien import Alien from pygame.sprite import Group from
game_statsimport GameStats from button import Button from scoreboard import
Scoreboarddef run_game(): 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(ai_settings,screen) bullets =
Group() aliens = Group() gf.create_fleet(ai_settings,screen,ship,aliens) stats =
GameStats(ai_settings) play_button = Button(ai_settings,screen,"Play") 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()
settings.py <http://settings.py>
class Settings(): def __init__(self): self.screen_width = 1200 self.
screen_height= 800 self.bg_color = (230,230,230) self.ships_limit = 3 self.
bullet_width= 3 self.bullet_height = 15 self.bullet_color = 60,60,60 self.
bullets_allowed= 10 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 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)
ships.py <http://ships.py>
import pygame from pygame.sprite import Sprite class Ship(Sprite): def __init__
(self,ai_settings,screen): super(Ship,self).__init__() self.screen = screen self
.ai_settings = ai_settings self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect() self.screen_rect = screen.get_rect() self.rect
.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom
self.center = float(self.rect.centerx) self.moving_right = False self.
moving_left= False def update(self): if self.moving_right and self.rect.right <
self.screen_rect.right: self.center += self.ai_settings.ship_speed_factor if
self.moving_left and self.rect.left > 0: self.center -= self.ai_settings.
ship_speed_factor self.rect.centerx = self.center def blitme(self): self.screen.
blit(self.image,self.rect) def center_ship(self): self.center = self.screen_rect
.centerx
alien.py <http://alien.py>
import pygame from pygame.sprite import Sprite class Alien(Sprite): def
__init__(self,ai_settings,screen): super(Alien,self).__init__() self.screen =
screen self.ai_settings = ai_settings self.image = pygame.image.load(
'images/alien.bmp') self.rect = self.image.get_rect() self.rect.x = self.rect.
width self.rect.y = self.rect.height self.x = float(self.rect.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 else: return False def
update(self): self.x += self.ai_settings.alien_speed_factor*self.ai_settings.
fleet_direction self.rect.x = self.x def blitme(self): self.screen.blit(self.
image,self.rect)
game_stats.py
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.ships_limit self.score = 0
self.level = 1
scoreboard.py <http://scoreboard.py>
import pygame.font from pygame.sprite import Group from ship import Ship class
Scoreboard(): def __init__(self,ai_settings,screen,stats): self.screen = screen
self.screen_rect = screen.get_rect() self.ai_settings = ai_settings self.stats =
stats self.text_color = (30,30,30) self.font = pygame.font.SysFont(None,48)
self.prep_score() self.prep_high_score() self.prep_level() self.prep_ships() def
prep_score(self): rounded_score = int(round(self.stats.score,-1)) score_str =
"{:,}".format(rounded_score) self.score_image = self.font.render(score_str,True,
self.text_color,self.ai_settings.bg_color) self.score_rect = self.score_image.
get_rect() self.score_rect.right = self.screen_rect.right - 20 self.score_rect.
top= 20 def prep_high_score(self): high_score = int(round(self.stats.high_score,
-1)) high_score_str = "{:,}".format(high_score) self.high_score_image = self.
font.render(high_score_str,True,self.text_color,self.ai_settings.bg_color) self.
high_score_rect= self.high_score_image.get_rect() self.high_score_rect.centerx =
self.screen_rect.centerx self.high_score_rect.top = self.score_rect.top def
prep_level(self): self.level_image = self.font.render(str(self.stats.level),True
,self.text_color,self.ai_settings.bg_color) self.level_rect = self.level_image.
get_rect() self.level_rect.right = self.score_rect.right self.level_rect.top =
self.score_rect.bottom + 10 def prep_ships(self): self.ships = Group() for
ship_numberin range(self.stats.ships_left): ship = Ship(self.ai_settings,self.
screen) ship.rect.x = 10+ship_number*ship.rect.width ship.rect.y = 10 self.ships
.add(ship) def show_score(self): self.screen.blit(self.score_image,self.
score_rect) self.screen.blit(self.high_score_image,self.high_score_rect) self.
screen.blit(self.level_image,self.level_rect) self.ships.draw(self.screen)
game_functions.py
import pygame import game_functions as gf from settings import Settings from
shipimport Ship from alien import Alien from pygame.sprite import Group from
game_statsimport GameStats from button import Button from scoreboard import
Scoreboarddef run_game(): 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(ai_settings,screen) bullets =
Group() aliens = Group() gf.create_fleet(ai_settings,screen,ship,aliens) stats =
GameStats(ai_settings) play_button = Button(ai_settings,screen,"Play") 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()
bullet.py <http://bullet.py>
import pygame from pygame.sprite import Sprite class Bullet(Sprite): def
__init__(self,ai_settings,screen,ship): super(Bullet,self).__init__() self.
screen= screen self.rect = pygame.Rect(0,0,ai_settings.bullet_width,ai_settings.
bullet_height) self.rect.centerx = ship.rect.centerx self.rect.top = ship.rect.
top self.y = float(self.rect.y) self.color = ai_settings.bullet_color self.
speed_factor= ai_settings.bullet_speed_factor def update(self): self.y -= self.
speed_factor self.rect.y = self.y def draw_bullet(self): pygame.draw.rect(self.
screen,self.color,self.rect)
button.py <http://button.py>
import pygame.font class Button(): def __init__(self,ai_settings,screen,msg):
self.screen = screen self.screen_rect = screen.get_rect() self.width,self.height
= 200,50 self.button_color = (0,255,0) self.text_color = (255,255,255) self.font
= pygame.font.SysFont(None,48) self.rect = pygame.Rect(0,0,self.width,self.
height) self.rect.center = self.screen_rect.center self.prep_msg(msg) def
prep_msg(self,msg): self.msg_image = self.font.render(msg,True,self.text_color,
self.button_color) self.msg_image_rect = self.msg_image.get_rect() self.
msg_image_rect.center = self.rect.center def draw_button(self): self.screen.fill
(self.button_color,self.rect) self.screen.blit(self.msg_image,self.
msg_image_rect)

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信