alien_invasion.py
import pygame from pygame.sprite import Sprite class Ship(Sprite): def __init__(self,ai_settings,screen): super().__init__() self.screen = screen self.image = pygame.image.load("plane.png") self.rect = self.image.get_rect() self.screen_rect = screen.get_rect() self.ai_settings = ai_settings # 将飞船放在屏幕底部中央 self.rect.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom # 移动标志位 self.move_right = False self.move_left = False # speed小数 self.center = float(self.rect.centerx) def update(self): if self.move_right and self.rect.right<self.screen_rect.right: self.center += self.ai_settings.speed_factor elif self.move_left and self.rect.left>0: self.center -= self.ai_settings.speed_factor self.rect.centerx = self.center def blit_ship(self): """在指定位置显示飞机""" self.screen.blit(self.image,self.rect) def center_ship(self): self.center = self.screen_rect.centerx
game_functions.py
import pygame from pygame.sprite import Sprite class Ship(Sprite): def __init__(self,ai_settings,screen): super().__init__() self.screen = screen self.image = pygame.image.load("plane.png") self.rect = self.image.get_rect() self.screen_rect = screen.get_rect() self.ai_settings = ai_settings # 将飞船放在屏幕底部中央 self.rect.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom # 移动标志位 self.move_right = False self.move_left = False # speed小数 self.center = float(self.rect.centerx) def update(self): if self.move_right and self.rect.right<self.screen_rect.right: self.center += self.ai_settings.speed_factor elif self.move_left and self.rect.left>0: self.center -= self.ai_settings.speed_factor self.rect.centerx = self.center def blit_ship(self): """在指定位置显示飞机""" self.screen.blit(self.image,self.rect) def center_ship(self): self.center = self.screen_rect.centerx
read_high_score.py
def read_score(): filename = "high_score.txt" with open(filename) as f_ob: high_score = f_ob.read() return high_score def w_score(now_score): filename = "high_score.txt" with open(filename,‘w‘) as f_ob: f_ob.write(now_score)
setting.py
class Settings(): """初始化游戏设置""" # 屏幕设置 def __init__(self): self.screen_width = 900 self.screen_hight = 700 self.bg_color = (255,0,0) # 子弹设置 self.bullet_width = 10 self.bullet_height = 20 self.bullet_color = (0,255,0) # 限制子弹的数量 self.bullet_quantity = 2 # 外星人的移动 self.fleet_drop_speed = 50 # 玩家拥有的飞船数 self.ship_limt = 3 # 以什么样的速度加快游戏节奏 self.speedup_scale = 1.1 self.score_scale = 1.5 self.initialize_dynamic_settings() # 外星人分值 self.alien_score = 1000 def initialize_dynamic_settings(self): self.bullet_speed_factor = 3 self.speed_factor = 0.5 self.alien_speed_right = 0.4 # 标志位,舰队移动方向判断 self.fleet_direction = 1 def raise_speed(self): self.bullet_speed_factor *= self.speedup_scale self.speed_factor *= self.speedup_scale self.alien_speed_right *= self.speedup_scale self.alien_score = int(self.alien_score*self.score_scale)
game_starts.py
import read_high_score as rh class Game_stats(): def __init__(self,ai_settings): self.ai_settings = ai_settings self.reset_stats() self.game_active = False # 不会被重置的最高得分 self.hight_score = int(rh.read_score()) def reset_stats(self): self.ship_left = self.ai_settings.ship_limt self.score = 0 self.level = 0
scoreboard.py
import pygame.font from pygame.sprite import Group from ship import Ship class Scoreborad(): 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.txt_color = (30,30,30) self.font = pygame.font.SysFont(None,48) # 准备初始化得分对象 self.prep_score() self.prep_hight_score() self.prep_level() self.prep_ship() def prep_ship(self): """显示玩家剩余飞船数""" self.ships = Group() for ship_number in range(self.stats.ship_left): ship = Ship(self.ai_settings,self.screen) ship.rect.x = 10 + ship_number * ship.rect.width ship.rect.y = 0 self.ships.add(ship) def prep_level(self): """显示玩家等级""" level_int = int(self.stats.level) self.level_str = "{:,}".format(level_int) self.level_image = self.font.render(self.level_str,True,self.txt_color,self.ai_settings.bg_color) # 将等级放在当前得分下面 self.level_rect = self.level_image.get_rect() self.level_rect.right = self.screen_rect.right-20 self.level_rect.top = self.score_rect.bottom+10 def prep_score(self): """显示玩家当前得分""" rounded_score = int(round(self.stats.score,-1)) self.score_str = "{:,}".format(rounded_score) # self.score_str = str(self.stats.score) self.score_image = self.font.render(self.score_str,True,self.txt_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_hight_score(self): """显示玩家最高得分""" rounded_score = int(round(self.stats.hight_score,-1)) self.high_score_str = "{:,}".format(rounded_score) self.high_score_image = self.font.render(self.high_score_str,True,self.txt_color,self.ai_settings.bg_color) # 将最高得分放在屏幕最上方中央 self.high_score_rect = self.high_score_image.get_rect() self.high_score_rect.top = 0 self.high_score_rect.centerx = self.screen_rect.centerx 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)
button.py
import pygame.font class Button(): def __init__(self,ai_settings,screen,msg): """设置按钮相应属性""" # 获取屏幕rect对象 self.screen = screen self.screen_rect = screen.get_rect() # 设置按钮尺寸 self.width,self.height = 100,60 self.button_color = (0,255,0) self.txt_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.txt_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)
bullet.py
import pygame from pygame.sprite import Sprite class Bullet(Sprite): """一个管理子弹的类""" def __init__(self,ai_settings,screen,ship): super().__init__() self.screen = screen # 在0,0处创建一个子弹 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)
ship.py
import pygame from pygame.sprite import Sprite class Ship(Sprite): def __init__(self,ai_settings,screen): super().__init__() self.screen = screen self.image = pygame.image.load("plane.png") self.rect = self.image.get_rect() self.screen_rect = screen.get_rect() self.ai_settings = ai_settings # 将飞船放在屏幕底部中央 self.rect.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom # 移动标志位 self.move_right = False self.move_left = False # speed小数 self.center = float(self.rect.centerx) def update(self): if self.move_right and self.rect.right<self.screen_rect.right: self.center += self.ai_settings.speed_factor elif self.move_left and self.rect.left>0: self.center -= self.ai_settings.speed_factor self.rect.centerx = self.center def blit_ship(self): """在指定位置显示飞机""" self.screen.blit(self.image,self.rect) def center_ship(self): self.center = self.screen_rect.centerx
原文:https://www.cnblogs.com/123why/p/11234171.html