飞机大战

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

 

posted @ 2019-07-23 20:15  pywhy  阅读(210)  评论(0编辑  收藏  举报