Exemplo n.º 1
0
def _draw_cloud(tag_list, surface, vertical=True, fontname='fonts/Arial.ttf', fontzoom=5, rectangular=False):
    #Sort the tags by size and wordlength
    tag_list.sort(key=lambda tag: len(tag['tag']))
    tag_list.sort(key=lambda tag: tag['size'])
    tag_list.reverse()

    if rectangular:
        spiral = _rectangular_spiral
    else:
        spiral = _archimedean_spiral

    sizeRect = surface.get_rect()
    tag_store = Group()
    for tag in tag_list:
        rot = 0
        if vertical and randint(0, 2) == 0:
            rot = 90
        currentTag = Tag(tag, (0, 0), rot, fontname=fontname, fontzoom=fontzoom)

        xpos = sizeRect.width - currentTag.rect.width
        if xpos < 0: xpos = 0
        xpos = randint(int(xpos * LOWER_START) , int(xpos * UPPER_START))
        currentTag.rect.x = xpos

        ypos = sizeRect.height - currentTag.rect.height
        if ypos < 0: ypos = 0
        ypos = randint(int(ypos * LOWER_START), int(ypos * UPPER_START))
        currentTag.rect.y = ypos

        _search_place(currentTag, tag_store, sizeRect, spiral, vertical)

        tag_store.add(currentTag)
        surface.blit(currentTag.image, currentTag.rect)
    return tag_store
Exemplo n.º 2
0
 def  __init__(self, moving_sprite,
               speedx = 0,
               maxspeedx = -1,
               speedy = 0,
               maxspeedy = -1,
               posx = 0,
               posy = 0,
               thrust_strength = 0,
               accelx = 0,
               accely = 0,
               gravity = 1000,
               decrease_speed_ratio = 2.0):
     Group.__init__(self)
     self.moving_sprite = moving_sprite
     self.speedx = speedx
     self.speedy = speedy
     self.maxspeedx = maxspeedx
     self.maxspeedy = maxspeedy
     self.posx = posx
     self.posy = posy
     self.thrust_strength = thrust_strength
     self.accelx = accelx
     self.accely = accely
     self.gravity = gravity
     self.decrease_speed_ratio = decrease_speed_ratio
     self.bumping_walls = []
Exemplo n.º 3
0
 def touches(self, group):
     touching = Group()
     coll = self.rect.inflate(2,1) # grow 1px to allow for edges
     for sprite in group:
         if coll.colliderect(sprite.rect):
             touching.add(sprite)
     return touching
Exemplo n.º 4
0
def run_game():
    pygame.init()

    ai_settings = Settings()

    """ Screen settings and such"""
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))

    pygame.display.set_caption("Alien Invasion")
    stats = GameStats(ai_settings)

    bg_color = (230, 230, 230)
    """background screen color; grey"""

    ship = Ship(ai_settings, screen)
    bullets = Group()
    aliens = Group()
    gf.create_fleet(ai_settings, screen, ship, aliens)

    while True:
        gf.check_events(ai_settings, screen, ship, bullets)
        ship.update()
        gf.update_bullets(ai_settings, screen, ship, aliens, bullets)
        gf.update_aliens(ai_settings, stats, screen, ship, aliens, bullets)
        gf.update_screen(ai_settings, screen, ship, aliens, bullets)

        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        print(len(bullets))
Exemplo n.º 5
0
    def __init__(self, bounds):
        Group.__init__(self)

        self.bounds = bounds

        self.spawn_rate = COIN_SPAWN_RATE * 1000
        self.spawn_timer = 0
Exemplo n.º 6
0
    def update(self, dt):
        Group.update(self, dt)

        self.spawn_timer += dt
        if self.spawn_timer >= self.spawn_rate:
            self.spawn()
            self.spawn_timer = 0
Exemplo n.º 7
0
class Level(object):

    def __init__(self):
        self.bounds = Rect((0,0), LEVEL_SIZE)
        print "self.bounds = ", self.bounds

        self.ceilingCoord = 0
        self.floorCoord = self.bounds.height - 40
        self.leftWall = 0
        self.rightWall = self.bounds.width - 40
        
        # make rects for level
        self.blocks = Group(Block(0,0,40,self.bounds.height), # left wall
                            Block(self.bounds.width - 40, 0, 40, self.bounds.height), # right wall
                            Block(0, self.bounds.height - 40, self.bounds.width, 40), # floor
                            Block(200,self.floorCoord-80, 20, 80), # extra bit
                            Spike(350, self.floorCoord, 40), # DEATH SPIKE
                            NinjaStar(350, self.floorCoord - 130) # ninja star 
                            )

        
        
        # render
        self.render_background()

    def render_background(self):
        self.background = Surface(self.bounds.size)
        self.background.fill((80,80,80))
        self.blocks.draw(self.background)
Exemplo n.º 8
0
    def __init__ ( self, color, initial_position, size, player = None ):
        """Creates a new ViewManager object."""
        #Sprite
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.Surface(size)
        self.image.fill(color)

        self.rect = self.image.get_rect()
        self.rect.topleft = initial_position

        #Drawable objects
        if (player == None):
            self.player = Character()
        else: self.player = player

        #Draw starting objects
        #self.setup()

        #Sprite Groups
        self.activeObjects = Group()
        self.activeBackground = Group()
        self.activeAvatar = pygame.sprite.GroupSingle()
        
        #Collision
        self.collision = CollisionManager()
Exemplo n.º 9
0
 def _create_image(self):
     grp = Group()
     for word in self.words:
         if len(grp.sprites()) == 0:
             word.scale(self.ratio+0.2)
             pm_w = word.rect.width
             pm_h = word.rect.height
             pm_x, pm_y = place_primary(pm_w, pm_h)
             word.rect.x, word.rect.y = pm_x, pm_y
             arch_x = pm_x + pm_w/2
             arch_y = pm_y + pm_h/2
         else:
             word.scale(self.ratio)
             for x, y in archimedean_spiral(False):
                 if self.debug:
                     rs = Surface((5, 5))
                     rs.fill((0, 0, 255))
                     rs.set_alpha(100)
                     self.sf.blit(rs, (x + arch_x, y + arch_y))
                 word.set_position(x + arch_x, y + arch_y)
                 x_out = CANVAS_WIDTH - CANVAS_PADDING < word.rect.x + word.rect.width or word.rect.x < CANVAS_PADDING
                 y_out = CANVAS_HEIGHT - CANVAS_PADDING < word.rect.y + word.rect.height or word.rect.y < CANVAS_PADDING
                 out_of_bound = x_out or y_out
                 if spritecollideany(word, grp, collide_mask) is None and not out_of_bound:
                     if self.debug:
                         rs = Surface((5, 5))
                         rs.fill((0, 255, 0))
                         rs.set_alpha(100)
                         self.sf.blit(rs, (x + arch_x, y + arch_y))
                     break
         self.sf.blit(word.image, word.rect)
         grp.add(word)
Exemplo n.º 10
0
class Player (Sprite):
    size = 20,20
    color = 255,255,0
    shottimer = 0
    
    def __init__(self, loc, bounds):
        Sprite.__init__(self)  # required for sprites
        self.image = Surface(self.size)
        self.rect = self.image.get_rect()
        
        self.rect.center = loc
        self.bounds = bounds  # passes the bounds to the object so it can be saved.
        
        self.image.fill(self.color)
        self.bullets = Group()
    
    def update(self):
        if self.shottimer > 0:
            self.shottimer -= 1
        self.rect.center = pygame.mouse.get_pos()
        self.rect.clamp_ip(self.bounds) #makes sure it doesn't go outside the provided rectangle
        
    def shoot(self):
        if not self.alive(): #return just stops everything in hte function
            return
        if self.shottimer == 0:
            bullet = Bullet(self.bounds)
            self.bullets.add(bullet) #adds the new bullet to the Bullets list
        
            bullet.rect.midbottom = self.rect.midtop
            self.shottimer = 10
Exemplo n.º 11
0
class Player(Sprite):

    def __init__(self, game):
        Sprite.__init__(self)
        self.game = game
        self.image = game.get_tile_surface('rot.hoch')
        self.mask = mask.from_surface(self.image)
        self.g = Group(self)
        self.pos = Vector(300, 510)
        self.speed = 4
        self.direction = RIGHT

    def set_direction(self, direction):
        if direction in [LEFT, RIGHT]:
            self.direction = direction

    def get_shot(self):
        return Shot(self.game, (self.pos.x, self.pos.y - 16), UP)

    def move(self):
        self.pos += self.direction * self.speed
        if self.pos.x < MIN_X:
            self.pos.x = MIN_X
        elif self.pos.x > MAX_X:
            self.pos.x = MAX_X

    def draw(self):
        self.rect = Rect(self.pos.x, self.pos.y, 32, 32)
        self.g.draw(self.game.screen.display)
Exemplo n.º 12
0
    def load_tiles(self, filename):
        try:
            self.tiles = Group()
            self.walls = Group()

            level = open(filename, 'r')
            line = level.readline().strip()
            while line != '[tiles]':
                line = level.readline().strip()

            self.sheet = int(level.readline().strip())
            set_tile_stats(self)
            self.set_areas()
            y = -self.tile_height
            line = level.readline().strip()
            while line and line != '[units]':
                x = 0
                y += self.tile_height
                for k in line.split(' '):
                    if not k.strip():
                        continue
                    tile = Tile(x, y, self.sheet, int(k), self)
                    self.tiles.add(tile)
                    if tile.kind in self.wall_kinds:
                        tile.flags |= FLAGS.WALL
                        self.walls.add(tile)
                    else:
                        tile.flags |= FLAGS.FLOOR
                    x += self.tile_width
                line = level.readline().strip()
            self.lw = x
            self.lh = y + self.tile_height
            level.close()
        except IOError:
            return self.load_default_tiles()
Exemplo n.º 13
0
    def load_default_tiles(self, columns=40, rows=30, sheet=0,
        kinds=(0, 1, 2)):
        self.sheet = sheet
        set_tile_stats(self)
        self.set_areas()
        self.lw = columns * self.tile_width
        self.lh = rows * self.tile_height
        self.tiles = Group()
        self.walls = Group()
        y = 0
        t = 0
        for r in xrange(rows):
            x = 0
            for c in xrange(columns):
                tile = Tile(x, y, sheet, kinds[t % len(kinds)], self)
                self.tiles.add(tile)
                if tile.kind in self.wall_kinds:
                    tile.flags |= FLAGS.WALL
                    self.walls.add(tile)
                else:
                    tile.flags |= FLAGS.FLOOR

                x += self.tile_width
                t += 1
            y += self.tile_height
Exemplo n.º 14
0
 def __init__(self):
     #setup
     pygame.init()
     pygame.font.init()
     self.font = pygame.font.Font(None,24)
     self.fontColor = (0,0,0)
     pygame.mixer.init()
     pygame.display.set_mode(SCREEN)
     pygame.display.set_caption('#ElJuegoDeLasJoincic')
     self.screen = pygame.display.get_surface()
     
     self._quit=False
     self.clock = pygame.time.Clock()
     self.controller= Controller()
     self.background = load_image("background.png")
     self.menu_background = load_image("menu_background.png")
     self.menu_iniciar = load_image("menu_iniciar.png")
     self.menu_salir = load_image("menu_salir.png")
     
     self.gameover = load_image("gameover.png")
     self.cursor = load_image("cursor.png")
     self.arrow = load_image("arrow.png")
     self.player = Player()
     self.group = Group()
     self.protocolo = Protocolo()
     self.group.add(self.player)
     
     self.groupOyentes = Group()
     self.groupTakitos = Group()
     self.groupHUD = Group()
     self.state= GAME_INIT
Exemplo n.º 15
0
class Level(object):

    _map = {
        "%": "flower",
        "~": "grass",
        ".": "path"
    }

    def __init__(self, name, tilesheet):
        # load level data
        path = os.path.join(DATA_DIR, "levels", name) + ".lvl"
        with open(path, "r") as f:
            data = f.read().strip().split("\n")

        # parse level data
        data = [ [ self._map.get(c) for c in row ] for row in data ]

        # build the level
        self.tiles, size = tilesheet.build(data)
        self.bounds = Rect((0,0), size)

        # find path
        self.path = Group()
        for tile in self.tiles:
            if tile.type == "path":
                self.path.add(tile)

        # render
        self.render_background()

        

    def render_background(self):
        self.background = Surface(self.bounds.size)
        self.tiles.draw(self.background)        
Exemplo n.º 16
0
    def __init__(self):
        Microgame.__init__(self)
        self.character_select = True
        self.player1_selector = Player1_Selector()
        self.player2_selector = Player2_Selector()
        self.falco = Falco_Selector()
        self.fox = Fox_Selector()
        self.samus = Samus_Selector()
        self.snake = Snake_Selector()
        self.pit = Pit_Selector()
        self.mewtwo = Mewtwo_Selector()
        self.zelda = Zelda_Selector()
        self.character_possibilities = Group(self.falco, self.fox, self.samus, self.snake, self.pit, self.mewtwo, self.zelda)
        self.sprites = OrderedUpdates(self.falco, self.fox, self.samus, self.snake, self.pit, self.mewtwo, self.zelda, self.player1_selector, self.player2_selector)
        self.player1 = Fox()
        self.player2 = Falco()
        self.p1victory = pygame.image.load(join('games', 'ssb', 'p1_win.png'))
        self.p2victory = pygame.image.load(join('games', 'ssb', 'p2_win.png'))

        self.platform = Final_Destination()

        self.p1win = False
        self.p2win = False
        self.wincondition = False

        self.a_track = False
        self.d_track = False
        self.lshift_track = False
        self.quote_track = False
        self.l_track = False
        self.rshift_track = False

        self.playergroup = Group(self.player1, self.player2)
        self.player1_projectiles = Group()
        self.player2_projectiles = Group()
Exemplo n.º 17
0
    def build_wave(self):
        """Creates the rectangular formation of enemies
        Enemy sprites are stored in the inherited Group and the instance formation
        """

        # build the formation and store in a 2d array indexed col, row
        self.formation = []
        for current_col in range(0, self.cols):
            col_list = []
            for current_row in range(0, self.rows):
                new_enemy = Enemy(self.window_size, self.sprite_filename, self.speed, current_col, current_row)

                left_pos = current_col * (self.gap + new_enemy.rect.width) + self.gap
                top_pos = current_row * (self.gap + new_enemy.rect.height) + self.gap
                new_enemy.rect = new_enemy.image.get_rect(left=left_pos, top=top_pos)

                col_list.append(new_enemy)
                Group.add(self, new_enemy)
            self.formation.append(col_list)

        self.leftmost_col = 0  # the left- and rightmost cols with living enemies
        self.rightmost_col = self.cols - 1
        self.move_delay_step = 0  # counts the frames between moves
        self.shoot_delay_step = 0  # counts the frames between shots
        self.current_vector = EAST  # the wave always starts by moving right
Exemplo n.º 18
0
class Player(Sprite):
    color = 255, 255, 0
    size = 20, 20
    
    def __init__(self, loc, bounds):
        Sprite.__init__(self)

        self.image = Surface(self.size)
        self.rect = self.image.get_rect()

        self.rect.center = loc
        self.bounds = bounds

        self.image.fill(self.color)
        self.bullets = Group()

    def update(self):
        self.rect.center = pygame.mouse.get_pos()
        self.rect.clamp_ip(self.bounds)

    def shoot(self):
        if not self.alive():
            return

        bullet = Bullet(self.bounds)
        bullet.rect.midbottom = self.rect.midtop
        self.bullets.add(bullet)
Exemplo n.º 19
0
class Player(Sprite):
    color = 255,25,69
    size = 20,20

    def __init__(self, loc, bounds):
        Sprite.__init__(self) #makes player a sprite object

        self.image = Surface(self.size)
        self.rect = self.image.get_rect() 

        self.rect.center = loc
        self.bounds = bounds

        self.image.fill(self.color)
        self.bullets = Group()

    def update(self):
        self.rect.center = pygame.mouse.get_pos() #player moves/stays with mouse
        self.rect.clamp_ip(self.bounds) #cant leave screen bounds

    def shoot(self):
        if not self.alive():
            return #stop doing anything in this function
        bullet = Bullet(self.bounds)
        bullet.rect.midbottom = self.rect.midtop 
        self.bullets.add(bullet)
Exemplo n.º 20
0
def _draw_cloud(
        tag_list, 
        surface, 
        layout=LAYOUT_MIX, 
        fontname=DEFAULT_FONT, 
        palette=DEFAULT_PALETTE, 
        fontzoom=5, 
        rectangular=False,
        order=True):
    #Sort the tags by size and word length
    tag_list.sort(key=lambda tag: len(tag['tag']))
    tag_list.sort(key=lambda tag: tag['size'])
    tag_list.reverse()

    if rectangular:
        spiral = _rectangular_spiral
    else:
        spiral = _archimedean_spiral

    sizeRect = surface.get_rect()
    tag_store = Group()

    if not order:
	random.shuffle(tag_list)   

    for tag in tag_list:
        rot = 0
        flip = False
        if layout == LAYOUT_MIX and randint(0, 2) == 0:
            rot = 90
        elif layout == LAYOUT_VERTICAL:
            rot = 90
        elif layout == LAYOUT_MOST_VERTICAL:
            rot = 90
            flip = True
        elif layout == LAYOUT_MOST_HORIZONTAL:
            flip = True
        
        #set color if tag has no color
        if not hasattr(tag, 'color'):
            pass
        
        currentTag = Tag(tag, (0, 0), rot, fontname=fontname, fontzoom=fontzoom)

        xpos = sizeRect.width - currentTag.rect.width
        if xpos < 0: xpos = 0
        xpos = randint(int(xpos * LOWER_START) , int(xpos * UPPER_START))
        currentTag.rect.x = xpos

        ypos = sizeRect.height - currentTag.rect.height
        if ypos < 0: ypos = 0
        ypos = randint(int(ypos * LOWER_START), int(ypos * UPPER_START))
        currentTag.rect.y = ypos

        _search_place(currentTag, tag_store, sizeRect, spiral, flip)

        tag_store.add(currentTag)
        surface.blit(currentTag.image, currentTag.rect)
    return tag_store
Exemplo n.º 21
0
 def update(self):
     """Updates cells' positions only if target is followable"""
     
     if self.target.is_followable():
         Group.update(self)
         
     if self.delay > 0:
         self.delay -= 1
Exemplo n.º 22
0
 def __init__(self):
     Microgame.__init__(self)
     self.ball=Ball()
     self.ball1=Group(self.ball)
     self.entities=Group()
     self.Sound=pygame.mixer.Sound(join('games','fall','ball.wav'))
             #self.entities=Group([self.fall])
     self.timer=pygame.time.Clock()
     self.time=0
Exemplo n.º 23
0
 def remove(self, *sprites):
     
     for current_sprite in sprites:
         if current_sprite not in self: continue
         
         row, col = self.get_cell_row_col(current_sprite)
         self.cells[row][col] = None
         
     Group.remove(self, *sprites)
Exemplo n.º 24
0
    def __init__(self, loc, bounds):
        
        # Call parent's constructor
        pygame.sprite.Sprite.__init__(self)

        # Player PNG
        sprite_sheet = SpriteSheet("p1_gunwalk.png")
        # Load all the right facing images into a list
        image = sprite_sheet.get_image(0, 0, 64, 78)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(64, 0, 64, 78)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(128, 0, 64, 78)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(192, 0, 64, 78)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(256, 0, 64, 78)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(320, 0, 64, 78)
        self.walking_frames_r.append(image)
        image = sprite_sheet.get_image(640, 0, 64, 78)
        self.walking_frames_r.append(image)

        # Load all the right facing images, then flip them
        # to face left.
        image = sprite_sheet.get_image(0, 0, 64, 78)
        image = pygame.transform.flip(image, True, False)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(64, 0, 64, 78)
        image = pygame.transform.flip(image, True, False)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(128, 0, 64, 78)
        image = pygame.transform.flip(image, True, False)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(192, 0, 64, 78)
        image = pygame.transform.flip(image, True, False)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(256, 0, 64, 78)
        image = pygame.transform.flip(image, True, False)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(320, 0, 64, 78)
        image = pygame.transform.flip(image, True, False)
        self.walking_frames_l.append(image)
        image = sprite_sheet.get_image(640, 0, 64, 78)
        image = pygame.transform.flip(image, True, False)
        self.walking_frames_l.append(image)

        # Set the image the player starts with
        self.image = self.walking_frames_r[0]
 
        # Reference the image rect.
        self.rect = self.image.get_rect()

        self.rect.center = loc
        self.bounds = bounds
        self.bullets = Group()
        self.bulletcasings = Group()
Exemplo n.º 25
0
    def __init__(self, config, screen):
        """Initialize the sprite list."""
        self.config = config
        self.screen = screen

        #initialize the sprites
        self.wiz = Wizard(config, self)
        self.monsters = Group()
        self.missiles = Group()
Exemplo n.º 26
0
class Scoreboard():
    def __init__(self, ai_setting, screen, stats):
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.ai_setting = ai_setting
        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):
        # -1 means multi 10
        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_setting.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_setting.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_setting.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_number in range(self.stats.ships_left):
            ship = Ship(self.ai_setting, 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)

        # draw ships
        self.ships.draw(self.screen)
Exemplo n.º 27
0
Arquivo: map.py Projeto: nowl/games
 def __init__(self, map, imageCache, rectPixelView, imWidth, imHeight):
     Group.__init__(self)
     self._changeListeners = []
     self.map = map
     self.worldRect = Rect(0, 0, self.map.width * imWidth, self.map.height * imHeight)
     self.imageCache = imageCache
     self.imageSize = (imWidth, imHeight)
     self.offsetX = 0
     self.offsetY = 0
     self.setView(rectPixelView)
Exemplo n.º 28
0
 def __init__(self):
     self.game = Game()
     floorframe = Frame(self.game.screen, Rect(0, 542, MAX_X + 36, 596))
     self.floor = TiledMap(self.game, floorframe)
     self.floor.fill_map('#', (25, 2))
     self.player = Player(self.game)
     self.aliens = Group()
     self.create_aliens()
     self.shots = Group()
     self.alien_shots = Group()
Exemplo n.º 29
0
class CollectCoinMicrogame(Microgame):
    def __init__(self):
        # TODO: Initialization code here
        Microgame.__init__(self)
        self.coins = coin(0) #coin(locals.HEIGHT + 70)]
        self.ironman = ironman()
        self.sprites = Group(self.ironman, self.coins)
        self.time = pygame.time.get_ticks()

    def start(self):
        # TODO: Startup code here
        music.load(os.path.join("games", "catching", "super_mario_levels.wav"))
        music.play()

    def stop(self):
        # TODO: Clean-up code here
        music.stop()
        self.lose()

    def update(self, events):
        # TODO: Update code here
        self.sprites.update()
        ctrls = pygame.key.get_pressed()
        if ctrls[K_q]:
            self.win()
        elif ctrls[K_a] or ctrls[K_LEFT]:
            self.ironman.rect.x = max(self.ironman.rect.x - 30, 0)
        elif ctrls[K_d] or ctrls[K_RIGHT]:
            self.ironman.rect.x = min(locals.WIDTH - 68, self.ironman.rect.x + 30)
        if self.coins.rect.colliderect(self.ironman):
            # self.time = pygame.time.get_ticks()
            # self.sprites.remove(self.coins)
            # print str(self.time) + " " + str(pygame.time.get_ticks())
            # if self.time + 3000 <= pygame.time.get_ticks():
            # self.coins = coin(0)
                # self.sprites.add(self.coins)
            self.coins.rect.y = 0
            self.coins.velocity = 0
            self.coins.rect.left = randint(0, locals.WIDTH - COIN_WIDTH)
                # self.sprites.update()
        elif self.coins.rect.top > locals.HEIGHT:
            self.lose()

    def render(self, surface):
        # TODO: Rendering code here
        surface.fill(Color(0, 0, 0))
        imgpath = os.path.join("games", "catching", "8bitsky.jpg")
        test_image = pygame.image.load(imgpath)
        surface.blit(test_image,(0,0))
        self.sprites.draw(surface)

    def get_timelimit(self ):
        # TODO: Return the time limit of this game (in seconds)
        return 15
        
Exemplo n.º 30
0
Arquivo: map.py Projeto: nowl/deforium
 def __init__(self, map, imageCache, rectPixelView, imWidth, imHeight):
     Group.__init__(self)
     self._changeListeners = []
     self.upperLeft = [0, 0]
     self.numTiles = (int(rectPixelView.width / imWidth), int(rectPixelView.height / imHeight))
     self.map = map
     self.imageCache = imageCache
     self.imageSize = (imWidth, imHeight)
     self.offsetX = 0
     self.offsetY = 0
     self.setView(rectPixelView)
Exemplo n.º 31
0
# Start Music
pygame.mixer.music.load("Sounds/theme.mp3")

# Make the Play button.
play_button = Button(ai_settings, screen, "Play")

# Make the High Scores button.
score_button = HighScoreButton(ai_settings, screen, "High Scores")

# Create an instance to store game statistics and create a scoreboard.
stats = GameStats(ai_settings)
sb = Scoreboard(ai_settings, screen, stats)

# Make a ship, a group of bullets, and a group of aliens.
ship = Ship(ai_settings, screen)
bullets = Group()
aliens = Group()
gf.create_fleet(ai_settings, screen, ship, aliens)

# Time
clock = pygame.time.Clock()
fps = 120

# images for title
alien1Img = pygame.image.load('Images/Alien1-1.png')
alien2Img = pygame.image.load('Images/Alien2-1.png')
alien3Img = pygame.image.load('Images/Alien3-1.png')


def alien_pics(image, x1, y1):
    screen.blit(image, (x1, y1))
Exemplo n.º 32
0
class Scoreboard:
    def __init__(self, ai_game):
        self.ai_game = ai_game
        self.screen = ai_game.screen
        self.screen_rect = self.screen.get_rect()
        self.settings = ai_game.settings
        self.stats = ai_game.stats

        self.text_color = (230, 230, 230)
        self.font = pygame.font.SysFont(None, 48)

        self.prep_score()
        self.prep_highscore()
        self.prep_level()
        self.prep_ships()

    def prep_score(self):
        """Turn score into rendered image"""
        rounded_score = round(self.stats.score, -1)
        score_str = "{:,}".format(rounded_score)
        self.score_image = self.font.render(score_str, True, self.text_color,
                                            self.settings.bg_colour)
        # Display score at top right of screen
        self.score_rect = self.score_image.get_rect()
        self.score_rect.right = self.screen_rect.right - 20
        self.score_rect.top = 20

    def prep_highscore(self):

        rounded_highscore = round(self.stats.highscore)
        highscore_str = "{:,}".format(rounded_highscore)
        self.highscore_image = self.font.render(highscore_str, True,
                                                self.text_color,
                                                self.settings.bg_colour)

        self.highscore_rect = self.highscore_image.get_rect()
        self.highscore_rect.centerx = self.screen_rect.centerx
        self.highscore_rect.top = self.score_rect.top

    def show_score(self):
        self.screen.blit(self.score_image, self.score_rect)
        self.screen.blit(self.highscore_image, self.highscore_rect)
        self.screen.blit(self.level_image, self.level_rect)
        self.ships.draw(self.screen)

    def check_highscore(self):

        if self.stats.score > self.stats.highscore:
            self.stats.highscore = self.stats.score
            self.prep_highscore()

    def prep_level(self):
        level_str = str(self.stats.level)
        self.level_image = self.font.render(level_str, True, self.text_color,
                                            self.settings.bg_colour)

        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_number in range(self.stats.ships_left):
            ship = Ship(self.ai_game)
            ship.image = pygame.transform.scale(ship.image, (30, 60))
            ship.rect.x = 10 + ship_number * ship.rect.width
            ship.rect.y = 10
            self.ships.add(ship)
Exemplo n.º 33
0
def run_game():
    #initialise and create the screen object
    pygame.init()
    gs = Settings()
    screen = pygame.display.set_mode((gs.screen_width, gs.screen_heigh))
    pygame.display.set_caption("Invaders Must Die")

    #play some music
    print(gs.musicName)
    print(gs.musicPath)
    #pygame.mixer.init
    #pygame.mixer.music.load(gs.musicPath)
    #pygame.mixer.music.play(-1)

    #Create sounds object
    sounds = gameSounds(gs.musicPath, gs.endGameMusic, gs.laserSoundsPath)
    #sounds.playBgMusic()

    #Create the Rocket
    rocket = Rocket(screen, gs)

    #group for the bullets
    bullets = Group()

    #Create an ALien
    alien = Alien(screen, gs)

    #create a group for the aliens
    aliens = Group()

    #create fleet
    funcs.create_fleet(aliens, gs, screen, rocket)

    #set up game stats
    stats = GameStats(gs)

    #create play button
    play_button = Button(gs, screen, "Play Game", gs.green_button)

    #create play button
    game_over = Button(gs, screen, "Game Over", gs.red_button)

    #Create a Scoreboard
    SB = Scoreboard(gs, screen, stats)

    #control the frame rate of the game
    clock = pygame.time.Clock()
    FRAMERATE = 150

    #start the main loop of the program
    while True:
        #clock.tick(FRAMERATE)
        funcs.check_events(rocket, screen, bullets, gs, play_button, stats, SB,
                           aliens, screen, sounds)
        if stats.game_active == True:
            rocket.update_position()

            #check if the bullets have gone off the screen
            funcs.update_bullets(bullets, aliens, screen, rocket, gs, stats,
                                 SB)

            #print(len(bullets))
            funcs.update_aliens(aliens, gs, rocket, bullets, screen, stats, SB,
                                sounds)

        funcs.update_screen(screen, rocket, gs, bullets, aliens, play_button,
                            stats, game_over, SB)
Exemplo n.º 34
0
def run_game():
    global bullets_die
    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()
    alienbullets = Group()
    stats = GameStats(ai_settings)

    aliens = Group()
    alien = Alien(ai_settings, screen)
    alien_width = alien.rect.width
    available_spase_x = ai_settings.screen_width - 2 * alien_width
    number_aliens_x = int(available_spase_x / (2 * alien_width))
    number_rows = get_number_rows(ai_settings, ship.rect.height,
                                  alien.rect.height)
    alien.y = -90
    alien.rect.y = alien.y
    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):

            #    print(alien.rect.y)

            create_alien(ai_settings, screen, aliens, alien_number, row_number)
    # aliens.add(alien)

    bg_color = (20, 250, 200)
    while True:

        #    print(alien.rect.y)
        # tre = randint(-1000,1000)
        # if tre == 1:
        #     alien.y = 0
        #     create_alien(ai_settings,screen,aliens,alien_number,row_number)
        # if tre >= 990:
        #     bullets_die = False
        #     for row_number in range(number_rows):
        #         for alien_number in range(number_aliens_x):

        #         #    print(alien.rect.y)

        #             create_alien(ai_se
        for event in pygame.event.get():

            #for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN:
                mouse_x, mouse_y = pygame.mouse.get_pos()
                if ship.rect.collidepoint(mouse_x, mouse_y):
                    ship.image = pygame.image.load(choice(images))
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_1:
                    first = randint(0, 220)
                    second = randint(0, 220)
                    three = randint(0, 220)
                    ai_settings.bg_color = (first, second, three)
                if event.key == pygame.K_b:
                    sys.exit()

                if event.key == pygame.K_RIGHT:

                    ship.movin_right = True
                if event.key == pygame.K_SPACE:
                    if len(bullets) < ai_settings.bullet_allowed:

                        new_bullet = Bullet(ai_settings, screen, ship)
                        bullets.add(new_bullet)

                if event.key == pygame.K_LEFT:
                    ship.movin_left = True
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    ship.movin_right = False
                if event.key == pygame.K_LEFT:
                    ship.movin_left = False
        bullets.update()

        ship.update()

        aliens.update()

        ship.blitme()
        ship.update()
        aliens.draw(screen)

        pygame.display.flip()
Exemplo n.º 35
0
def run_game():
    global bullets_die

    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()
    ships = Group()
    #ships.add(ship)

    bg_color = (20, 250, 200)
    while True:

        pygame.mouse.set_visible(True)

        #    print(alien.rect.y)
        # tre = randint(-1000,1000)
        # if tre == 1:
        #     alien.y = 0
        #     create_alien(ai_settings,screen,aliens,alien_number,row_number)
        # if tre >= 990:
        #     bullets_die = False
        #     for row_number in range(number_rows):
        #         for alien_number in range(number_aliens_x):

        #         #    print(alien.rect.y)

        #             create_alien(ai_settings,screen,aliens,alien_number,row_number)
        for event in pygame.event.get():

            #for event in pygame.event.get():

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_1:
                    first = randint(0, 220)
                    second = randint(0, 220)
                    three = randint(0, 220)
                    ai_settings.bg_color = (first, second, three)
                if event.key == pygame.K_b:
                    sys.exit()
                if event.key == pygame.K_RIGHT:

                    ship.movin_right = True
                if event.key == pygame.K_SPACE:
                    print("IOU")
                    for alien in ships.sprites():

                        new_bullet = Bullet(ai_settings, screen, alien, 0, 0)
                        bullets.add(new_bullet)
                    print(len(ships))
                    print(len(bullets))

                if event.key == pygame.K_LEFT:
                    ship.movin_left = True
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    ship.movin_right = False
                if event.key == pygame.K_LEFT:
                    ship.movin_left = False
            elif event.type == pygame.MOUSEBUTTONDOWN:
                turtle = 0
                mouse_x, mouse_y = pygame.mouse.get_pos()
                ship = Ship(ai_settings, screen, mouse_x, mouse_y)
                ships.add(ship)
                for alien in ships.sprites():

                    if alien.rect.collidepoint(mouse_x, mouse_y):
                        new_bullet = Bullet(ai_settings, screen, alien,
                                            mouse_x, mouse_y)
                        bullets.add(new_bullet)
                        turtle = 1
                if turtle == 1:
                    #shi[]
                    ship = Ship(ai_settings, screen, mouse_x, mouse_y)
                    ships.add(ship)
        ships.update()

        bullets.update()
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)

        screen.fill(ai_settings.bg_color)
        for bullet in bullets.sprites():
            bullet.draw_bullet()

        chek_fleet_edges(ai_settings, aliens)
        aliens.update()
        for bullet in ships.sprites():
            bullet.blitme()
            first = randint(0, 200)
            second = randint(0, 200)
            three = randint(0, 200)
            ai_settings.bullet_color = (first, second, three)

        pygame.display.flip()
Exemplo n.º 36
0
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, 30)

        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 = "{:,}pt".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):
        """  """
        rounded_high_score = int(round(self.stats.high_score, -1))
        high_score_str = "{:,}pt".format(rounded_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.screen_rect.top

    def prep_level(self):
        """  """
        level_str = str(self.stats.level)
        self.level_image = self.font.render(level_str, 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_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 = 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)
Exemplo n.º 37
0
class MainScene(game.Scene):
    def __init__(self, manager):
        game.Scene.__init__(self, manager)
        self.group_labels = Group()
        self.group_buttons = Group()
        self.ui_events = game.UI_Events()

        self.font = pygame.font.Font(None, 28)
        position = self.state.manager.rect.right - 20, 20
        self.label = game.Label("Press A Button", self.font, game.color.snow,
                                position, "topright")

        y = itertools.count(20, 32)
        rect = pygame.Rect(20, 0, 150, 30)
        for letter in "ABC":
            name = "Button " + letter
            rect.y = next(y)
            self.create_button(name, rect.copy(), self.push_button,
                               "You push " + name)

        x = 20
        y = itertools.count(200, 40)
        red_toggle = self.create_toggle_button("red", (x, next(y)),
                                               self.toggle_color)
        self.create_toggle_button("lawngreen", (x, next(y)), self.toggle_color)
        self.create_toggle_button("dodgerblue", (x, next(y)),
                                  self.toggle_color)
        red_toggle.set_toggle()

        self.toggle = red_toggle
        self.toggle_surface = pygame.Surface((400, 120))
        self.toggle_surface.fill(game.color.red)

    def create_button(self, text, rect, callback, user_data):
        button = game.Button(text, self.font, game.color.snow, rect, callback,
                             user_data)
        renderer = game.Renderer(button, game.color.dodgerblue * 0.75,
                                 game.color.dodgerblue,
                                 game.color.dodgerblue * 0.5,
                                 self.group_buttons)
        self.ui_events.add(button)

    def create_toggle_button(self, text, position, callback):
        rect = pygame.Rect(0, 0, 30, 30)
        foreground = pygame.Surface(rect.size, pygame.SRCALPHA)
        foreground.fill((0, 0, 0, 0))

        hover = foreground.copy()
        toggle = foreground.copy()
        pygame.draw.rect(foreground, game.color.dodgerblue * 0.75, rect, 7)
        pygame.draw.rect(hover, game.color.dodgerblue, rect, 7)
        pygame.draw.rect(toggle, game.color.dodgerblue * 0.5, rect, 7)
        pygame.draw.rect(toggle, game.color.dodgerblue * 0.5,
                         rect.inflate(-20, -20))

        b_rect = pygame.Rect(position, (30, 30))
        button = game.DraftButton(b_rect, callback, text, True)
        renderer = game.Renderer(button, foreground, hover, toggle,
                                 self.group_buttons)
        self.ui_events.add(button)
        position = b_rect.x + 36, b_rect.centery
        color = pygame.Color(text)
        label = game.Label(text.capitalize(), self.font, color, position,
                           "midleft", self.group_labels)
        return button

    def on_draw(self, surface):
        surface.fill(game.color.black)
        surface.blit(self.toggle_surface, (200, 200))
        self.label.draw(surface)
        self.group_labels.draw(surface)
        self.group_buttons.draw(surface)

    def on_event(self, event):
        self.ui_events.process_event(event)

    def push_button(self, button):
        self.label.set_text(button.user_data)

    def toggle_color(self, button):
        self.toggle.set_toggle(False)
        self.toggle = button
        self.toggle_surface.fill(pygame.Color(button.user_data))
Exemplo n.º 38
0
class Scoreboards():
    #  显示得分信息的类
    def __init__(self, global_set, screen, stats):
        #  初始化显示得分涉及的属性
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.global_set = global_set
        self.stats = stats
        # 显示得分信息时使用的字体设置
        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None, 48)
        #  确定分数栏高度、宽度、背景色
        self.score_bar_height = 50
        self.score_bar_width = self.screen_rect.width
        self.score_bar_bg_color = (180, 180, 255)
        self.get_score_bar_height()
        #  准备分数栏图片,仅初始化时生成一次
        self.prep_score_bar()
        # 准备包含最高得分、当前得分、等级和飞船数的图像
        self.prep_images()

    def get_score_bar_height(self):
        self.high_test_image = self.font.render("Test_Height", True,
                                                self.text_color,
                                                self.global_set.bg_color)
        self.high_test_rect = self.high_test_image.get_rect()
        self.score_bar_height = self.high_test_rect.height * 1.5

    def prep_images(self):
        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_ships()

    def prep_score_bar(self):
        #  准备分数栏图片
        #  创建按钮的 rect 对象,并使其居中
        self.score_bar_rect = pygame.Rect(0, 0, self.score_bar_width,
                                          self.score_bar_height)
        self.score_bar_rect.center = self.screen_rect.center
        self.score_bar_rect.top = self.screen_rect.top

    def prep_score(self):
        #  将得分转换为一幅渲染的图像
        #  取整
        rounded_score = int(round(self.stats.score, -1))
        score_str = "{:,}".format(rounded_score)
        score_str = 'Score:' + score_str
        self.score_image = self.font.render(score_str, True, self.text_color,
                                            self.score_bar_bg_color)
        # 将得分放在屏幕右上角
        self.score_rect = self.score_image.get_rect()
        self.score_rect.centery = self.score_bar_rect.centery
        self.score_rect.right = self.screen_rect.right - 20

    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)

    def prep_high_score(self):
        #  将最高得分转换为渲染的图像
        high_score = int(round(self.stats.high_score, -1))
        high_score_str = "{:,}".format(high_score)
        high_score_str = 'Best:' + high_score_str
        self.high_score_image = self.font.render(high_score_str, True,
                                                 self.text_color,
                                                 self.score_bar_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.centery = self.score_bar_rect.centery

    def prep_level(self):
        #  将等级转换为渲染的图像
        alien_level_str = 'Level:' + str(self.stats.level)
        self.level_image = self.font.render(alien_level_str, True,
                                            self.text_color,
                                            self.score_bar_bg_color)
        # 将等级放在得分左方
        self.level_rect = self.level_image.get_rect()
        self.level_rect.right = self.score_rect.right - 260
        self.level_rect.centery = self.score_bar_rect.centery

    def prep_ships(self):
        #  显示还余下多少艘飞船
        self.ships = Group()
        for ship_number in range(self.stats.ships_left):
            ship = Ships(self.global_set, self.screen)
            ship.rect.x = 10 + ship_number * ship.rect.width
            ship.rect.y = 0
            self.ships.add(ship)
Exemplo n.º 39
0
class Scoreboard:
    """A class to report scoring information."""
    def __init__(self, ai_game):
        """Initialize scorekeeping attributes."""

        self.ai_game = ai_game
        self.screen = ai_game.screen
        self.screen_rect = self.screen.get_rect()
        self.settings = ai_game.settings
        self.stats = ai_game.stats
        # Font settings for scoring information.
        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None, 48)

        self.prep_images()

    def prep_images(self):
        """Prepare the initial score images."""
        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_ships()
        self.check_if_high_score()

    def prep_score(self):
        """Turn the score into a rendered image."""

        rounded_score = round(self.stats.score, -1)
        score_str = "{:,}".format(rounded_score)
        self.score_image = self.font.render(score_str, True, self.text_color,
                                            self.settings.bg_color)
        # Display the score at the top right of the screen.
        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):
        """Turn the high score into a rendered image."""

        high_score = 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.settings.bg_color)
        # Center the high score at the top of the screen.
        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 show_score(self):
        """Draw scores, level, and ships to the screen."""

        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)

    def check_high_score(self):
        """Check to see if there's a new high score."""

        if self.stats.score > self.stats.high_score:
            self.stats.high_score = self.stats.score
            self.prep_high_score()
            self.prep_level()
            self.prep_ships()
            self.write_high_score()

    def check_if_high_score(self):
        filename = 'high_score.json'
        try:
            with open(filename) as f:
                self.stats.high_score = json.load(f)
                self.prep_high_score()
        except FileNotFoundError:
            pass
        else:
            print("Brand new game - no new high_score")

    def write_high_score(self):
        filename = 'high_score.json'
        with open(filename, 'w') as f:
            json.dump(self.stats.score, f)

    def prep_level(self):
        """Turn the level into a rendered image."""

        level_str = str(self.stats.level)
        self.level_image = self.font.render(level_str, True, self.text_color,
                                            self.settings.bg_color)
        # Position the level below the score.
        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):
        """Show how many ships are left."""

        self.ships = Group()
        for ship_number in range(self.stats.ships_left):
            ship = Ship(self.ai_game)
            ship.rect.x = 10 + ship_number * ship.rect.width
            ship.rect.y = 10
            self.ships.add(ship)
Exemplo n.º 40
0
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):
		"""将得分转换为一幅渲染的图像"""
		#round让小数精确到小数点后多少位,负数表示将数圆整到近10,100,1000等的整数倍
		rounded_score=int(round(self.stats.score,-1))
		#将数值转换为字符串时在其中插入逗号
		score_str="{:,}".format(rounded_score)
		#score_str=str(self.stats.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):
		"""将最高分转换为一幅渲染的图像"""
		#round让小数精确到小数点后多少位,负数表示将数圆整到近10,100,1000等的整数倍
		rounded_score=int(round(self.stats.high_score,-1))
		#将数值转换为字符串时在其中插入逗号
		high_score_str="{:,}".format(rounded_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 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)
		
	def prep_ships(self):
		"""显示还余下多少艘飞船"""
		self.ships=Group()
		for ship_number in 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)
Exemplo n.º 41
0
def run_game():
    pg.init()
    bullet_sound = pg.mixer.Sound("Bullet.wav")
    pg.mixer.music.load("music.wav")
    AI = Settings()
    stats = Gamestats(AI)
    # to store the bullets
    alien_bullets_shoot = Group()
    bullets = Group()
    aliens = Group()
    screen = pg.display.set_mode((AI.screen_width, AI.screen_height))
    pg.display.set_caption("Space Wars")
    print(str(AI.screen_width) + " " + str(AI.screen_height))
    my_ship = ship(AI, screen, "my_ship.png", AI.screen_width / 2,
                   AI.screen_height - 30)
    wallpaper = ship(AI, screen, "space.png", AI.screen_width / 2,
                     AI.screen_height)
    # To make a play button
    play_button = Button(AI, screen, "Play", AI.screen_width / 2 - 50,
                         AI.screen_height / 2 - 150, 42, (0, 0, 255),
                         (0, 255, 0), 0)
    exit_button = Button(AI, screen, "Exit", AI.screen_width / 2 - 50,
                         AI.screen_height / 2 + 50, 42, (0, 0, 255),
                         (0, 255, 0), 0)
    scoreboard = Button(AI, screen, "Leaderboard", AI.screen_width / 2 - 50,
                        AI.screen_height / 2 - 50, 40, (0, 0, 255),
                        (0, 255, 0), 50)
    GameOver = Button(AI, screen, "Game over", AI.screen_width / 2 - 50,
                      AI.screen_height / 2, 50, (0, 0, 0), (0, 255, 0), 0)
    bullet = Bullet(AI, screen, my_ship)
    no_aliens = f.find_no_aliens(AI, screen, "alienship.png")
    temp = 0
    x = []
    count = 0
    tmp = random.randint(8, no_aliens)
    for c in range(tmp):
        x.append(c + 1)
    random.shuffle(x)
    pg.mixer.music.play(-1)
    while True:
        with open("file.txt") as score:
            last_score = score.read()
        if stats.ship_left > 0 and stats.game_active:
            count = 1
            if len(aliens) == 0:
                bullets.empty()
                if stats.game_active:
                    AI.increase_speed()
                    AI.score_increase += 2
                    AI.player_level += 1
                temp = 0
                x = []
                tmp = random.randint(no_aliens - 4, no_aliens)
                for c in range(tmp):
                    x.append(c + 1)
                    random.shuffle(x)
            f.event_check(AI, screen, my_ship, bullets, stats, play_button,
                          aliens, bullets, bullet_sound, exit_button)
            if stats.game_active:
                if temp < tmp:
                    temp = f.create_fleet(AI, screen, aliens, "alienship.png",
                                          no_aliens, temp, x)
                my_ship.update()
                f.bullets_collision_check(AI, aliens, bullets)
                f.update_screen(AI, screen, my_ship, bullets, aliens, stats,
                                "my_ship.png", alien_bullets_shoot, last_score)
                delete_bullets(bullet, bullets)
                f.display_aliens(screen, AI, aliens, my_ship, stats, bullets)
            if not stats.game_active:
                wallpaper.blitme()
                play_button.draw_button()
                exit_button.draw_button()
                scoreboard.draw_button()
            pg.display.update()
        else:
            if count == 1:
                c = 5
                if int(last_score) < int(AI.player_score):
                    with open("file.txt", 'w') as file_object:
                        file_object.write(str(AI.player_score))
                pg.mixer.music.pause()
                while c > 0:
                    screen.fill((0, 0, 0))
                    msg = "Re-directing to main menu in....... " + str(c)
                    new_game = Button(AI, screen, msg,
                                      AI.screen_width / 2 - 100, 30, 25,
                                      (0, 0, 0), (255, 0, 0), 0)
                    new_game.draw_button()
                    GameOver.draw_button()
                    pg.display.update()
                    time.sleep(1)
                    c -= 1
                count = 0
            elif count == 0:
                wallpaper.blitme()
                play_button.draw_button()
                exit_button.draw_button()
                scoreboard.draw_button()
                pg.display.update()
                stats.game_active = False
                f.event_check(AI, screen, my_ship, bullets, stats, play_button,
                              aliens, bullets, bullet_sound, exit_button)
                pg.mixer.music.unpause()

    pg.display.flip()
Exemplo n.º 42
0
def process(q, cmd_thread):
    # 初始化
    pygame.init()
    updated_frame = False  # update a frame
    settings = Settings("data\program_settings.json")
    screen = pygame.display.set_mode(
        (32 * settings.screen_scale + 2 * settings.screen_offset,
         28 * settings.screen_scale + 2 * settings.screen_offset))
    sbd = ScoreBoard("data\hiscore.csv")
    passwd = Password(settings, screen)
    tfunc.print_welcome()

    team_flights = Group()
    enemy_flights = Group()

    team1 = TeamFlight([0.8, 0.8], [3.5, 0.5], [1.5, 1.5], [1.5, 26], settings,
                       screen)
    team1.print_info()
    team_flights.add(team1)
    team2 = TeamFlight([0.8, 0.8], [5.5, 0.5], [5.5, 1.5], [5.5, 26], settings,
                       screen)
    team2.print_info()
    team_flights.add(team2)
    team3 = TeamFlight([0.8, 0.8], [9.5, 0.5], [9.5, 1.5], [9.5, 26], settings,
                       screen)
    team3.print_info()
    team_flights.add(team3)
    team4 = TeamFlight([0.8, 0.8], [11.5, 0.5], [13.5, 1.5], [13.5, 26],
                       settings, screen)
    team4.print_info()
    team_flights.add(team4)

    enemy1 = EnemyFlight([0.8, 0.8], [2, 10],
                         settings,
                         screen,
                         rotate_angle=math.pi / 100)
    enemy1.set_velocity([0, -0.11])
    enemy1.print_info()
    enemy_flights.add(enemy1)
    enemy2 = EnemyFlight([0.8, 0.8], [13, 10],
                         settings,
                         screen,
                         rotate_angle=math.pi / 100)
    enemy2.set_velocity([0, 0.11])
    enemy2.print_info()
    enemy_flights.add(enemy2)
    enemy3 = EnemyFlight([0.8, 0.8], [2, 18],
                         settings,
                         screen,
                         rotate_angle=math.pi / 100)
    enemy3.set_velocity([0, -0.11])
    enemy3.print_info()
    enemy_flights.add(enemy3)
    enemy4 = EnemyFlight([0.8, 0.8], [13, 18],
                         settings,
                         screen,
                         rotate_angle=math.pi / 100)
    enemy4.set_velocity([0, 0.11])
    enemy4.print_info()
    enemy_flights.add(enemy4)

    person = Person([0.8, 0.8], [7.5, 0.9], settings, screen)
    boxes = Boxes(settings, screen)

    pygame.display.set_caption("Explore Reactor Room")
    tfunc.update_screen(settings, screen, team_flights, enemy_flights, person,
                        boxes, passwd, sbd)

    follow_status = False

    while True:
        start_time = time.time()
        period_timeout = True

        if settings.reset_request:  # game reset
            settings.reset_request = False
            settings.paused = False
            settings.init_game_args()
            if settings.game_mode != 0:  # set enemy mode according to game mode
                settings.enemy_status = settings.game_mode + 3
            person.reinit([0.8, 0.8], [7.5, 0.9])
            boxes.reinit()
            team1.reinit([0.8, 0.8], [3.5, 0.5], [1.5, 1.5], [1.5, 26])
            team2.reinit([0.8, 0.8], [5.5, 0.5], [5.5, 1.5], [5.5, 26])
            team3.reinit([0.8, 0.8], [9.5, 0.5], [9.5, 1.5], [9.5, 26])
            team4.reinit([0.8, 0.8], [11.5, 0.5], [13.5, 1.5], [13.5, 26])
            enemy1.reinit([0.8, 0.8], [2, 10], rotate_angle=math.pi / 100)
            enemy1.set_velocity([0, -0.11])
            enemy2.reinit([0.8, 0.8], [13, 10], rotate_angle=math.pi / 100)
            enemy2.set_velocity([0, 0.11])
            enemy3.reinit([0.8, 0.8], [2, 18], rotate_angle=math.pi / 100)
            enemy3.set_velocity([0, -0.11])
            enemy4.reinit([0.8, 0.8], [13, 18], rotate_angle=math.pi / 100)
            enemy4.set_velocity([0, 0.11])
            settings.enemy_status_changed = True
            passwd.generate_passwd()

        if settings.run_active and not settings.paused:
            # 帧开始,执行每一帧的预处理
            settings.timer = settings.timer + settings.time_period  # 计算时间
            if settings.clock_1 > 0:  # 计算clock1时间
                settings.clock_1 -= 1
            else:
                settings.clock_1 = 30
                settings.change_font_color()

            n_flights = len(team_flights.sprites()) + len(
                enemy_flights.sprites())  #包含自己一共的飞机数
            p_all = [[0, 0] for i in range(n_flights)]
            p_all_direction = [0 for i in range(n_flights)]
            index = 0
            for team in team_flights.sprites():
                p_all[index] = team.get_info()[0]
                p_all_direction[index] = 0
                index = index + 1
            for enemy in enemy_flights.sprites():
                p_all[index] = enemy.get_info()[0]
                p_all_direction[index] = enemy.get_direction()
                index = index + 1

            # 更新其它状态
            person.move()
            boxes.update_info(settings, person)
            settings.all_open = boxes.all_open()
            if settings.all_open and person.get_info(
            )[0][1] <= 0.5 and not settings.failed:
                settings.complete = True
            elif (settings.timer > 480 or person.get_hp_info()[0] <= 0
                  or settings.out_times * settings.time_period >= 10.0
                  ) and not settings.complete:
                settings.failed = True
            if settings.complete and settings.game_mode != 0 and not settings.hiscore_recorded:
                settings.hiscore_recorded = True
                sbd.set_new_hiscore(settings.game_mode - 1,
                                    settings.complete_time)  # set hiscore
                sbd.write_hiscore()

            # 敌方无人机行动
            if settings.enemy_status == 0:  # 敌方无人机悬停
                for enemy in enemy_flights.sprites():
                    enemy.set_velocity([0, 0])
                    enemy.move()
                    if settings.enemy_status_changed:
                        enemy.set_attack_args(2.4, 5.0)
                    enemy.attack(person, boxes)

            elif settings.enemy_status == 1:  # 敌方无人机直线运动
                for enemy in enemy_flights.sprites():
                    enemy.move()
                    if settings.enemy_status_changed:
                        enemy.set_attack_args(2.4, 5.0)
                    enemy.attack(person, boxes)

            elif settings.enemy_status == 2:  # 敌方无人机圆周运动
                for enemy in enemy_flights.sprites():
                    enemy.move_circle()
                    if settings.enemy_status_changed:
                        enemy.set_attack_args(2.4, 5.0)
                    enemy.attack(person, boxes)

            elif settings.enemy_status == 3:  # 敌方无人机逼近己方无人机
                for enemy, team in zip(enemy_flights.sprites(),
                                       team_flights.sprites()):
                    team_p_flight = team.get_info()[0]
                    enemy_p_flight = enemy.get_info()[0]
                    team_p_flight = [
                        team_p_flight[0] + random.random() * 4 - 2,
                        team_p_flight[1] + 1.5 + random.random() * 4 - 2
                    ]
                    [vx, vy] = apf.compute_next_step(settings,
                                                     enemy_p_flight,
                                                     team_p_flight, [],
                                                     0, [],
                                                     is_team=False)
                    enemy.set_max_v(
                        settings.enemy_mission_args[1][3])  # medium velocity
                    enemy.set_velocity([vx / 1.5, vy / 1.5])
                    enemy.move()
                    if settings.enemy_status_changed:
                        enemy.set_attack_args(2.4, 5.0)
                    enemy.attack(person, boxes)

            elif settings.enemy_status >= 4 and settings.enemy_status <= 6:  # 执行任务状态
                difficulty = settings.enemy_status - 4  # 0:简单  1:中等  2:困难
                enemy_mission_args = settings.enemy_mission_args[difficulty]
                is_first = True
                flight_index = 0
                p_offset = [[0, enemy_mission_args[6]],
                            [enemy_mission_args[6], 0],
                            [-enemy_mission_args[6], 0],
                            [0, -enemy_mission_args[6]]]
                if boxes.is_in_protect_box(
                        person.get_info()[0]):  # 在保护区域内,一架逼近人,三架逼近己方无人机
                    for enemy, team in zip(enemy_flights.sprites(),
                                           team_flights.sprites()):
                        if is_first:
                            is_first = False
                            person_p_flight = person.get_info()[0]
                            enemy_p_flight = enemy.get_info()[0]
                            person_p_flight = [
                                person_p_flight[0] + random.random() * 4 - 2,
                                person_p_flight[1] + 2 +
                                random.random() * 2 * enemy_mission_args[1] -
                                enemy_mission_args[1]
                            ]
                            [vx, vy] = apf.compute_next_step(settings,
                                                             enemy_p_flight,
                                                             person_p_flight,
                                                             [],
                                                             0, [],
                                                             is_team=False)
                        else:
                            team_p_flight = team.get_info()[0]
                            enemy_p_flight = enemy.get_info()[0]
                            team_p_flight = [
                                team_p_flight[0] + random.random() * 4 - 2,
                                team_p_flight[1] + 1.5 +
                                random.random() * 2 * enemy_mission_args[1] -
                                enemy_mission_args[1]
                            ]
                            [vx, vy] = apf.compute_next_step(settings,
                                                             enemy_p_flight,
                                                             team_p_flight, [],
                                                             0, [],
                                                             is_team=False)
                        enemy.set_max_v(enemy_mission_args[3])
                        enemy.set_velocity([
                            vx * enemy_mission_args[0],
                            vy * enemy_mission_args[0]
                        ])
                        enemy.move()
                        if settings.enemy_status_changed:
                            enemy.set_attack_args(enemy_mission_args[4],
                                                  enemy_mission_args[5])
                        enemy.attack(person, boxes)
                else:  # 在保护区域外,四架逼近人
                    for enemy, team in zip(enemy_flights.sprites(),
                                           team_flights.sprites()):
                        person_p_flight = person.get_info()[0]
                        enemy_p_flight = enemy.get_info()[0]
                        person_p_flight = [
                            person_p_flight[0] + p_offset[flight_index][0] +
                            random.random() * 2 * enemy_mission_args[2] -
                            enemy_mission_args[2],
                            person_p_flight[1] + p_offset[flight_index][1] +
                            random.random() * 2 * enemy_mission_args[2] -
                            enemy_mission_args[2]
                        ]
                        flight_index = flight_index + 1
                        [vx, vy] = apf.compute_next_step(settings,
                                                         enemy_p_flight,
                                                         person_p_flight, [],
                                                         0, [],
                                                         is_team=False)
                        enemy.set_max_v(enemy_mission_args[3])
                        enemy.set_velocity([
                            vx * enemy_mission_args[0],
                            vy * enemy_mission_args[0]
                        ])
                        enemy.move()
                        if settings.enemy_status_changed:
                            enemy.set_attack_args(enemy_mission_args[4],
                                                  enemy_mission_args[5])
                        enemy.attack(person, boxes)

            settings.enemy_status_changed = False

            # 己方无人机行动
            all_reach_final_goal = True  # 假定都达到了密码箱位置(final pos)
            if follow_status:
                # 跟随主飞机模式
                is_first = True
                index = 0
                for team in team_flights.sprites():
                    if not team.reach_final_goal():
                        all_reach_final_goal = False

                    if is_first:
                        is_first = False
                        p_flight = team.get_info()[0]
                        if p_flight[1] >= 26.1:  #达成目标,恢复原队形
                            follow_status = False
                            p_goal = [1.5, 26]
                            team.set_goal(p_goal)
                            continue
                        p_leader = p_flight
                        p_goal = [tcmd_temp_line, 27.1]
                        team.set_goal(p_goal)
                    else:
                        if not follow_status:  #恢复现场
                            p_goal[0] = p_goal[0] + 4
                            team.set_goal(p_goal)
                            continue
                        p_flight = team.get_info()[0]
                        team.set_goal([p_leader[0], p_leader[1] - index])
                        index = index + tcmd_follow_length
                        p_goal = team.get_goal()

                    [vx, vy] = apf.compute_next_step(settings,
                                                     p_flight,
                                                     p_goal,
                                                     p_all,
                                                     n_flights,
                                                     p_all_direction,
                                                     is_team=True)
                    [vx, vy] = [
                        vx + random.random() * 0.02 - 0.01,
                        vy + random.random() * 0.01 - 0.005
                    ]  # 速度扰动
                    team.set_velocity([vx, vy])
                    team.move()
                    team.heal(person, boxes)

            else:
                # 独立模式
                for team in team_flights.sprites():
                    if not team.reach_final_goal():
                        all_reach_final_goal = False

                    p_flight = team.get_info()[0]
                    p_goal = team.get_goal()
                    [vx, vy] = apf.compute_next_step(settings,
                                                     p_flight,
                                                     p_goal,
                                                     p_all,
                                                     n_flights,
                                                     p_all_direction,
                                                     is_team=True)
                    [vx, vy] = [
                        vx + random.random() * 0.02 - 0.01,
                        vy + random.random() * 0.01 - 0.005
                    ]  # 速度扰动
                    team.set_velocity([vx, vy])
                    team.move()
                    team.heal(person, boxes)

            if not settings.crack_qrcode:
                boxes.crack(all_reach_final_goal)  # 全部到达目的地,破译密码

            # 获取终端指令
            if not q.empty():
                try:
                    [cmd_content, cmd_args] = q.get().split(' ', 1)
                    if cmd_content == "thenextcontentisthepassword":
                        # 玩家输入密码
                        try:
                            tcmd_passwd = cmd_args
                            if passwd.check_passwd(tcmd_passwd):
                                print("[Boxes] Password correct.")
                                settings.get_key = True
                            else:
                                print("[Boxes] Password error, try again.")
                        except:
                            print("[Boxes] Password input error.")

                    elif cmd_content == "y":
                        # 更改己方飞机目标点(Y轴平齐)策略
                        try:
                            [cmd_arg_1, cmd_arg_2] = cmd_args.split(' ')
                            new_goal = float(cmd_arg_1)
                            interval = float(cmd_arg_2)
                        except:
                            new_goal = float(cmd_args)
                            interval = 4.0
                        x_offset = 7.5 - interval * 1.5
                        print(
                            "[Team] Move team flights to Y-line %.3f m with interval %.3f m ."
                            % (new_goal, interval))
                        for team in team_flights.sprites():
                            team.set_goal([x_offset, new_goal])
                            x_offset += interval
                    elif cmd_content == "f":
                        # 跟随主飞机运动策略
                        [cmd_arg_1, cmd_arg_2] = cmd_args.split(' ')
                        tcmd_temp_line = float(cmd_arg_1)
                        tcmd_follow_length = float(cmd_arg_2)
                        print(
                            "[Team] Follow the leader team flight with X-line %.3f m and interval %.3f m ."
                            % (tcmd_temp_line, tcmd_follow_length))
                        follow_status = True
                    elif cmd_content == "s":
                        # 即刻在前方悬停策略
                        follow_status = False
                        ahead_length = float(cmd_args)
                        print("[Team] Hover at %.3f m ahead ." %
                              (ahead_length))
                        for team in team_flights.sprites():
                            temp_goal = team.get_info()[0]
                            team.set_goal(
                                [temp_goal[0], temp_goal[1] + ahead_length])
                    else:
                        print("[Team] Unknown command.")
                except:
                    print("[Team] Command error.")

            if settings.crack_qrcode and not settings.get_key:
                cmd_thread.input_passwd_request()  # input the password in tcmd

        tfunc.update_screen(settings, screen, team_flights, enemy_flights,
                            person, boxes, passwd, sbd)

        # Watch update frame time (for test)
        #if updated_frame:
        #    updated_frame = False
        #    print("Update time: %.3fs" % (time.time() - start_time))

        # 等待更新时间
        while period_timeout:
            tfunc.check_events(settings, screen, cmd_thread, team_flights,
                               enemy_flights, person, sbd)
            if time.time() - start_time >= 0.04:
                period_timeout = False
                updated_frame = True
Exemplo n.º 43
0
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_number in 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)
Exemplo n.º 44
0
def run_game():
    # 初始化游戏并创建一个屏幕对象 初始化pygame、设置和屏幕对象
    pygame.init()

    # 设置窗口出现的位置
    os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (40, 55)

    # 初始化一个设置实例
    ai_settings = Settings()

    # 设置屏幕大小
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))

    # # 设置屏幕大小(全屏)
    # screen = pygame.display.set_mode(
    #     (ai_settings.screen_width, ai_settings.screen_height), pygame.FULLSCREEN)

    # 设置标题
    pygame.display.set_caption("Thunder Fighters Vs Digital Monsters")

    #加载背景音乐
    my_music = Music(ai_settings)
    my_music.menu_music()

    # 创建Play按钮
    play_button = Button(ai_settings, screen)

    # 创建一个用于存储游戏统计信息的实例
    stats = GameStats(ai_settings)

    # 创建一艘飞船
    ship = Ship(ai_settings, screen)

    # 创建一个用于存储子弹的编组
    bullets = Group()

    # 创建一个外星人编组
    aliens = Group()

    # # 创建一个外星人
    # gf.create_alien(ai_settings, screen, aliens, stats)

    # 创建存储游戏统计信息的实例,并创建记分牌
    sb = Scoreboard(ai_settings, screen, stats)

    # 开始游戏的主循环
    while True:

        # 监视键盘和鼠标事件
        gf.check_events(ai_settings, screen, stats, sb, play_button, ship,
                        aliens, bullets, my_music)

        if stats.game_active:
            # 在更新屏幕之前调用飞船的方法
            ship.update()

            # 更新子弹状态
            gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens,
                              bullets, my_music)

            # 更新外星人
            gf.update_aliens(ai_settings, screen, stats, sb, ship, aliens,
                             bullets, my_music)

        # 更新屏幕
        gf.update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,
                         play_button)
Exemplo n.º 45
0
class FireBallController:
    # controls fireballs
    def __init__(self, screen, map_group, obstacles, floor, origin, goomba,
                 koopa):
        self.screen = screen
        self.origin = origin
        self.map_group = map_group
        self.obstacles = obstacles
        self.floor = floor
        self.goomba, self.koopa = goomba, koopa
        self.fireballs = Group()
        self.fb_images = [
            pygimg.load('images/super_mario_fireball_1.png'),
            pygimg.load('images/super_mario_fireball_2.png'),
            pygimg.load('images/super_mario_fireball_3.png'),
            pygimg.load('images/super_mario_fireball_4.png')
        ]
        self.exp_images = [
            pygimg.load('images/super_mario_fireball_explode_1.png'),
            pygimg.load('images/super_mario_fireball_explode_2.png'),
            pygimg.load('images/super_mario_fireball_explode_3.png')
        ]
        self.fb_images = [
            transform.scale(img, (16, 16)) for img in self.fb_images
        ]
        self.exp_images = [
            transform.scale(img, (16, 16)) for img in self.exp_images
        ]

    def throw_fireball(self):
        # throws fireball if there are less than 2
        if len(self.fireballs) < 2:
            if self.origin.state_info['facing_right']:
                n_fireball = FireBall(self.origin.rect.topright[0],
                                      self.origin.rect.topright[1],
                                      self.fb_images, self.exp_images,
                                      self.obstacles, self.floor, self.goomba,
                                      self.koopa)
            else:
                n_fireball = FireBall(self.origin.rect.topleft[0],
                                      self.origin.rect.topleft[1],
                                      self.fb_images,
                                      self.exp_images,
                                      self.obstacles,
                                      self.floor,
                                      self.goomba,
                                      self.koopa,
                                      speed=-5)
            self.fireballs.add(n_fireball)
            self.map_group.add(n_fireball)
            return True
        return False

    def update_fireballs(self):
        # updates all fireballs
        self.fireballs.update()
        for fb in self.fireballs:
            if fb.rect.x < (self.origin.rect.x - self.screen.get_width()) or \
                fb.rect.x > (self.origin.rect.x + self.screen.get_width()) or \
                    (fb.rect.y < (self.origin.rect.y - self.screen.get_height()) or
                     fb.rect.y > (self.origin.rect.y + self.screen.get_height())):
                fb.kill()
Exemplo n.º 46
0
def _draw_cloud(tag_list,
                layout=LAYOUT_MIX,
                size=(500, 500),
                fontname=DEFAULT_FONT,
                rectangular=False):

    # sort the tags by size and word length
    tag_list.sort(key=lambda tag: len(tag['tag']))
    tag_list.sort(key=lambda tag: tag['size'])
    tag_list.reverse()

    # create the tag space
    tag_sprites = []
    area = 0
    for tag in tag_list:
        #        print tag, fontname
        tag_sprite = Tag(tag, (0, 0), fontname=fontname)
        area += tag_sprite.mask.count()
        tag_sprites.append(tag_sprite)

    canvas = Rect(0, 0, 0, 0)
    ratio = float(size[1]) / size[0]

    if rectangular:
        spiral = _rectangular_spiral
    else:
        spiral = _archimedean_spiral

    aligned_tags = Group()
    for tag_sprite in tag_sprites:
        angle = 0
        if layout == LAYOUT_MIX and randint(0, 2) == 0:
            angle = 90
        elif layout == LAYOUT_VERTICAL:
            angle = 90

        tag_sprite.rotate(angle)

        xpos = canvas.width - tag_sprite.rect.width
        if xpos < 0: xpos = 0
        xpos = randint(int(xpos * LOWER_START), int(xpos * UPPER_START))
        tag_sprite.rect.x = xpos

        ypos = canvas.height - tag_sprite.rect.height
        if ypos < 0: ypos = 0
        ypos = randint(int(ypos * LOWER_START), int(ypos * UPPER_START))
        tag_sprite.rect.y = ypos

        _search_place(tag_sprite, aligned_tags, canvas, spiral, ratio)
    canvas = _get_tags_bounding(aligned_tags)

    # resize cloud
    zoom = min(float(size[0]) / canvas.w, float(size[1]) / canvas.h)

    for tag in aligned_tags:
        tag.rect.x *= zoom
        tag.rect.y *= zoom
        tag.rect.width *= zoom
        tag.rect.height *= zoom
        tag.tag['size'] = int(tag.tag['size'] * zoom)
        tag.update_fontsize()

    canvas = _get_tags_bounding(aligned_tags)

    return canvas, aligned_tags
Exemplo n.º 47
0
class Ship(Sprite):
    images = [pg.image.load('images/ship.bmp')]
    images_for_boom = [
        pg.image.load('images/ship_boom' + str(i) + '.png') for i in range(7)
    ]
    timer = Timer(frames=images, wait=1000)
    timer_boom = Timer(frames=images_for_boom, wait=100, looponce=True)

    def __init__(self, sound, game, barriers=None, aliens=None):
        """Initialize the ship and set its starting position."""
        super().__init__()
        self.settings = game.settings
        self.screen = game.screen
        self.sound = sound
        self.game = game
        self.barriers = barriers
        self.aliens = aliens

        self.image = pg.image.load('images/ship.bmp')
        self.rect = self.image.get_rect()
        self.screen_rect = game.screen.get_rect()

        self.center = 0
        self.center_ship()

        self.moving_right = False
        self.moving_left = False

        self.shooting_bullets = False
        self.bullets_attempted = 0
        self.dead, self.reallydead, self.timer_switched = False, False, False
        self.ship_group = Group()
        self.ship_group.add(
            self
        )  # only one Ship (myself) in the Ship group to simplify collision tracking
        self.bullet_group_that_kill_aliens = Group()
        self.timer = Ship.timer
        # self.bullets = Bullets(settings=game.settings, is_alien_bullet=False)

    def add_bullet(self, game, x, y):
        self.bullet_group_that_kill_aliens.add(
            BulletFromShip(game=self.game,
                           x=self.rect.centerx,
                           y=self.rect.top))

    def bullet_group(self):
        return self.bullet_group_that_kill_aliens

    def group(self):
        return self.ship_group

    def killed(self):
        if not self.dead and not self.reallydead: self.dead = True
        if self.dead and not self.timer_switched:
            self.timer = Ship.timer_boom
            self.timer_switched = True

    def center_ship(self):
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = self.screen_rect.bottom
        self.center = float(self.rect.centerx)

    def update(self):
        self.bullet_group_that_kill_aliens.update()
        if self.dead and self.timer_switched:
            if self.timer.finished:
                self.dead = False
                self.timer_switched = False
                self.reallydead = True
                self.timer.reset()
                self.game.reset()

        for bullet in self.bullet_group_that_kill_aliens.copy():
            if bullet.rect.bottom < 0:
                self.bullet_group_that_kill_aliens.remove(bullet)

        bullet_alien_collisions = pg.sprite.groupcollide(
            self.aliens.group(), self.bullet_group_that_kill_aliens, False,
            True)
        if bullet_alien_collisions:
            for alien in bullet_alien_collisions:
                alien.killed()

        bullet_barrier_collisions = pg.sprite.groupcollide(
            self.barriers.group(), self.bullet_group_that_kill_aliens, False,
            True)
        # TODO: you MUST change True, True to False, True on the previous line if you only damage the barrier block

        if bullet_barrier_collisions:
            for barrier_block in bullet_barrier_collisions:
                barrier_block.damaged()

        if len(self.aliens.group()) == 0:
            self.bullet_group_that_kill_aliens.empty()
            self.settings.increase_speed()
            self.aliens.create_fleet()
            self.game.stats.level += 1
            self.game.sb.prep_level()

        delta = self.settings.ship_speed_factor
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.center += delta
        if self.moving_left and self.rect.left > 0: self.center -= delta
        if self.shooting_bullets and not self.dead:
            self.sound.shoot_bullet()
            self.add_bullet(game=self.game, x=self.rect.x, y=self.rect.y)
            self.shooting_bullets = False
        self.rect.centerx = self.center

    def draw(self):
        for bullet in self.bullet_group_that_kill_aliens:
            bullet.draw()
        image = self.timer.imagerect()
        rect = image.get_rect()
        rect.x, rect.y = self.rect.centerx, self.rect.top
        self.screen.blit(image, rect)
Exemplo n.º 48
0
class Scoreboard():
    # A class to report scoring information.
    def __init__(self, ai_settings, screen, stats):
        # Initialize scorekeeping attributes.
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.ai_settings = ai_settings
        self.stats = stats

        # Font settings for scoring information.
        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None, 48)
        # Prepare the initial score image.
        # To turn the text to be displayed into an image
        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_ships()

    def prep_score(self):
        # Turn the score into a rendered image.
        # score_str = str(self.stats.score) # stats.score to string convert
        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)

        # Display the score at the top right of the screen.
        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):
        # Turn the high score into a rendered image.
        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)
        # Center the high score at the top of the screen.
        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):
        # Turn the level into a rendered image  from the value stored in stats.level
        self.level_image = self.font.render(str(self.stats.level), True,
                                            self.text_color,
                                            self.ai_settings.bg_color)

        # Position the level below the score
        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):
        # Show how many ships are left.
        self.ships = Group()
        # loop runs once for every ship the player has left
        for ship_number in 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):
        # Draw score to the screen at the location specified
        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)
        # Draw ships.
        self.ships.draw(self.screen)
Exemplo n.º 49
0
    def run_game_2():
        global ch, dobollet, t, bulets, t2
        forrand = 1000
        pygame.init()
        pygame.joystick.init()
        joysticks = [
            pygame.joystick.Joystick(x)
            for x in range(pygame.joystick.get_count())
        ]
        for joystick in joysticks:
            joystick.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)
        ship2 = Ship(ai_settings, screen)
        bullets = Group()
        aliens = Group()
        ships = Group()

        ships.add(ship)
        ships2 = Group()
        ships2.add(ship2)
        blocks = Group()
        cu = 1
        cd = 1
        cr = 1

        moneys = 0
        cl = 1
        cu2 = 1
        cd2 = 1
        cr2 = 1
        ship.y -= 47
        ship.rect.y = ship.y
        moneys = 0
        cl2 = 1
        tank = 0
        fuster = 1
        poweraps = Group()
        updatenow = 0
        bezero = 0
        die_blocks = Group()
        tr = '[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,0,0,0,0,0,1,4,0,3,3,3,0,7,0,1,1,1,1,2,1,0,0,0,0,0,0,1,4,7,6,3,0,0,1,0,0,0,0,0,1,2,1,0,0,1,0,0,0,1,4,4,3,3,0,1,0,0,1,0,0,1,2,1,0,0,1,1,1,0,1,1,1,1,1,1,0,0,0,7,7,6,0,1,2,1,0,0,1,0,0,4,1,0,0,0,1,0,0,0,0,1,0,0,1,2,1,0,0,0,0,0,4,1,0,7,6,6,0,1,0,3,0,4,3,0,0,1,2,1,0,4,0,7,7,4,0,0,0,3,1,0,3,0,0,0,0,0,1,2,1,0,4,1,7,7,4,1,4,4,0,1,1,1,1,1,1,0,4,1,2,1,3,4,3,1,7,7,1,1,7,7,7,7,7,7,7,0,0,0,1,2,1,3,4,3,1,7,7,7,7,6,7,7,7,6,7,7,7,7,0,0,0,1,2,1,3,4,3,1,1,7,7,1,1,1,1,1,7,7,7,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1'
        filename = 'liberint_boss.txt'
        #        t = []

        alienbullets = Group()
        nothing = Group()
        score = 0
        ch = 50

        jkd = Group()
        t2 = 1
        do_liberint(pygame, Block, blocks, ai_settings, screen, filename,
                    warrior, aliens, poweraps)
        for power in poweraps.sprites():
            power.image = pygame.image.load('bomb.gif')

        joycon.set_player_lamp_flashing(1)
        joycon2.set_player_lamp_flashing(2)
        bg_color = (20, 260, 200)
        invis = 0

        ships.add(ship)
        i1 = 0
        i2 = 0
        innothing = Group()

        ships2.add(ship2)

        shoot = pygame.mixer.Sound('07 - Metal Man.mp3')
        shoot.play(-1)
        collision = pygame.sprite.groupcollide(ships, blocks, false, True)
        collision = pygame.sprite.groupcollide(ships2, blocks, False, True)
        collision = pygame.sprite.groupcollide(ships, aliens, false, True)
        collision = pygame.sprite.groupcollide(ships2, aliens, False, True)

        collision = pygame.sprite.groupcollide(aliens, blocks, false, True)

        # shoot = mixer.Sound("C:\windows\media\Ring02.wav")
        # #C:\windows\downloads\
        ch = 10
        timer = 5
        while True:
            pygame.time.wait(timer)
            screen.fill(ai_settings.bg_color)
            isstickbut = joycon.stick_r_btn
            isstickmove = joycon.stick_r

            if isstickmove[1] > 2000:

                ship.rect.x += 3
                if pygame.sprite.spritecollideany(ship, blocks):
                    ship.rect.x -= 3
                t = 2
                #('up')
            elif isstickmove[1] < 1000:
                #ship.y += 3
                #('down')
                ship.rect.x -= 3
                if pygame.sprite.spritecollideany(ship, blocks):
                    ship.rect.x += 3
                t = 3

            elif isstickmove[0] > 3000:
                #ship.x += 3
                #('r')
                ship.rect.y += 3
                if pygame.sprite.spritecollideany(ship, blocks):
                    ship.rect.y -= 3
                t = 1
            elif isstickmove[0] < 1000:
                #ship.x -= 3
                #('l')
                t = 0
                ship.rect.y -= 3
                if pygame.sprite.spritecollideany(ship, blocks):
                    ship.rect.y += 3

            isstickbut = joycon2.stick_l_btn
            isstickmove = joycon2.stick_l

            if isstickmove[1] > 3000:

                ship2.rect.x -= 3
                t2 = 3
                if pygame.sprite.spritecollideany(ship2, blocks):
                    ship2.rect.x += 3
                #('up')
            elif isstickmove[1] < 2000:
                #ship.y += 3
                #('down')
                t2 = 2
                ship2.rect.x += 3
                if pygame.sprite.spritecollideany(ship2, blocks):
                    ship2.rect.x -= 3

            elif isstickmove[0] > 3000:
                #ship.x += 3
                #('r')
                ship2.rect.y -= 3
                t2 = 0

                if pygame.sprite.spritecollideany(ship2, blocks):
                    ship2.rect.y += 3
            elif isstickmove[0] < 1600:
                #ship.x -= 3
                #('l')
                t2 = 1
                ship2.rect.y += 3
                if pygame.sprite.spritecollideany(ship2, blocks):
                    ship2.rect.y -= 3
            # isstickmove=joycon2.stick_l
            # if isstickmove[1] > 3000:

            #     ship2.rect.x += 1
            #     if pygame.sprite.spritecollideany(ship2,blocks):
            #         ship2.rect.x -= 1
            # elif isstickmove[1] < 1000:
            #     #ship.y += 3
            #     #('down')
            #     ship.rect.x -= 1
            #     if pygame.sprite.spritecollideany(ship2,blocks):
            #         ship2.rect.x += 1
            # elif isstickmove[0] > 3000:
            #     #ship.x += 3
            #     #('r')
            #     ship2.rect.y += 1
            #     if pygame.sprite.spritecollideany(ship2,blocks):
            #         ship2.rect.y -= 1
            # elif isstickmove[0] < 1000:
            #     #ship.x -= 3
            #     #('l')
            #     ship2.rect.y -= 1
            #     if pygame.sprite.spritecollideany(ship2,blocks):
            #         ship2.rect.y += 1

            for event_type, status in joycon.events():
                if status == 1:
                    if event_type == 'b':
                        bul = Bullet(ai_settings, screen, ship, 1, 1, 1, t)
                        bullets.add(bul)

                    if event_type == 'y':
                        nothingi = Block(ai_settings, screen, 'fire.gif')
                        nothingi.rect.x, nothingi.rect.y = ship.rect.x, ship.rect.y

                        if t == 0:
                            nothingi.rect.y -= 60
                        if t == 1:
                            nothingi.rect.y += 60
                        if t == 2:
                            nothingi.rect.x += 60
                        if t == 3:
                            nothingi.rect.x -= 60

                        blocks.add(nothingi)
                        innothing.add(nothingi)
                    if event_type == 'a':
                        nothingi = Block(ai_settings, screen, 'fire.gif')
                        nothingi.rect.x, nothingi.rect.y = ship.rect.x, ship.rect.y
                        blocks.add(nothingi)
                        innothing.add(nothingi)
                    if event_type == 'right_sr':
                        if timer == 5:
                            timer = 50
                        else:
                            timer = 5
            for event_type, status in joycon2.events():
                if status == 1:
                    if event_type == 'up':
                        bul = Bullet(ai_settings, screen, ship2, 1, 1, 1, t2)
                        bullets.add(bul)
                    if event_type == 'left_sr':
                        if timer == 5:
                            timer = 50
                        else:
                            timer = 5
                    if event_type == 'right':
                        nothingi = Block(ai_settings, screen, 'fire.gif')
                        nothingi.rect.x, nothingi.rect.y = ship2.rect.x, ship2.rect.y
                        if t2 == 0:
                            nothingi.rect.y -= 60
                        if t2 == 1:
                            nothingi.rect.y += 60
                        if t2 == 2:
                            nothingi.rect.x += 60
                        if t2 == 3:
                            nothingi.rect.x -= 60
                        blocks.add(nothingi)
                        innothing.add(nothingi)
                    if event_type == 'left':
                        nothingi = Block(ai_settings, screen, 'fire.gif')
                        nothingi.rect.x, nothingi.rect.y = ship2.rect.x, ship2.rect.y
                        blocks.add(nothingi)
                        innothing.add(nothingi)

                #(event_type, status)
            # for event_type, status in joycon3.events():
            #     #("ButtonEventJoyCon:")
            #     #(event_type, status)
            # for event_type, status in joycon4.events():
            #     #("ButtonEventJoyCon:")
            #     #(event_type, status)
            screen.fill(ai_settings.bg_color)
            jkd.draw(screen)

            for bul in bullets.sprites():
                bul.draw_bullet()
            alienbullets.draw(screen)

            blocks.draw(screen)
            die_blocks.draw(screen)
            ships.draw(screen)
            ships2.draw(screen)
            bullets.update(1, 1)
            collision = pygame.sprite.groupcollide(bullets, innothing, True,
                                                   True)
            collision = pygame.sprite.groupcollide(alienbullets, innothing,
                                                   True, True)
            collision = pygame.sprite.groupcollide(bullets, blocks, True,
                                                   false)
            collision = pygame.sprite.groupcollide(bullets, blocks, True,
                                                   false)

            collision = pygame.sprite.groupcollide(bullets, blocks, True,
                                                   false)
            collision = pygame.sprite.groupcollide(alienbullets, blocks, True,
                                                   false)
            collision = pygame.sprite.groupcollide(alienbullets, bullets, True,
                                                   True)
            collision2 = pygame.sprite.groupcollide(bullets, aliens, True,
                                                    False)

            if collision2:
                bullets.empty()
                print(len(bullets))
                ch -= 1
                for x in range(10):
                    bullet = Bullet(ai_settings, screen, alien, aliens,
                                    alienbullets, ship, 0)
                    alienbullets.add(bullet)
                    bullet = Bullet(ai_settings, screen, alien, aliens,
                                    alienbullets, ship, 1)
                    alienbullets.add(bullet)
                    bullet = Bullet(ai_settings, screen, alien, aliens,
                                    alienbullets, ship, 2)
                    alienbullets.add(bullet)
                    bullet = Bullet(ai_settings, screen, alien, aliens,
                                    alienbullets, ship, 3)
                    alienbullets.add(bullet)

                print(ch)
                if ch == 0:
                    collision2 = pygame.sprite.groupcollide(
                        bullets, aliens, False, False)
                    shoot.stop()
                    break
            collision = pygame.sprite.groupcollide(bullets, alienbullets, True,
                                                   True)
            aliens.draw(screen)
            alienbullets.update()
            bullets.update(9, 9)
            alienbullets.update()
            blocks.draw(screen)
            for alien in aliens.sprites():
                if randint(0, 0) == 0 and len(alienbullets) <= 8:
                    bullet = Alien(ai_settings, screen, alien, aliens,
                                   alienbullets)
                    alienbullets.add(bullet)
                    bullet = Alien(ai_settings, screen, alien, aliens,
                                   alienbullets)
                    alienbullets.add(bullet)
                    bullet = Alien(ai_settings, screen, alien, aliens,
                                   alienbullets)
                    alienbullets.add(bullet)
                    bullet = Alien(ai_settings, screen, alien, aliens,
                                   alienbullets)
                    alienbullets.add(bullet)

                tre = randint(0, 150)
                if tre == 45:
                    alien.t = randint(0, 3)
                if pygame.sprite.spritecollideany(alien, blocks):
                    if alien.t == 0:
                        alien.y += 3
                        alien.rect.y += 3
                    if alien.t == 1:
                        alien.y -= 3
                        alien.rect.y -= 3
                    if alien.t == 2:
                        alien.x -= 3
                        alien.rect.x -= 3
                    if alien.t == 3:
                        alien.x += 3
                        alien.rect.x += 3

                    alien.t = randint(0, 3)
            if pygame.sprite.spritecollideany(ship, aliens):
                shoot.stop()
                shoot = pygame.mixer.Sound('27 - Game Over.mp3')
                shoot.play(-1)
                aliens.clear()
                alienbullets.clear()
                pygame.quit()
                run_game()
                sys.exit()
            if pygame.sprite.spritecollideany(ship2, aliens):
                shoot.stop()
                shoot = pygame.mixer.Sound('27 - Game Over.mp3')
                shoot.play(0)
                sys.exit()
                pygame.quit()
                run_game()

            if pygame.sprite.spritecollideany(ship, alienbullets):
                shoot.stop()
                shoot = pygame.mixer.Sound('27 - Game Over.mp3')
                shoot.play(-1)
                shoot.stop()
                pygame.quit()
                sys.exit()
                run_game()
            if pygame.sprite.spritecollideany(ship2, alienbullets):
                shoot.stop()
                shoot = pygame.mixer.Sound('27 - Game Over.mp3')
                shoot.play(0)
                shoot.stop()
                pygame.quit()

                run_game()
            print(len(aliens), len(alienbullets))

            pygame.display.flip()
Exemplo n.º 50
0
    def run_game():
        global ch, dobollet, t, bulets, t2
        forrand = 1000
        pygame.init()
        pygame.joystick.init()
        joysticks = [
            pygame.joystick.Joystick(x)
            for x in range(pygame.joystick.get_count())
        ]
        for joystick in joysticks:
            joystick.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)
        ship2 = Ship(ai_settings, screen)
        bullets = Group()
        aliens = Group()
        ships = Group()
        ships.add(ship)
        ships2 = Group()
        ships2.add(ship2)
        blocks = Group()
        cu = 1
        cd = 1
        cr = 1
        moneys = 0
        cl = 1
        cu2 = 1
        cd2 = 1
        cr2 = 1
        ship.y -= 47
        ship.rect.y = ship.y
        moneys = 0
        cl2 = 1
        tank = 0
        fuster = 1
        poweraps = Group()
        updatenow = 0
        bezero = 0
        die_blocks = Group()
        tr = '[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,0,0,0,0,0,1,4,0,3,3,3,0,7,0,1,1,1,1,2,1,0,0,0,0,0,0,1,4,7,6,3,0,0,1,0,0,0,0,0,1,2,1,0,0,1,0,0,0,1,4,4,3,3,0,1,0,0,1,0,0,1,2,1,0,0,1,1,1,0,1,1,1,1,1,1,0,0,0,7,7,6,0,1,2,1,0,0,1,0,0,4,1,0,0,0,1,0,0,0,0,1,0,0,1,2,1,0,0,0,0,0,4,1,0,7,6,6,0,1,0,3,0,4,3,0,0,1,2,1,0,4,0,7,7,4,0,0,0,3,1,0,3,0,0,0,0,0,1,2,1,0,4,1,7,7,4,1,4,4,0,1,1,1,1,1,1,0,4,1,2,1,3,4,3,1,7,7,1,1,7,7,7,7,7,7,7,0,0,0,1,2,1,3,4,3,1,7,7,7,7,6,7,7,7,6,7,7,7,7,0,0,0,1,2,1,3,4,3,1,1,7,7,1,1,1,1,1,7,7,7,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1'
        filename = 'liberint.txt'
        #        t = []

        alienbullets = Group()
        score = 0

        do_liberint(pygame, Block, blocks, ai_settings, screen, poweraps,
                    filename, Alien_what_go_up_and_down,
                    Alien_what_go_left_and_right, aliens, aliens)
        for power in poweraps.sprites():
            power.image = pygame.image.load('bomb.gif')

        bg_color = (20, 250, 200)
        invis = 0
        ships.add(ship)
        for block in blocks.sprites():

            if pygame.sprite.spritecollideany(block, ships):
                blocks.remove(block)

    #shoot = mixer.Sound('Contra.mp3')
    #shoot.play(-1)

#        shoot = mixer.Sound("C:\windows\media\Ring02.wav")C:\windows\downloads\
        while True:
            for block in aliens.sprites():

                if pygame.sprite.spritecollideany(block, blocks):
                    block.direction += 1

                    if block.direction == 4:
                        block.direction = 0

            if random.randint(0, 1000) == 23:
                alien = Alien(ai_settings, screen, 0, 0, ship)
                aliens.add(alien)

                while pygame.sprite.spritecollideany(alien, blocks):
                    alien.x = randint(0, ai_settings.screen_width)
                    alien.y = randint(0, ai_settings.screen_height)
                    alien.rect.x = alien.x
                    alien.rect.y = alien.y
            # for event_type, status in joycon1.events():
            #     if status == 1:
            #         if
            isstickmove = joycon.stick_r
            if isstickmove[1] > 3000:

                ship.rect.x += 1
                t = 2
                ship.image = pygame.image.load('tank_left.gif')
                if pygame.sprite.spritecollideany(ship, blocks):
                    ship.rect.x -= 1

            elif isstickmove[1] < 1000:
                #ship.y += 3
                print('down')
                ship.rect.x -= 1
                t = 3
                ship.image = pygame.image.load('tank_right.gif')
                if pygame.sprite.spritecollideany(ship, blocks):
                    ship.rect.x += 1
            elif isstickmove[0] > 3000:
                #ship.x += 3
                print('r')
                ship.rect.y += 1
                t = 1
                ship.image = pygame.image.load('tank_down.gif')
                if pygame.sprite.spritecollideany(ship, blocks):
                    ship.rect.y -= 1
            elif isstickmove[0] < 1000:
                #ship.x -= 3
                print('l')
                ship.rect.y -= 1
                ship.image = pygame.image.load('tank_up.gif')
                t = 0
                if pygame.sprite.spritecollideany(ship, blocks):
                    ship.rect.y += 1
            # isstickmove=joycon2.stick_l
            # if isstickmove[1] > 3000:

            #     ship2.rect.x += 1
            #     if pygame.sprite.spritecollideany(ship2,blocks):
            #         ship2.rect.x -= 1
            # elif isstickmove[1] < 1000:
            #     #ship.y += 3
            #     print('down')
            #     ship.rect.x -= 1
            #     if pygame.sprite.spritecollideany(ship2,blocks):
            #         ship2.rect.x += 1
            # elif isstickmove[0] > 3000:
            #     #ship.x += 3
            #     print('r')
            #     ship2.rect.y += 1
            #     if pygame.sprite.spritecollideany(ship2,blocks):
            #         ship2.rect.y -= 1
            # elif isstickmove[0] < 1000:
            #     #ship.x -= 3
            #     print('l')
            #     ship2.rect.y -= 1
            #     if pygame.sprite.spritecollideany(ship2,blocks):
            #         ship2.rect.y += 1

            for event_type, status in joycon.events():
                if status == 1:
                    if event_type == 'x':
                        bul = Bullet(ai_settings, screen, ship, 1, 1, 1, t)
                        bullets.add(bul)

                print(event_type, status)
            # for event_type, status in joycon3.events():
            #     print("ButtonEventJoyCon:")
            #     print(event_type, status)
            # for event_type, status in joycon4.events():
            #     print("ButtonEventJoyCon:")
            #     print(event_type, status)
            if len(alienbullets) <= 0:
                for alien in aliens.sprites():
                    if randint(0, 500) == 34:

                        bul = Bullet(ai_settings, screen, alien, 2, 1, alien,
                                     0)
                        alienbullets.add(bul)

            screen.fill(ai_settings.bg_color)
            for bul in bullets.sprites():
                bul.draw_bullet()
            for bul in alienbullets.sprites():
                bul.draw_bullet()
            blocks.draw(screen)
            die_blocks.draw(screen)
            ships.draw(screen)
            ships2.draw(screen)
            bullets.update(1, 1)
            collision = pygame.sprite.groupcollide(bullets, blocks, True,
                                                   false)
            collision = pygame.sprite.groupcollide(alienbullets, blocks, True,
                                                   false)
            collision = pygame.sprite.groupcollide(bullets, aliens, True, True)
            collision = pygame.sprite.groupcollide(bullets, alienbullets, True,
                                                   True)
            collision = pygame.sprite.groupcollide(ships, alienbullets, True,
                                                   True)
            aliens.draw(screen)
            aliens.update()
            alienbullets.update(2, 1)
            pygame.display.flip()
Exemplo n.º 51
0
class Scoreboard:
    def __init__(self, ai_settings, screen, maze, pacman):
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.ai_settings = ai_settings
        self.pacman = pacman
        self.maze = maze
        # self.stats = stats

        self.text_color = (255, 255, 255)
        self.font = pygame.font.SysFont(None, 48)

        self.score_image = None
        self.score_rect = None
        self.high_score_image = None
        self.high_score_rect = None
        self.level_image = None
        self.level_rect = None
        self.ships = None
        self.pacmans = Group()

        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_pacmans()

    def prep_score(self):
        rounded_score = int(round(self.ai_settings.score, -1))
        score_str = "{:,}".format(rounded_score)
        self.score_image = self.font.render(score_str, True, self.text_color,
                                            self.ai_settings.bg_color)

        # Display the score at the top right of the screen.
        self.score_rect = self.score_image.get_rect()
        self.score_rect.right = self.screen_rect.right - 20
        self.score_rect.top = 20

    def show_score(self):
        """Draw score and ships to the screen."""
        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)
        # Draw ships.
        self.pacmans.draw(self.screen)

    def prep_high_score(self):
        """Turn the high score into a rendered image."""
        high_score = int(round(self.ai_settings.hs, -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)

        # Cetner the high score at the top of the screen.
        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):
        """Turn the level into a rendered image."""
        self.level_image = self.font.render(str(self.ai_settings.level), True,
                                            self.text_color,
                                            self.ai_settings.bg_color)

        # Position the level below the score.
        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_pacmans(self):
        """SHow how many ships are left."""
        self.pacmans = Group()
        for pacman_number in range(self.ai_settings.lives_left):
            pacman = Pacman(self.ai_settings, self.screen, self.maze)
            pacman.rect.x = 10 + pacman_number * pacman.rect.width
            pacman.rect.y = 10
            self.pacmans.add(pacman)
Exemplo n.º 52
0
from view import draw

if __name__ == "__main__":
    pygame.init()
    pygame.font.init()
    screen = pygame.display.set_mode(size=(WINDOW_WIDTH, WINDOW_HEIGHT))
    pygame.display.set_caption('Danmaku')
    clock = pygame.time.Clock()

    game_state = GameState()

    play_button = Button()
    bg = Background()
    scoreboard = Scoreboard(game_state)

    player_bullets = Group()
    player = Player(player_bullets)

    enemy_group = Group()
    enemy_bullets = Group()
    enemy_group.add(Enemy(enemy_bullets, player))

    screenRect = pygame.Rect(0, 0, WIDTH, HEIGHT)

    while 1:
        handle_input(player, enemy_group, game_state, play_button)

        if game_state.state == RUNNING:
            player.update()
            player_bullets.update()
            enemy_group.update()
Exemplo n.º 53
0
def run_game():
    due = time.time()
    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=ai_settings, screen=screen, msg="Play")
    # 创建一个用于存储游戏统计信息的实例,并创建记分牌
    stats = GameStats(ai_settings=ai_settings)
    sb = Scoreboard(ai_settings=ai_settings, screen=screen, stats=stats)
    # 创建一艘飞船
    ship = Ship(ai_settings=ai_settings, screen=screen)
    # 创建一个用于存储子弹的编组
    bullets = Group()
    bullet_type = 0
    # 创建外星人群
    aliens = Group()

    gf.create_fleet(ai_settings=ai_settings,
                    screen=screen,
                    ship=ship,
                    aliens=aliens)

    while True:
        gf.update_screen(ai_settings=ai_settings,
                         screen=screen,
                         stats=stats,
                         scoreboard=sb,
                         ship=ship,
                         aliens=aliens,
                         bullets=bullets,
                         play_button=play_button)
        gf.check_events(ai_settings=ai_settings,
                        screen=screen,
                        stats=stats,
                        play_button=play_button,
                        scoreboard=sb,
                        ship=ship,
                        aliens=aliens,
                        bullets=bullets)
        if stats.game_active:
            ship.update()

            due = gf.fire_bullet(ai_settings=ai_settings,
                                 screen=screen,
                                 ship=ship,
                                 bullets=bullets,
                                 due=due,
                                 bullet_type=bullet_type)
            gf.update_bullets(ai_settings=ai_settings,
                              screen=screen,
                              stats=stats,
                              scoreboard=sb,
                              ship=ship,
                              aliens=aliens,
                              bullets=bullets)
            gf.update_aliens(ai_settings=ai_settings,
                             stats=stats,
                             screen=screen,
                             scoreboard=sb,
                             ship=ship,
                             aliens=aliens,
                             bullets=bullets)
Exemplo n.º 54
0
    def __init__(self,
                 screen_width=1500,
                 screen_height=700,
                 fps=60,
                 background_image=None):
        '''Initializes the game object and also the game'''

        # initialize pygame (handles pretty much eveything)
        pg.init()

        # create clock
        self.clock = pg.time.Clock()

        self.background_image = pg.image.load(
            './graphics/misc/star_wars_background_24bit.bmp')
        self.fps = fps

        # initialize main screen
        size = screen_width, screen_height  # set screen size
        self.screen = pg.display.set_mode(size)

        # load meta data
        with open('./meta/sprite_skins_meta_data.yaml',
                  'r') as skins_meta_file:
            skins_meta_data = yaml.load(skins_meta_file)

        with open('./meta/animations_meta_data.yaml',
                  'r') as animations_meta_file:
            animations_meta_data = yaml.load(animations_meta_file)

        # set player and enemy ship and laser types
        allied_ship, allied_laser = 'tieinterceptor', 'green'
        hostile_ship, hostile_laser = 'xwing', 'red'

        # set game attributes from meta data for player

        # skin specific
        self.allied_images = [
            pg.image.load(image_path)
            for image_path in skins_meta_data[allied_ship]['image_paths']
        ]
        self.allied_gun_offsets = np.array(
            skins_meta_data[allied_ship]['gun_offsets']).astype('float')
        self.allied_engine_offsets = np.array(
            skins_meta_data[allied_ship]['engine_offsets']).astype('float')
        self.allied_fire_modes = skins_meta_data[allied_ship]['fire_modes']

        # laser specific
        self.allied_laser_images = [
            pg.image.load(image_path)
            for image_path in skins_meta_data[allied_laser]['image_paths']
        ]
        self.allied_laser_sound = pg.mixer.Sound(
            animations_meta_data[allied_laser]['sound'])
        self.allied_muzzle_images = [
            pg.image.load(image_path)
            for image_path in animations_meta_data[allied_laser]['image_paths']
        ]
        self.allied_muzzle_spi = animations_meta_data[allied_laser]['spi']

        # set game attributes from meta data for enemies

        # behavioural
        self.piloting_cone_sine = 0.1
        self.gunning_cone_sine = 0.1

        # skin specific
        self.hostile_images = [
            pg.image.load(image_path)
            for image_path in skins_meta_data[hostile_ship]['image_paths']
        ]
        self.hostile_gun_offsets = np.array(
            skins_meta_data[hostile_ship]['gun_offsets']).astype('float')
        self.hostile_engine_offsets = np.array(
            skins_meta_data[hostile_ship]['engine_offsets']).astype('float')
        self.hostile_fire_modes = skins_meta_data[hostile_ship]['fire_modes']

        # laser specific
        self.hostile_laser_images = [
            pg.image.load(image_path)
            for image_path in skins_meta_data[hostile_laser]['image_paths']
        ]
        self.hostile_laser_sound = pg.mixer.Sound(
            animations_meta_data[hostile_laser]['sound'])
        self.hostile_muzzle_images = [
            pg.image.load(image_path) for image_path in
            animations_meta_data[hostile_laser]['image_paths']
        ]
        self.hostile_muzzle_spi = animations_meta_data[hostile_laser]['spi']

        # load universal game animation attributes from meta data

        # explosion
        self.explosion_images = [
            pg.image.load(image_path)
            for image_path in animations_meta_data['explosion']['image_paths']
        ]
        self.explosion_sound = pg.mixer.Sound(
            animations_meta_data['explosion']['sound'])
        self.explosion_spi = animations_meta_data['explosion']['spi']

        # engine flame
        self.engine_images = [
            pg.image.load(image_path)
            for image_path in animations_meta_data['engine']['image_paths']
        ]
        self.engine_spi = animations_meta_data['engine']['spi']

        # initialize empty sprite groups
        self.all_ships = Group()

        # player's groups
        self.allied_ships = Group()
        self.allied_laser_beams = Group()

        # enemy groups
        self.hostile_ships = Group()
        self.hostile_laser_beams = Group()

        # animation group
        self.animations = Group()

        # information displays
        self.ship_stats = Group()

        # create player sprite and add to relevant groups / provide with relevant groups
        player = self.spawn_player(center=np.array([1400, 350]),
                                   angle=180,
                                   speed=250,
                                   d_angle_degrees_per_second=150,
                                   max_speed_pixel_per_second=360)

        # create two wingmen
        self.spawn_ai_squadron(
            'allied',
            centers=[np.array([1400, 100]),
                     np.array([1400, 700])],
            angles=[180, 180],
            speeds=[300, 300],
            d_angle_degrees_per_seconds=[150, 150],
            max_speed_pixel_per_seconds=[300, 300])

        # create three enemies
        self.spawn_ai_squadron('hostile',
                               centers=[
                                   np.array([50, 100]),
                                   np.array([50, 350]),
                                   np.array([50, 700])
                               ],
                               angles=[0, 0, 0],
                               speeds=[300, 300, 300],
                               d_angle_degrees_per_seconds=[150, 150, 150],
                               max_speed_pixel_per_seconds=[300, 300, 300])

        # initialize enemy down time so that 2 enemies are spawned at beginning of game
        hostile_down = False
        ally_down = False

        # initialize pause state variable
        paused = False

        # initiazlie sound toggle variable
        sound = False

        # start main game loop
        while True:
            # check for exit events
            for event in pg.event.get():
                if event.type == pg.QUIT:

                    # quit pygame
                    pg.quit()
                    sys.exit()
                elif event.type == pg.KEYDOWN:

                    # toggle pause state if needed
                    if event.key == pg.K_ESCAPE:
                        paused = not paused

                    # toggle sound if needed
                    if event.key == pg.K_s:
                        sound = not sound

                        # update sprites if needed
                        for ship in self.all_ships.sprites():
                            ship._sound = sound

                    # control player fire mode
                    if event.key == pg.K_f:
                        player._toggle_fire_mode()

                    # control player fire commands
                    if event.key == pg.K_SPACE:
                        player._command_to_fire = True

                    # control player acceleration
                    if event.key == pg.K_UP:
                        player._d_speed += player._d_speed_pixel_per_frame
                    if event.key == pg.K_DOWN:
                        player._d_speed -= player._d_speed_pixel_per_frame

                    # control player steering
                    if event.key == pg.K_RIGHT:
                        player._d_angle -= player._d_angle_degrees_per_frame
                    if event.key == pg.K_LEFT:
                        player._d_angle += player._d_angle_degrees_per_frame

                elif event.type == pg.KEYUP:

                    # control player fire commands
                    if event.key == pg.K_SPACE:
                        player._command_to_fire = False

                    # control player acceleration
                    if event.key == pg.K_UP:
                        player._d_speed -= player._d_speed_pixel_per_frame
                    if event.key == pg.K_DOWN:
                        player._d_speed += player._d_speed_pixel_per_frame

                    # control player steering
                    if event.key == pg.K_RIGHT:
                        player._d_angle += player._d_angle_degrees_per_frame
                    if event.key == pg.K_LEFT:
                        player._d_angle -= player._d_angle_degrees_per_frame

            # spawn enemies if needed
            if hostile_down:
                # create first two enemy sprites and add to relevant groups / provide with relevant groups
                self.spawn_hostile(center=np.array([50, 350]),
                                   speed=300,
                                   d_angle_degrees_per_second=150,
                                   max_speed_pixel_per_second=300)  # enemy #1

            if ally_down:
                # reanimate player
                self.spawn_ally(center=np.array([1400, 350]),
                                speed=300,
                                angle=180,
                                d_angle_degrees_per_second=150,
                                max_speed_pixel_per_second=300)

            if not paused:

                # update game state
                self.update_game_state()

                # draw update game state to screen
                self.draw_game_state()

                # check and handle collisions
                hostile_down, ally_down = self.handle_collisions()

            # control pace
            self.clock.tick(fps)
Exemplo n.º 55
0
def run_game():
    global bullets_die
    pygame.init()
    ai_settings = Settings()
    stats = GameStats(ai_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()
    alienbullets = Group()
    play_button = Button(ai_settings, screen, 'Run!')

    stats = GameStats(ai_settings)

    aliens = Group()
    alien = Alien(ai_settings, screen)
    alien_width = alien.rect.width
    available_spase_x = ai_settings.screen_width - 2 * alien_width
    number_aliens_x = int(available_spase_x / (2 * alien_width))
    number_rows = get_number_rows(ai_settings, ship.rect.height,
                                  alien.rect.height)
    alien.rect.x = randint(0, ai_settings.screen_width)
    alien.rect.y = randint(0, ai_settings.screen_height)
    aliens.add(alien)
    tre = 9

    #    print(alien.rect.y)

    #        create_alien(ai_settings,screen,aliens,alien_number,row_number)
    # aliens.add(alien)

    bg_color = (20, 250, 200)
    while True:
        if not stats.game_active:
            play_button.draw_button()
            for event in pygame.event.get():

                #for event in pygame.event.get():

                if event.type == pygame.MOUSEBUTTONDOWN:
                    mouse_x, mouse_y = pygame.mouse.get_pos()
                    #for alien in aliens.sprites():
                    if play_button.rect.collidepoint(mouse_x, mouse_y):
                        stats.game_active = True

        if stats.game_active == True:
            if tre == 1:
                break

                #    print(alien.rect.y)
            # tre = randint(-1000,1000)
            # if tre == 1:
            #     alien.y = 0
            #     create_alien(ai_settings,screen,aliens,alien_number,row_number)
            # if tre >= 990:
            #     bullets_die = False
            #     for row_number in range(number_rows):
            #         for alien_number in range(number_aliens_x):

            #         #    print(alien.rect.y)

            #             create_alien(ai_se
            for event in pygame.event.get():

                #for event in pygame.event.get():

                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_8:
                        tre = 1
                    if event.key == pygame.K_1:
                        first = randint(0, 220)
                        second = randint(0, 220)
                        three = randint(0, 220)
                        ai_settings.bg_color = (first, second, three)
                    if event.key == pygame.K_b:
                        stats.game_active = False

                    if event.key == pygame.K_RIGHT:
                        ship.movin_up = False
                        ship.movin_down = False
                        ship.movin_left = False
                        ship.movin_right = True
                    if event.key == pygame.K_UP:

                        ship.movin_up = True
                        ship.movin_down = False
                        ship.movin_left = False
                        ship.movin_right = False

                    if event.key == pygame.K_DOWN:
                        ship.movin_up = False
                        ship.movin_down = True
                        ship.movin_left = False
                        ship.movin_right = False
                    if event.key == pygame.K_SPACE:
                        if len(bullets) < ai_settings.bullet_allowed:

                            new_bullet = Bullet(ai_settings, screen, ship)
                            bullets.add(new_bullet)

                    if event.key == pygame.K_LEFT:
                        ship.movin_up = False
                        ship.movin_down = False
                        ship.movin_left = True
                        ship.movin_right = False
                if event.type == pygame.MOUSEBUTTONDOWN:
                    mouse_x, mouse_y = pygame.mouse.get_pos()
                    ship.rect.x = mouse_x
                    ship.rect.y = mouse_y

            bullets.update()

            ship.update()

            #   aliens.update()

            ship.blitme()

            alienbullets.update(bullets, aliens)
            alienbullets.update(bullets, aliens)

            ship.blitme()
            pygame.display.flip()
            for bullet in bullets.copy():
                if bullet.rect.bottom <= 0:
                    bullets.remove(bullet)

            screen.fill(ai_settings.bg_color)
        for bullet in bullets.sprites():
            bullet.draw_bullet()
            first = randint(0, 200)
            second = randint(0, 200)
            three = randint(0, 200)
            ai_settings.bullet_color = (0, 0, 0)

            collisions = pygame.sprite.groupcollide(bullets, aliens,
                                                    bullets_die, True)
            if len(aliens) == 0:
                bullets.empty()
                for row_number in range(number_rows):
                    for alien_number in range(number_aliens_x):

                        #    print(alien.rect.y)

                        create_alien(ai_settings, screen, aliens, alien_number,
                                     row_number)

        ship.blitme()

        bullets.update()
        alien.blitme()
        aliens.update()
        if pygame.sprite.spritecollideany(ship, aliens):
            if ai_settings.bullet_width >= ai_settings.width:

                alien.rect.x = randint(0, ai_settings.screen_width)
                alien.rect.y = randint(0, ai_settings.screen_height)
                ai_settings.bullet_width += 10
                ai_settings.bullet_height += 10
                if ai_settings.bullet_width >= 300:
                    print('you win')
                    sys.exit()
                ship.rect = pygame.Rect(ship.rect.x, ship.rect.y,
                                        ai_settings.bullet_width,
                                        ai_settings.bullet_height)
                ai_settings.width = randint(1, 200)

                alien.rect = pygame.Rect(alien.rect.x, alien.rect.y,
                                         ai_settings.width, ai_settings.width)
            if ai_settings.bullet_width < ai_settings.width:

                alien.rect.x = randint(0, ai_settings.screen_width)
                alien.rect.y = randint(0, ai_settings.screen_height)
                ai_settings.bullet_width -= 10
                ai_settings.bullet_height -= 10
                ai_settings.width = randint(10, 200)

                ship.rect = pygame.Rect(ship.rect.x, ship.rect.y,
                                        ai_settings.bullet_width,
                                        ai_settings.bullet_height)
                alien.rect = pygame.Rect(alien.rect.x, alien.rect.y,
                                         ai_settings.width, ai_settings.width)
                if ai_settings.bullet_width <= 0:
                    print('you lose')
                    sys.exit()

        #    aliens.add(alien)
        chek_fleet_edges(ai_settings, aliens)

        #

        pygame.display.flip()
Exemplo n.º 56
0
class Game(object):
    def __init__(self,
                 screen_width=1500,
                 screen_height=700,
                 fps=60,
                 background_image=None):
        '''Initializes the game object and also the game'''

        # initialize pygame (handles pretty much eveything)
        pg.init()

        # create clock
        self.clock = pg.time.Clock()

        self.background_image = pg.image.load(
            './graphics/misc/star_wars_background_24bit.bmp')
        self.fps = fps

        # initialize main screen
        size = screen_width, screen_height  # set screen size
        self.screen = pg.display.set_mode(size)

        # load meta data
        with open('./meta/sprite_skins_meta_data.yaml',
                  'r') as skins_meta_file:
            skins_meta_data = yaml.load(skins_meta_file)

        with open('./meta/animations_meta_data.yaml',
                  'r') as animations_meta_file:
            animations_meta_data = yaml.load(animations_meta_file)

        # set player and enemy ship and laser types
        allied_ship, allied_laser = 'tieinterceptor', 'green'
        hostile_ship, hostile_laser = 'xwing', 'red'

        # set game attributes from meta data for player

        # skin specific
        self.allied_images = [
            pg.image.load(image_path)
            for image_path in skins_meta_data[allied_ship]['image_paths']
        ]
        self.allied_gun_offsets = np.array(
            skins_meta_data[allied_ship]['gun_offsets']).astype('float')
        self.allied_engine_offsets = np.array(
            skins_meta_data[allied_ship]['engine_offsets']).astype('float')
        self.allied_fire_modes = skins_meta_data[allied_ship]['fire_modes']

        # laser specific
        self.allied_laser_images = [
            pg.image.load(image_path)
            for image_path in skins_meta_data[allied_laser]['image_paths']
        ]
        self.allied_laser_sound = pg.mixer.Sound(
            animations_meta_data[allied_laser]['sound'])
        self.allied_muzzle_images = [
            pg.image.load(image_path)
            for image_path in animations_meta_data[allied_laser]['image_paths']
        ]
        self.allied_muzzle_spi = animations_meta_data[allied_laser]['spi']

        # set game attributes from meta data for enemies

        # behavioural
        self.piloting_cone_sine = 0.1
        self.gunning_cone_sine = 0.1

        # skin specific
        self.hostile_images = [
            pg.image.load(image_path)
            for image_path in skins_meta_data[hostile_ship]['image_paths']
        ]
        self.hostile_gun_offsets = np.array(
            skins_meta_data[hostile_ship]['gun_offsets']).astype('float')
        self.hostile_engine_offsets = np.array(
            skins_meta_data[hostile_ship]['engine_offsets']).astype('float')
        self.hostile_fire_modes = skins_meta_data[hostile_ship]['fire_modes']

        # laser specific
        self.hostile_laser_images = [
            pg.image.load(image_path)
            for image_path in skins_meta_data[hostile_laser]['image_paths']
        ]
        self.hostile_laser_sound = pg.mixer.Sound(
            animations_meta_data[hostile_laser]['sound'])
        self.hostile_muzzle_images = [
            pg.image.load(image_path) for image_path in
            animations_meta_data[hostile_laser]['image_paths']
        ]
        self.hostile_muzzle_spi = animations_meta_data[hostile_laser]['spi']

        # load universal game animation attributes from meta data

        # explosion
        self.explosion_images = [
            pg.image.load(image_path)
            for image_path in animations_meta_data['explosion']['image_paths']
        ]
        self.explosion_sound = pg.mixer.Sound(
            animations_meta_data['explosion']['sound'])
        self.explosion_spi = animations_meta_data['explosion']['spi']

        # engine flame
        self.engine_images = [
            pg.image.load(image_path)
            for image_path in animations_meta_data['engine']['image_paths']
        ]
        self.engine_spi = animations_meta_data['engine']['spi']

        # initialize empty sprite groups
        self.all_ships = Group()

        # player's groups
        self.allied_ships = Group()
        self.allied_laser_beams = Group()

        # enemy groups
        self.hostile_ships = Group()
        self.hostile_laser_beams = Group()

        # animation group
        self.animations = Group()

        # information displays
        self.ship_stats = Group()

        # create player sprite and add to relevant groups / provide with relevant groups
        player = self.spawn_player(center=np.array([1400, 350]),
                                   angle=180,
                                   speed=250,
                                   d_angle_degrees_per_second=150,
                                   max_speed_pixel_per_second=360)

        # create two wingmen
        self.spawn_ai_squadron(
            'allied',
            centers=[np.array([1400, 100]),
                     np.array([1400, 700])],
            angles=[180, 180],
            speeds=[300, 300],
            d_angle_degrees_per_seconds=[150, 150],
            max_speed_pixel_per_seconds=[300, 300])

        # create three enemies
        self.spawn_ai_squadron('hostile',
                               centers=[
                                   np.array([50, 100]),
                                   np.array([50, 350]),
                                   np.array([50, 700])
                               ],
                               angles=[0, 0, 0],
                               speeds=[300, 300, 300],
                               d_angle_degrees_per_seconds=[150, 150, 150],
                               max_speed_pixel_per_seconds=[300, 300, 300])

        # initialize enemy down time so that 2 enemies are spawned at beginning of game
        hostile_down = False
        ally_down = False

        # initialize pause state variable
        paused = False

        # initiazlie sound toggle variable
        sound = False

        # start main game loop
        while True:
            # check for exit events
            for event in pg.event.get():
                if event.type == pg.QUIT:

                    # quit pygame
                    pg.quit()
                    sys.exit()
                elif event.type == pg.KEYDOWN:

                    # toggle pause state if needed
                    if event.key == pg.K_ESCAPE:
                        paused = not paused

                    # toggle sound if needed
                    if event.key == pg.K_s:
                        sound = not sound

                        # update sprites if needed
                        for ship in self.all_ships.sprites():
                            ship._sound = sound

                    # control player fire mode
                    if event.key == pg.K_f:
                        player._toggle_fire_mode()

                    # control player fire commands
                    if event.key == pg.K_SPACE:
                        player._command_to_fire = True

                    # control player acceleration
                    if event.key == pg.K_UP:
                        player._d_speed += player._d_speed_pixel_per_frame
                    if event.key == pg.K_DOWN:
                        player._d_speed -= player._d_speed_pixel_per_frame

                    # control player steering
                    if event.key == pg.K_RIGHT:
                        player._d_angle -= player._d_angle_degrees_per_frame
                    if event.key == pg.K_LEFT:
                        player._d_angle += player._d_angle_degrees_per_frame

                elif event.type == pg.KEYUP:

                    # control player fire commands
                    if event.key == pg.K_SPACE:
                        player._command_to_fire = False

                    # control player acceleration
                    if event.key == pg.K_UP:
                        player._d_speed -= player._d_speed_pixel_per_frame
                    if event.key == pg.K_DOWN:
                        player._d_speed += player._d_speed_pixel_per_frame

                    # control player steering
                    if event.key == pg.K_RIGHT:
                        player._d_angle += player._d_angle_degrees_per_frame
                    if event.key == pg.K_LEFT:
                        player._d_angle -= player._d_angle_degrees_per_frame

            # spawn enemies if needed
            if hostile_down:
                # create first two enemy sprites and add to relevant groups / provide with relevant groups
                self.spawn_hostile(center=np.array([50, 350]),
                                   speed=300,
                                   d_angle_degrees_per_second=150,
                                   max_speed_pixel_per_second=300)  # enemy #1

            if ally_down:
                # reanimate player
                self.spawn_ally(center=np.array([1400, 350]),
                                speed=300,
                                angle=180,
                                d_angle_degrees_per_second=150,
                                max_speed_pixel_per_second=300)

            if not paused:

                # update game state
                self.update_game_state()

                # draw update game state to screen
                self.draw_game_state()

                # check and handle collisions
                hostile_down, ally_down = self.handle_collisions()

            # control pace
            self.clock.tick(fps)

    def update_game_state(self):
        '''Updates the game state by updating all the game's sprite groups.'''

        self.all_ships.update()
        self.allied_laser_beams.update()
        self.hostile_laser_beams.update()
        self.animations.update()
        self.ship_stats.update()

    def draw_game_state(self):
        '''Draws updated game state by wiping the game's main surface,
        drawing all the game's sprite groups and then flipping the game's main
        surface to display the drawings.'''

        # draw new game state
        self.screen.blit(self.background_image,
                         (0, 0))  # paint over old game state

        self.all_ships.draw(self.screen)  # draw all sprites
        self.allied_laser_beams.draw(self.screen)  # draw player lasers
        self.hostile_laser_beams.draw(self.screen)  # draw enemy lasers
        self.animations.draw(self.screen)  # draw animations
        self.ship_stats.draw(self.screen)  # draw frames and ship ids

        # flip canvas
        pg.display.flip()

    def _sync_player_(self, player_sprite):
        '''Takes a ShipSprite class object and syncs its _d_speed and _d_angle
        attributes with the keyboard state. This is to avoid weird movement 
        when arrow keys are pressed while player is spawned.'''

        pressed_keys = pg.key.get_pressed()

        # sync player angle attributes
        if pressed_keys[pg.K_LEFT]:
            player_sprite._d_angle += player_sprite._d_angle_degrees_per_frame
        if pressed_keys[pg.K_RIGHT]:
            player_sprite._d_angle -= player_sprite._d_angle_degrees_per_frame

        # sync player speed attributes
        if pressed_keys[pg.K_UP]:
            player_sprite._d_speed += player_sprite._d_speed_pixel_per_frame
        if pressed_keys[pg.K_DOWN]:
            player_sprite._d_speed -= player_sprite._d_speed_pixel_per_frame

    def _get_id_image(self, ship_id, size=(50, 50)):
        '''Takes the ship_id and makes and returns a pygame surface with that 
        ID in the bottom right corner.'''

        largeText = pg.font.Font('freesansbold.ttf', 12)
        textSurface = largeText.render(ship_id, True, (254, 254, 254))

        return [textSurface]

    def spawn_player(self,
                     ship_id="P",
                     center=np.array([900, 300]),
                     angle=0,
                     speed=200,
                     d_angle_degrees_per_second=150,
                     d_speed_pixel_per_second=10,
                     max_speed_pixel_per_second=400):
        '''Creates a new PlayerShipSprite object and adds it to the game.'''

        # create ship sprite object
        player = ShipSprite(
            self.fps,
            self.screen,
            self.allied_images,
            self.allied_gun_offsets,
            self.allied_fire_modes,
            self.allied_laser_beams,
            self.allied_laser_sound,
            self.allied_laser_images,
            1.2,  # laser range in seconds
            150,  # laser speed in pixel per second
            1.5,  # laser rate of fire in seconds
            self.allied_muzzle_images,
            self.allied_muzzle_spi,  # seconds per image for muzzle flash
            self.explosion_sound,  # sound of explosion animation
            self.explosion_images,
            self.
            explosion_spi,  # seconds per image for explosions animation at death
            self.allied_engine_offsets,
            self.engine_images,
            self.engine_spi,
            self.animations,
            (self.allied_ships, self.all_ships),
            center=center,
            angle=angle,
            speed=speed,
            d_angle_degrees_per_second=d_angle_degrees_per_second,
            d_speed_pixel_per_second=d_speed_pixel_per_second,
            max_speed_pixel_per_second=max_speed_pixel_per_second)

        # sync player controls with keyboard state
        self._sync_player_(player)

        # draw frame around player ship
        TrackingAnimation(self.fps,
                          self.screen,
                          [pg.image.load("./graphics/misc/player_frame.bmp")],
                          10000,
                          player,
                          np.array([0, 0]).astype('float'),
                          self.ship_stats,
                          looping=True,
                          dynamic_angle=False)

        # get ship_id display surface
        ship_id_images = self._get_id_image(ship_id, (50, 50))

        # draw ship id for hostile ship
        TrackingAnimation(self.fps,
                          self.screen,
                          ship_id_images,
                          10000,
                          player,
                          np.array([15, 25]).astype('float'),
                          self.ship_stats,
                          looping=True,
                          dynamic_angle=False)

        return player

    def spawn_ally(self,
                   ship_id,
                   center=np.array([1200, 500]),
                   angle=180,
                   speed=200,
                   d_angle_degrees_per_second=150,
                   d_speed_pixel_per_second=10,
                   max_speed_pixel_per_second=350):
        '''Creates a new allied AIShipSprite and adds it to the game.'''

        # spawn AI controlled allied ship sprite
        ally = AIShipSprite(
            self.fps,
            self.screen,  # main screen
            self.allied_images,  # sequence with ShipSprite's skin
            self.allied_gun_offsets,
            self.allied_fire_modes,  # 
            self.allied_laser_beams,
            self.allied_laser_sound,  # pygame sound object; laser fire sound
            self.allied_laser_images,  # sequence with laser beam skin
            1.2,
            150,
            1.5,  # laser rate of fire in shots/second
            self.
            allied_muzzle_images,  # sequence of images for muzzle flash animation
            self.
            allied_muzzle_spi,  # seconds per image for muzzle flash animation
            self.explosion_sound,
            self.explosion_images,
            self.explosion_spi,
            self.allied_engine_offsets,
            self.engine_images,
            self.engine_spi,
            self.animations,
            #player,
            self.piloting_cone_sine,
            self.gunning_cone_sine,
            (self.allied_ships, self.all_ships),
            hostile_ships_group=self.
            hostile_ships,  # group of hostile ships sprites
            center=center,
            angle=angle,
            speed=speed,
            d_angle_degrees_per_second=d_angle_degrees_per_second,
            d_speed_pixel_per_second=d_speed_pixel_per_second,
            max_speed_pixel_per_second=max_speed_pixel_per_second)

        # draw frame around ally ship
        TrackingAnimation(self.fps,
                          self.screen,
                          [pg.image.load("./graphics/misc/ally_frame.bmp")],
                          10000,
                          ally,
                          np.array([0, 0]).astype('float'),
                          self.ship_stats,
                          looping=True,
                          dynamic_angle=False)

        # get ship_id display surface
        ship_id_images = self._get_id_image(ship_id)

        # draw ship id for hostile ship
        TrackingAnimation(self.fps,
                          self.screen,
                          ship_id_images,
                          10000,
                          ally,
                          np.array([15, 15]).astype('float'),
                          self.ship_stats,
                          looping=True,
                          dynamic_angle=False)

    def spawn_hostile(self,
                      ship_id,
                      center=np.array([1200, 50]),
                      angle=0,
                      speed=200,
                      d_angle_degrees_per_second=150,
                      d_speed_pixel_per_second=10,
                      max_speed_pixel_per_second=350):
        '''Creates a new hostile AIShipSprite and adds it to the game.'''

        # spawn hostile AI controlled ship sprite
        hostile = AIShipSprite(
            self.fps,
            self.screen,  # main screen
            self.hostile_images,  # sequence with ShipSprite's skin
            self.hostile_gun_offsets,
            self.hostile_fire_modes,  # 
            self.hostile_laser_beams,
            self.hostile_laser_sound,  # pygame sound object; laser fire sound
            self.hostile_laser_images,  # sequence with laser beam skin
            1.2,
            150,
            1.5,  # laser rate of fire in shots/second
            self.
            hostile_muzzle_images,  # sequence of images for muzzle flash animation
            self.
            hostile_muzzle_spi,  # seconds per image for muzzle flash animation
            self.explosion_sound,
            self.explosion_images,
            self.explosion_spi,
            self.hostile_engine_offsets,
            self.engine_images,
            self.engine_spi,
            self.animations,
            #player,
            self.piloting_cone_sine,
            self.gunning_cone_sine,
            (self.hostile_ships, self.all_ships),
            hostile_ships_group=self.
            allied_ships,  # group of hostile ships sprites
            center=center,
            angle=angle,
            speed=speed,
            d_angle_degrees_per_second=d_angle_degrees_per_second,
            d_speed_pixel_per_second=d_speed_pixel_per_second,
            max_speed_pixel_per_second=max_speed_pixel_per_second)

        # draw frame around hostile ship
        TrackingAnimation(self.fps,
                          self.screen,
                          [pg.image.load("./graphics/misc/hostile_frame.bmp")],
                          10000,
                          hostile,
                          np.array([0, 0]).astype('float'),
                          self.ship_stats,
                          looping=True,
                          dynamic_angle=False)

        # get ship_id display surface
        ship_id_images = self._get_id_image(ship_id)

        # draw ship id for hostile ship
        TrackingAnimation(self.fps,
                          self.screen,
                          ship_id_images,
                          10000,
                          hostile,
                          np.array([20, 20]).astype('float'),
                          self.ship_stats,
                          looping=True,
                          dynamic_angle=False)

    def spawn_ai_squadron(self, side, centers, angles, speeds,
                          d_angle_degrees_per_seconds,
                          max_speed_pixel_per_seconds):
        '''Util function to spawn a group of allied or hostile ships. Usually
        used at beginning of game.'''

        ship_id_counter = 1  # counter
        ship_id_tail = side[0].upper()  # initial of side

        for center, angle, speed, d_angle, max_speed in zip(
                centers, angles, speeds, d_angle_degrees_per_seconds,
                max_speed_pixel_per_seconds):

            ship_id = str(ship_id_counter) + ship_id_tail

            if side == 'allied':
                self.spawn_ally(ship_id,
                                center=center,
                                angle=angle,
                                speed=speed,
                                d_angle_degrees_per_second=d_angle,
                                max_speed_pixel_per_second=max_speed)

            elif side == 'hostile':
                self.spawn_hostile(ship_id,
                                   center=center,
                                   angle=angle,
                                   speed=speed,
                                   d_angle_degrees_per_second=d_angle,
                                   max_speed_pixel_per_second=max_speed)

            ship_id_counter += 1

    def handle_collisions(self):
        '''Checks for collisions between player sprite and enemy lasers, as well
        as enemy sprites and player lasers. Terminates any sprites that were
        shot down. Records the time of the kill.'''

        ally_down = False
        hostile_down = False

        # check for enemy kills
        hit_allies = groupcollide(self.allied_ships, self.hostile_laser_beams,
                                  False, True, collide_mask)

        for hit_ally in hit_allies:
            # update hit ship's hit points attribute
            hit_ally._hit_points -= 1

            # if ship has no more hit points left, destroy and set flag
            if not hit_ally._hit_points:
                hit_ally.kill()
                #ally_down = True

        # check for player kills
        hit_hostiles = groupcollide(self.hostile_ships,
                                    self.allied_laser_beams, False, True,
                                    collide_mask)

        for hit_hostile in hit_hostiles:
            # update hit ship's hit points attribute
            hit_hostile._hit_points -= 1

            # if ship has no more hit points left, destroy and flag
            if not hit_hostile._hit_points:
                hit_hostile.kill()
                #hostile_down = True

        return hostile_down, ally_down
Exemplo n.º 57
0
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, 38)
        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_ships()

    def prep_score(self):
        #得分转换为图像
        round_score = round(self.stats.score, -1)
        score_str = "{:,}".format(round_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 = 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.score_image.get_rect()
        self.high_score_rect.centerx = self.screen_rect.centerx
        self.high_score_rect.top = 20

    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.screen_rect.right - 20
        self.level_rect.top = self.level_rect.bottom + 30

    def prep_ships(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 = 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)
Exemplo n.º 58
0
class Scoreboard:
    """A class to report scoring information."""
    def __init__(self, ai_game):
        """Initialize scorekeeping attributes."""
        self.ai_game = ai_game
        self.screen = ai_game.screen
        self.screen_rect = self.screen.get_rect()
        self.settings = ai_game.settings
        self.stats = ai_game.stats

        # Font settings for scoring information.
        self.text_color = (255, 255, 255)
        self.font = pygame.font.SysFont(None, 48)

        # Prepare the initial score image.
        self.prep_score()
        self.prep_high_score()

        self.prep_level()
        self.prep_ships()

    def prep_score(self):
        """Turn the score into a rendered image."""
        #score_str = str(self.stats.score)
        rounded_score = round(self.stats.score, -1)
        score_str = "{:,}".format(rounded_score)

        self.score_image = self.font.render(score_str, True, self.text_color,
                                            self.settings.bg_color)

        # Display the score at the top right of the screen.
        self.score_rect = self.score_image.get_rect()
        self.score_rect.right = self.screen_rect.right - 20
        self.score_rect.top = 20

    def show_score(self):
        """Draw scores, level, and ships to the screen."""
        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)

    def prep_high_score(self):
        """Turn the high score into a rendered image."""
        high_score = 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.settings.bg_color)

        # Center the high score at the top of the screen.
        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 check_high_score(self):
        """Check to see if there's a new high score."""
        if self.stats.score > self.stats.high_score:
            self.stats.high_score = self.stats.score
            self.prep_high_score()
            self.prep_level()

    def prep_level(self):
        '''Turn the level into a rendered image'''
        level_str = str(self.stats.level)
        self.level_image = self.font.render(level_str, True, self.text_color,
                                            self.settings.bg_color)

        #Position the level below the score
        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):
        """Show how many ships are left."""
        self.ships = Group()

        for ship_number in range(self.stats.ships_left):
            ship = Ship(self.ai_game)
            ship.rect.x = 10 + ship_number * ship.rect.width
            ship.rect.y = 10
            self.ships.add(ship)
Exemplo n.º 59
0
def run_game():
    pygame.mixer.pre_init(44100, -16, 2, 2048)
    pygame.mixer.init()
    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)
    stats = GameStats(ai_settings)
    hud = Hud(ai_settings, screen, stats, ship)
    play_button = Button(screen, "Start")
    bullets = Group()
    aliens = Group()
    alien_bullets = Group()
    health = Group()
    ammo = Group()
    used_shields = Group()
    bosses = GroupSingle()
    boss_shields = GroupSingle()
    clock = pygame.time.Clock()
    boss_bullets = Group()
    black_holes = GroupSingle()
    ai_settings.state = ai_settings.running
    # Main game cycle.
    while True:
        dt = clock.tick()
        gf.check_events(ai_settings, screen, stats, hud, play_button, ship,
                        aliens, bullets, used_shields)
        gf.check_keys_pressed(ship)
        if ai_settings.state == ai_settings.running:
            if stats.game_active:
                ship.update()
                gf.update_ship_shield(ship, alien_bullets, used_shields,
                                      boss_bullets)
                gf.update_bullets(ai_settings, screen, stats, hud, ship,
                                  aliens, bullets, alien_bullets, health, ammo,
                                  bosses, boss_bullets, boss_shields,
                                  black_holes)
                gf.update_aliens(ai_settings, screen, stats, hud, ship, aliens,
                                 bullets, alien_bullets, health, ammo,
                                 used_shields)
                gf.fire_alien_bullets(ai_settings, screen, stats, ship, aliens,
                                      alien_bullets, dt)
                gf.update_alien_bullets(ai_settings, screen, stats, hud, ship,
                                        aliens, bullets, alien_bullets, health,
                                        ammo, used_shields)
                if stats.stage == ai_settings.boss_stages[0]:
                    gf.update_green_boss(ai_settings, screen, stats, hud, ship,
                                         bullets, used_shields, bosses,
                                         boss_bullets, boss_shields, bosses)
                    gf.fire_green_boss_bullets(ai_settings, screen, dt, bosses,
                                               boss_bullets)
                    gf.update_green_boss_bullets(ai_settings, screen, stats,
                                                 hud, ship, bullets,
                                                 used_shields, bosses,
                                                 boss_bullets, boss_shields,
                                                 black_holes)
                    gf.update_green_boss_shield(hud, bullets, boss_shields)
                elif stats.stage == ai_settings.boss_stages[1]:
                    gf.update_red_boss(ai_settings, screen, stats, hud, ship,
                                       bullets, used_shields, bosses,
                                       boss_bullets, boss_shields, black_holes)
                    gf.update_red_boss_shield(hud, bullets, boss_shields)
                    gf.fire_red_boss_bullets(ai_settings, screen, ship, dt,
                                             bosses, boss_bullets)
                    gf.update_red_boss_bullets(ai_settings, screen, stats, hud,
                                               ship, bullets, used_shields,
                                               bosses, boss_bullets,
                                               boss_shields, black_holes)
                elif stats.stage == ai_settings.boss_stages[2]:
                    gf.update_blue_boss(ai_settings, screen, stats, hud, ship,
                                        bullets, used_shields, bosses,
                                        boss_bullets, boss_shields,
                                        black_holes)
                    gf.update_blue_boss_shield(hud, bullets, boss_shields)
                    gf.fire_blue_boss_bullets(ai_settings, screen, dt, bosses,
                                              boss_bullets)
                    gf.update_blue_boss_bullets(ai_settings, screen, stats,
                                                hud, ship, bullets,
                                                used_shields, bosses,
                                                boss_bullets, boss_shields,
                                                black_holes)
                    gf.create_black_hole(ai_settings, screen, ship, dt,
                                         black_holes)
                    gf.update_black_hole(ai_settings, screen, stats, hud, ship,
                                         bullets, used_shields, dt, bosses,
                                         boss_bullets, boss_shields,
                                         black_holes)

                gf.update_ship_health(stats, hud, ship, health)
                gf.update_ship_ammo(stats, hud, ship, ammo)
        elif ai_settings.state == ai_settings.paused:
            pass
        if ai_settings.state == ai_settings.running:
            gf.update_screen(ai_settings, screen, stats, hud, ship, aliens,
                             bullets, alien_bullets, play_button, health, ammo,
                             used_shields, dt, bosses, boss_bullets,
                             boss_shields, black_holes)
        else:
            pass
Exemplo n.º 60
0
class Scoreboard():
    """A class to report scoring information"""
    def __init__(self, ai_settings, screen, stats):
        """Initialise scorekeeping attributes"""
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.ai_settings = ai_settings
        self.stats = stats

        #Font settings for scoring information
        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None, 48)

        #Prepare the initial score image
        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_ships()

    def prep_score(self):
        """Turn the score into a rendered image"""
        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_colour)

        #Display the score at the top right of the screen
        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):
        """Turn the high score into a rendered image"""
        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_colour)

        #Center the high score at the top of the screen
        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.screen_rect.top

    def prep_level(self):
        """Turn the level into a rendered image"""
        self.level_image = self.font.render(str(self.stats.level), True,
                                            self.text_color,
                                            self.ai_settings.bg_colour)

        #Position the level below the score
        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):
        """Show how many ships are left"""
        self.ships = Group()
        for ship_number in 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):
        """Draw the score to the screen"""
        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)