Exemplo n.º 1
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.º 2
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.º 3
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.º 4
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.º 5
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.º 6
0
class ExplorableScreen(GameScreen):

    def __init__(self, config, model):
        super(ExplorableScreen, self).__init__(config, model)

    def setup(self):
        super(ExplorableScreen, self).setup()
        pastel_flowers = Image(os.path.join("sample_sprites", "tiles", "png", "pastel_flowers.png"))
        grass = Image(os.path.join("sample_sprites", "tiles", "png", "grass.png"))
        images = (pastel_flowers, grass)

        # XXX Just a demo, do not try this at home: this (rightly!) assumes that
        # pastel_flowers and grass have the same dimensions
        visible_width = int(self.screen_dimensions[GameConfig.WIDTH_INDEX] / pastel_flowers.width)
        visible_height = int(self.screen_dimensions[GameConfig.HEIGHT_INDEX] / pastel_flowers.height)
        area_tile_size = (visible_width + 2) * (visible_height + 2)
        self.tiles = Group()
        
        for i in range(area_tile_size):
            img = random.choice(images)
            img_xpos = img.width * (i % visible_width)
            img_ypos = img.height * (i % visible_height)

            self.tiles.add(PyRoSprite(img.clone((img_xpos, img_ypos))))

    def draw_screen(self, window):
        self.tiles.draw(window)
        self.tiles.update()
Exemplo n.º 7
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.º 8
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.º 9
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.º 10
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.º 11
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.º 12
0
def create_shield(settings, screen, number):
	"""Create and return a group of blocks that make up a single shield."""
	shield_blocks = Group()

	for row in range(settings.shield_rows):
		for column in range(settings.shield_columns):
			if settings.shield_array[row][column] == 'b':
				new_block = Block(settings, screen, settings.green,
								  settings.shield_x + (132 * number + number * 3) + (column * settings.block_size),
								  settings.shield_y + (row * settings.block_size))
				shield_blocks.add(new_block)
	return shield_blocks
Exemplo n.º 13
0
def create_ground(settings, screen):
	"""Create a ground line under player."""
	ground_blocks = Group()

	# Calculate how many blocks fit on the screen and create them.
	for column in range(int((settings.screen_width / settings.block_size) -
									int((settings.ground_offsetx * 2) / settings.block_size))):
		block = Block(settings, screen, settings.green, settings.ground_offsetx + settings.block_size * column,
					  settings.ground_y)
		ground_blocks.add(block)

	return ground_blocks
Exemplo n.º 14
0
	def create_invader_shot_explosion(self, settings, screen, x, y):
		"""Create and return explosion "sprite" as a group of Blocks. Top-left point of group is set to x, y."""
		explode_blocks = Group()

		for row in range(settings.invader_shot_explode_rows):
			for column in range(settings.invader_shot_explode_columns):
				if settings.invader_shot_explode_array[row][column] == 'b':
					new_block = Block(settings, screen, settings.white,
						x + (column * settings.block_size),
						y + (row * settings.block_size))
					explode_blocks.add(new_block)

		return explode_blocks
Exemplo n.º 15
0
    def build(self, data):
        rows = len(data)
        cols = len(data[0])

        tiles = Group()
        for y, row in enumerate(data):
            for x, cell in enumerate(row):
                data = self.tilemap.get(cell)
                if data:
                    tile = Tile(cell, data["image"], (x*self.w, y*self.h), data["collides"])
                    tiles.add(tile)

        return tiles, (cols * self.w, rows * self.h)
Exemplo n.º 16
0
class VerticalToolbar(pygame.sprite.Sprite):
  def __init__(self, editor_level, font_manager):
    pygame.sprite.Sprite.__init__(self)

    self.editor_level = editor_level

    self.selected = None
    self.position = Point(constants.HORIZONTAL_TILES, 0)
    self.width = editor_constants.RIGHT_BAR_RATIO
    self.height = constants.VERTICAL_TILES

    self.options = Group()
    self.hotkeys = {}
    top = editor_constants.RIGHT_BAR_ITEM_SPACING
    for (name, data) in editor_constants.ENTITY_DATA:
      option = ToolbarOption(top, name, data, font_manager)
      if self.selected is None:
        self.select(option)
      self.options.add(option)
      top += editor_constants.RIGHT_BAR_ITEM_RATIO + editor_constants.RIGHT_BAR_ITEM_SPACING
      self.hotkeys[data.hotkey] = option

    self.update_graphics()

  def hotkey(self, hotkey):
    if hotkey in self.hotkeys:
      self.select(self.hotkeys[hotkey])

  def select(self, option):
    if self.selected is not None:
      self.selected.toggle_select()
    self.selected = option
    self.selected.toggle_select()

    self.editor_level.entity_to_create = option.name

  def left_click(self, position, pressed):
    for option in self.options:
      rect = pygame.Rect(option.position.scale(constants.TILE_SIZE), (constants.TILE_SIZE * option.size, constants.TILE_SIZE * option.size))
      if rect.collidepoint(position.scale(constants.TILE_SIZE)):
        self.select(option)

  def update_graphics(self):
    width = int(round(self.width * constants.TILE_SIZE))
    height = int(round(self.height * constants.TILE_SIZE))
    self.image = pygame.Surface([width, height])
    self.image.fill(editor_constants.TOOLBAR_COLOR)
    self.rect = self.image.get_rect(topleft=self.position.scale(constants.TILE_SIZE))

  def draw(self, screen):
    self.options.draw(screen)
Exemplo n.º 17
0
class Logo:
    "Escena que muestra el logotipo del grupo losersjuegos."

    def __init__(self, world):
        self.world = world
        self.sprites = Group()
        self._create_sprites()
        self._reset_timer()

    def _reset_timer(self):
        self.time_out = 50

    def update(self):
        key = pygame.key.get_pressed()

        if key[pygame.K_ESCAPE]:
            self.world.state = Logo(self.world)
            self._reset_timer()
            return
        else:
            self.sprites.update()

        if self.time_out < 1 or key[pygame.K_RETURN]:
            self.world.change_state(scenes.mainmenu.MainMenu(self.world))

        self.time_out -= 1

    def draw(self, screen):
        screen.fill((92, 123, 94))
        self.sprites.draw(screen)
        pygame.display.flip()

    def _create_sprites(self):
        steps = [0, 0, 0, 1, 2, 3, 4]
        losers = SimpleAnimation('logo', 'losers_5.png', steps, 2)
        sprite_losers = LogoSpriteAnimated(losers, LEFT, 190, 190)

        steps2 = [0, 0, 0, 1, 2, 3, 4]
        juegos = SimpleAnimation('logo', 'juegos_5.png', steps2, 2)
        sprite_juegos = LogoSpriteAnimated(juegos, RIGHT, 390, 190)

        steps3 = [0, 0, 0, 1, 1, 2, 3]
        ceferino = SimpleAnimation('logo', 'ceferino_4.png', steps3, 2)
        sprite_ceferino = LogoSpriteAnimated(ceferino, RIGHT, 40, 160)

        self.sprites.add([sprite_juegos, sprite_losers, sprite_ceferino])

    def handle_event(self, event):
        pass
Exemplo n.º 18
0
    def freebie(self):
        groupus = Group()
        groupus.add(self.blackHoles,self.goal)
        self.player.makeANew = True
        self.player.addTail = False
        while True:
            self.clock.tick(self.fps)
            pygame.draw.rect(self.screen,(0,0,0),((0,0),(1000,750)))
            
            for evt in pygame.event.get():
                if evt.type == QUIT:
                    self.quit()
                if evt.type == KEYDOWN:
                    if evt.key == K_ESCAPE:
                        self.quit()
            
            
            for obj in self.blackHoles:
                if pygame.sprite.collide_mask(self.player,obj):
                    self.player.blackHoleCollision(True,False)

            for obj in self.masslessObstacles:
                if  pygame.sprite.collide_mask(self.player,obj):
                    self.player.update(True)
        
            for obj in self.userPlacedObjects:
                if pygame.sprite.collide_mask(self.player,obj) and not obj.grabbed:
                    self.player.update(True)
            

            self.startItems.update()
            #self.masslessObstacles.update()
            self.stars.draw()
            self.player.drawTails()
            self.goalCollide.draw(self.screen)
            self.masslessObstacles.draw(self.screen)
            self.userPlacedObjects.draw(self.screen)
            self.toolbar.draw(self.screen)
            self.blackHoles.draw(self.screen)
            self.player.update(False,groupus)
            self.playerGroup.draw(self.screen)  
            self.startItems.draw(self.screen)
            if len(self.playerGroup) < 1:
                self.player.addTail = True
                pygame.time.wait(750)
                self.player.add(self.playerGroup)
                break
            pygame.display.flip()
Exemplo n.º 19
0
class WvmSpritesList():
    """A class listing all the Sprites of the game."""

    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()

    def update_all(self):
        """Update the positions of all sprites."""
        self.update_missiles()
        self.wiz.update()
        self.monsters.update()

    def update_missiles(self):
        """update magic missiles positions"""
        self.missiles.update()
        # remove the missiles that have left the screen
        for mi in self.missiles.copy():
            if mi.rect.left >= self.screen.get_rect().right:
                self.missiles.remove(mi)

    def draw(self):
        self.screen.fill(self.config.bg_color)
        for mi in self.missiles:
            mi.draw_missile()
        self.wiz.blitme()
        for mo in self.monsters:
            mo.blitme()

    def fire_missile(self):
        """Fire a missile if limit not reached yet."""
        if len(self.missiles) < self.wiz.magic_missile_allowed:
            self.missiles.add(MagicMissile(self.config, self))

    def create_monster(self):
        """Create a new monster and place it randomly at the right."""
        monster=Monster(self.config, self)
        #TODO move the monster
        self.monsters.add(monster)
Exemplo n.º 20
0
def game():
    # init
    pygame.init()
    screen = pygame.display.set_mode(SCREEN_SIZE)
    clock = pygame.time.Clock()
    dude = PlayerShip(260, 500, screen.get_rect())
    dude_grp = GroupSingle(dude)
    enemies = Group()
    enemies.add(Burger(200, 200, screen.get_rect()))
    enemies.add(Hotdog(100, 100, screen.get_rect()))

    #loop
    while True:
        # input
        for evt in pygame.event.get():
            if evt.type == QUIT:
                return
            elif evt.type == KEYDOWN and evt.key == K_ESCAPE:
                return
            elif evt.type == KEYDOWN and evt.key == K_a:
                dude.dx = -10
            elif evt.type == KEYDOWN and evt.key == K_d:
                dude.dx = 10
            elif evt.type == KEYUP and evt.key == K_a and dude.dx == -10:
                dude.dx = 0
            elif evt.type == KEYUP and evt.key == K_d and dude.dx == 10:
                dude.dx = 0
            elif evt.type == KEYDOWN and evt.key == K_SPACE and dude.alive():
                dude.shoot()
                
        # update
        clock.tick(FPS)
        dude.update()
        enemies.update()
        dude.bullets.update()

        pygame.sprite.groupcollide(enemies, dude.bullets, 1, 1)
        pygame.sprite.groupcollide(dude_grp, enemies, 1, 0)

        # draw
        screen.fill(BLACK)
        dude_grp.draw(screen)
        enemies.draw(screen)
        dude.bullets.draw(screen)
        pygame.display.flip()
Exemplo n.º 21
0
class Scene(object):

    def __init__(self, screen):
        """Create the scene's objects."""

        self.screen = screen
        self.running = True

        # Groups for sprites
        self.players = Group()
        self.enemies = Group()
        self.chars = Group()
        self.weapons = Group()
        self.projs = Group()
        self.all = LayeredDirty()

        # Room
        self.room = Room(self)
        self.all.add(self.room)

        # Weapons
        self.weapon_list = [ LaserGun(self), Bow(self) ]
        for weapon in self.weapon_list:
            self.weapons.add(weapon)

        # Players
        self.player = Player(self)
        self.players.add(self.player)
        self.all.add(self.players)

        # Enemies
        enemy_list = [ Human, Glork ]
        for enemy in range(0, randint(50,100)):
            self.enemies.add(choice(enemy_list)(self))
        self.all.add(self.enemies)

        # Characters
        self.chars.add([self.players, self.enemies])

        # Layers
        self.all = LayeredDirty([
            self.room,
            self.enemies,
            self.players,
            self.weapons,
            self.projs ])

    def draw(self):
        """Draw all of the objects to the screen."""

        # Update all scene layers to the screen.
        self.all.update()
        self.dirty_rects = self.all.draw(self.screen)
        display.update(self.dirty_rects)
Exemplo n.º 22
0
class Board:
    def __init__(self, width: int, height: int):
        super().__init__()
        self.width = width
        self.height = height
        self.players = Group()
        self.walls = Group()
        for w in range(width >> 1):
            for h in range(height >> 1):
                wall = Wall()
                wall.rect.x = PPM * (2 * w + 1)
                wall.rect.y = PPM * (2 * h + 1)
                self.walls.add(wall)

    def draw(self, canvas):
        self.walls.draw(canvas)
        self.players.draw(canvas)

    def update(self, dt):
        self.players.update(dt)
Exemplo n.º 23
0
def test(sett, screen):	
	pepe = pygame.image.load('pepe.png')				
	borrito = pygame.image.load('borrito.png')				 
	test_dia = Dialogue(sett, screen, "right", "", pepe)
	test_dia2 = Dialogue(sett,screen, "left", "", borrito)

	dials = Group()
	dials.add(test_dia)
	dials.add(test_dia2)
		
	backwards = False

	while True:
		gf.events()
	
		if not sett.paused:
			test_dia.update(backwards)
			test_dia2.update(backwards)
			print(test_dia2.x)
			if test_dia.x == 100:
			##test dialogue. TODO have file of encounters to refer to 
				
				gf.update_screen(sett, screen, True, dials,"i am here to slay",173,255,47)
				pygame.time.wait(3000)
				gf.update_screen(sett, screen, True, dials,"prepare urself",173,255,47)
				pygame.time.wait(3000)
				gf.update_screen(sett, screen, True, dials,"no way",255,69,0)
				pygame.time.wait(3000)
				backwards = True
				#test_dia.x = test_dia.x -1  #back()
				#test_dia2.x= test_dia2.x +1 #back()
				
			if test_dia.x < -200:
				del test_dia
			if test_dia2.x > 800:	
				del test_dia2
				dials.empty()
									
		gf.update_screen(sett, screen, True, dials)
Exemplo n.º 24
0
class UI:
    
    def __init__(self):
        self.tiles = Group()
        self.bg = []
        self.tntcrate = TNTCrate()
        
        self.tiles.add(Grass(96 * gl.RESIZE_FACTOR, 176 * gl.RESIZE_FACTOR, 64 * gl.RESIZE_FACTOR, 16 * gl.RESIZE_FACTOR))
        
        self.tiles.add(Grass(32 * gl.RESIZE_FACTOR, 64 * gl.RESIZE_FACTOR, 32 * gl.RESIZE_FACTOR, 16 * gl.RESIZE_FACTOR))
        self.tiles.add(Grass(192 * gl.RESIZE_FACTOR, 64 * gl.RESIZE_FACTOR, 32 * gl.RESIZE_FACTOR, 16 * gl.RESIZE_FACTOR))

        self.tiles.add(Grass(32 * gl.RESIZE_FACTOR, 224 * gl.RESIZE_FACTOR, 32 * gl.RESIZE_FACTOR, 16 * gl.RESIZE_FACTOR))
        self.tiles.add(Grass(192 * gl.RESIZE_FACTOR, 224 * gl.RESIZE_FACTOR, 32 * gl.RESIZE_FACTOR, 16 * gl.RESIZE_FACTOR))

        for i in xrange(0, 50):
            self.bg.append(Star())

        self.bg.append(self.tntcrate)
        
    def update(self, tick):
        pass
Exemplo n.º 25
0
class PlayerShip(Sprite):
    def __init__(self, x, y, bounds):
        Sprite.__init__(self)
        self.image, self.rect = ld_pics('ship.bmp')
        self.rect.x = x
        self.rect.y = y
        self.dx = 0
        self.dy = 0
        self.bounds = bounds
        self.bullets = Group()

    def shoot(self):
        bullet = Bullet(self.rect.x, self.rect.y, self.bounds)
        self.bullets.add(bullet)

    def update(self):
        self.rect.x += self.dx
        self.rect.y += self.dy

        if self.rect.left < self.bounds.left:
            self.rect.left = self.bounds.left
        if self.rect.right > self.bounds.right:
            self.rect.right = self.bounds.right
Exemplo n.º 26
0
 def __init__(self, target, sprite_filename, formation, target_position):
 
     Group.__init__(self)
     
     self.target = target
     self.sprite_filename = sprite_filename
     self.target_position = target_position
     
     #this image is passed to each Cell object
     cell_image = pygame.image.load(sprite_filename).convert_alpha()
     
     #convert formation list into table of cell sprites
     #offsets are the difference between current cell and target cell
     #since first cell is (0, 0) these start as negative of the target
     row_offset = -target_position[0]
     cells = []
     for row in formation:
         col_offset = -target_position[1]
         cells_row = []
         for col in row:
             #0 means the cell is empty
             if col == 0:
                 cells_row.append(None)
             #1 means a cell sprite should be added here
             elif col == 1:
                 new_cell = Cell(row_offset, col_offset, cell_image, target)
                 Group.add(self, new_cell)
                 cells_row.append(new_cell)
             #anything else means wtf are you doing
             else: raise
             col_offset += 1
         cells.append(cells_row)
         row_offset += 1
         
     self.cells = cells
     
     self.delay = 0
Exemplo n.º 27
0
class Game(ApplicationState):
    foo = "foo"
    
    def setup (self):
	self.SCREEN_SIZE = SCREEN_SIZE
	self.BG_COLOR = BG_COLOR
	self.score = 0
	self.spawntime = 10
	self.spawnticker = 0
	self.robot_grp = Group()
	ImpactGroup.impacts = Group()
	ShieldGroup.shields = Group()

        self.bounds = self.app.screen.get_rect()
        self.font = pygame.font.Font(None,35)
    
	self.player = Player(self.bounds.center, self.bounds) #sets starting position fir player
	robot = Robot((randrange(0,800),randrange(0,600)), self.bounds)
	self.player_grp = GroupSingle(self.player)
    #robot_grp = GroupSingle(robot)
    
	self.robot_grp.add(Robot((randrange(0,800),randrange(0,600)), self.bounds))
	self.robot_grp.add(Brotherbot((randrange(0,800),randrange(0,600)), self.bounds))
	self.robot_grp.add(Fatherbot((randrange(0,800),randrange(0,600)), self.bounds))
	self.meteors = Group()
	self.impacts = Group()
    
	

    #game loop
    def handle_event(self, event):
        if event.type == KEYDOWN and event.key == K_ESCAPE:
            self.app.set_state(PauseMenu)
        elif event.type == KEYDOWN and event.key == K_SPACE and not self.is_gameover():
            if self.player.carrying:
                self.player.drop()
            else:
                for robot in groupcollide(self.robot_grp, self.player_grp, False, False):
                    self.player.grab(robot)
                    self.score += 50
                    print "robot picked up"

    def load_image(name, colorkey=None):
        fullname = os.path.join('resources', name)
        try:
            image = pygame.image.load(fullname)
        except pygame.error, message:
            print "Cant load yo image:", name
            raise SystemExit, message
        image = image.convert()
        if colorkey is not None:
            if colorkey is -1:
                colorkey = image.get_at((0,0))
            image.set_colorkey(colorkey, RLEACCEL)
        return image, image.get_rect()
Exemplo n.º 28
0
class InvadersGame:

    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()

    def create_aliens(self):
        for i in range(4):
            for j in range(20):
                direction = [LEFT, RIGHT][i % 2]
                alien = Alien(self.game, Vector(j * 32 + 32, i * 64), direction)
                self.aliens.add(alien)

    def shoot(self):
        shot = self.player.get_shot()
        self.shots.add(shot)

    def draw(self):
        self.game.screen.clear()
        self.player.draw()
        self.shots.draw(self.game.screen.display)
        self.alien_shots.draw(self.game.screen.display)
        self.aliens.draw(self.game.screen.display)
        self.floor.draw()

    def update(self):
        self.player.move()
        self.shots.update()
        self.alien_shots.update()
        self.aliens.update()
        for a in self.aliens:
            shot = a.get_shot()
            if shot:
                self.alien_shots.add(shot)
        self.draw()
        groupcollide(self.shots, self.aliens, True, True, collided=collide_mask)
        if spritecollideany(self.player, self.alien_shots, collided=collide_mask):
            self.game.exit()
        if not self.aliens:
            self.game.exit()

    def run(self):
        self.game.event_loop(figure_moves=self.player.set_direction,
            draw_func=self.update, keymap={K_SPACE: self.shoot}, delay=30)
Exemplo n.º 29
0
class Level(object):
    def __init__(self, name):
        self.bounds = Rect((0,0,), LEVEL_SIZE)
        
        self.blocks = Group()
        self.lethal = Group()
        self.win = Group()

        self.loadData(name)

        self.spawnPoint = (20,20)
        
        self.render_background()
    
    def render_background(self):
        self.background = Surface(self.bounds.size)
        self.background.fill((0,0,0))
        self.blocks.draw(self.background)
        self.lethal.draw(self.background)
        self.win.draw(self.background)
        
    def loadData(self, name):
        ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
        DATA_DIR = os.path.join(ROOT_DIR, 'data')

        path = os.path.join(DATA_DIR, name) + '.lvl'
        with open(path, 'r') as f:
            data = f.read().strip().split('\n')

        width = 20
        height = 20
        for y, row in enumerate(data):
            for x,c in enumerate(row):
                loc = (x*width, y*height)
                
                if c == '.':
                    self.blocks.add(Block(loc))
                elif c == '!':
                    self.lethal.add(Lethal(loc))
                elif c == "^":
                    self.win.add(Win(loc))
Exemplo n.º 30
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 = (190, 25, 125)
        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取就近10的整数倍, 并以 , 格式化数字
        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.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.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):
        """在屏幕上显示飞船和得分"""
        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_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)
Exemplo n.º 31
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 = (255, 255, 255)
        self.font = pygame.font.SysFont(None, 48)

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

        self.score_rect = self.score_image.get_rect()
        self.high_score_image = self.font.render("HIGH SCORE: ", True,
                                                 self.text_color,
                                                 self.ai_settings.bg_color)
        self.ships = Group()
        self.high_score_rect = self.high_score_image.get_rect()
        self.level_image = self.font.render("LEVEL: ", True, self.text_color,
                                            self.ai_settings.bg_color)
        self.level_rect = self.level_image.get_rect()
        self.score_image = self.font.render("SCORE: ", True, self.text_color,
                                            self.ai_settings.bg_color)

    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: " + 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, stats):
        """Turn the high score into a rendered image."""
        high_score1 = int(round(self.stats.high_score, -1))
        high_score2 = stats.current
        if high_score1 > high_score2:
            high_score = high_score1
        else:
            high_score = high_score2
        high_score_str = "{:,}".format(high_score)
        self.high_score_image = self.font.render(
            "HIGH SCORE: " + 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."""
        self.level_image = self.font.render("LEVEL: " + 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()
        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 + 10)
            ship.rect.y = 10
            self.ships.add(ship)

    def show_score(self):
        """Draw 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)
        # Draw ships.
        self.ships.draw(self.screen)
Exemplo n.º 32
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)

        # 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 = 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 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 high score at top of 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()

    def prep_level(self):
        """Turn level into 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 level below 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.º 33
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.º 34
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.º 35
0
    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()
            enemy_bullets.update()

            # remove bullets outside of the screen
            for i in player_bullets.copy():
                if not i.rect.colliderect(screenRect):
Exemplo n.º 36
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 = (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_ships(self):
        """显示还余下多少艘飞船"""
        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)

    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_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_score(self):
        """将得分转换为一幅渲染的图像。"""
        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)

        # 在屏幕右上角显示得分
        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.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 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 check_high_score(self):
        """检查是否诞生了新的最高分。"""
        if self.stats.score > self.stats.high_score:
            self.stats.high_score = self.stats.score
            self.prep_high_score()
Exemplo n.º 37
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 image."""
        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_ships()

    def prep_score(self):
        """Turn the score into a renderd image."""
        round_score = round(self.stats.score, -1)
        # https://www.w3schools.com/python/ref_string_format.asp
        score_str = "{:,}".format(round_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 score, 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()

    def write_high_score_to_file(self):
        with open("All_Time_High_Score.txt", 'r') as f:
            high_score_in_file = int(f.read())
        with open("All_Time_High_Score.txt", 'w') as f:
            if self.stats.high_score > high_score_in_file:
                f.write(str(self.stats.score))
            # if not add this else condition, the file will be empty when you directly quit the game without gain a point.
            else:
                f.write(str(high_score_in_file))

    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.º 38
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.º 39
0
    def run_game():
        global ch
        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()

        alienbullets = Group()
        run = 1
        alien = Alien(ai_settings, screen, alienBullet, alienbullets)

        bg_color = (20, 250, 200)
        but = Button(ai_settings, screen, ship, aliens, bullets, alien)
        #bullets.add(but)
        but.rect.x = 0
        but.rect.y = 0

        but2 = Button(ai_settings, screen, ship, aliens, bullets, alien)

        but2.rect.x = 0
        solds = Group()
        but2.rect.y = 200
        but2.image = pygame.image.load('tree.gif')
        it = 0

        while True:

            tre = randint(50, 100)
            if tre == 71:
                alien = Alien(ai_settings, screen, alienbullets, alienBullet)
                aliens.add(alien)
                alien.rect.x = randint(0, ai_settings.screen_width - 30)

            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_s:
                        run = 1
                    if event.key == pygame.K_b:
                        sys.exit()
                    if event.key == pygame.K_RIGHT:

                        ship.movin_right = True

                    if event.key == pygame.K_LEFT:
                        ship.movin_left = True

                    if event.key == pygame.K_t:
                        new_bullet = Bullet(ai_settings, screen, ship, aliens,
                                            bullets, alien)
                        bullets.add(new_bullet)

                if event.type == pygame.MOUSEBUTTONDOWN:
                    x, y = pygame.mouse.get_pos()
                    if but2.rect.collidepoint(x, y):
                        it = 0
                    elif but.rect.collidepoint(x, y):
                        it = 1
                    else:

                        if it == 1:
                            x, y = pygame.mouse.get_pos()
                            bullet = Bullet(ai_settings, screen, ship, aliens,
                                            bullets, alien)
                            solds.add(bullet)
                            bullet.rect.x = x
                            bullet.rect.y = y
                            bullet.image = pygame.image.load('tree.gif')
                            #print(bullet.image)
                        if it == 0:
                            x, y = pygame.mouse.get_pos()
                            bullet = Bullet(ai_settings, screen, ship, aliens,
                                            bullets, alien)
                            bullets.add(bullet)
                            bullet.rect.x = x
                            bullet.rect.y = y
                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
                    if event.key == pygame.K_UP:

                        ship.movin_up = False

                    if event.key == pygame.K_2:
                        ship.image = pygame.image.load(random.choice(images))
                    if event.key == pygame.K_DOWN:
                        ship.movin_down = False
#276
            ship.update()

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

            #print('you lose')
            #break
            ship.blitme()

            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()
                collisions = pygame.sprite.groupcollide(
                    bullets, aliens, True, True)
                first = randint(0, 200)
                second = randint(0, 200)
                three = randint(0, 200)
                ai_settings.bullet_color = (first, second, three)
            bullets.update(bullets, aliens)

            #pygame.display.flip()

            ert = randint(-100, 100)
            if ert == 0:
                for al in solds.sprites():
                    ut = But(ai_settings, screen, al, aliens, bullets, alien)
                    bullets.add(ut)

#           print(len(alienbullets)
            if pygame.sprite.spritecollideany(ship, aliens):
                print('you lose')
                break

            ship.blitme()
            aliens.draw(screen)
            bullets.draw(screen)
            solds.draw(screen)
            but2.draw_bullet()
            but.draw_bullet()
            alienbullets.update(bullets, aliens)
            pygame.display.flip()
Exemplo n.º 40
0
class FallCubic():
    """所有方块组的类"""
    def __init__(self, screen, game_settings):
        """创建方块组"""
        self.game_settings = game_settings
        # 获取屏幕
        self.screen = screen
        # 创建编组
        self.cubics = Group()

    def add_cubics(self):
        """为空组随机加入处于任意方位的方块形状"""
        # 随机选择一种形状并创建方块组实例
        self.randnum_shape = randint(1, 7)
        chosen_shape = self.game_settings.cubic_shape[self.randnum_shape]
        shape_image_path = chosen_shape[0]
        self.dir_dict = chosen_shape[1]

        # 随机选择一种方向并创建为一组
        randnum_dir = randint(1, 4)
        self.recent_dir_num = randnum_dir
        chosen_dir = self.dir_dict[randnum_dir]
        self.recent_chosen_dir_dict = chosen_dir
        for key, value in chosen_dir.items():
            new_cubic = MetaCubic(shape_image_path)
            # 把方块的初始位置放到预设位置,高度要加上预设的起始投放高度
            new_cubic.rect.x = value[0]
            new_cubic.rect.y = value[1] + self.game_settings.cubic_start_height
            new_cubic.position_flag = key
            # 加入组
            self.cubics.add(new_cubic)

    def drawme(self):
        """绘制方块编组"""
        for cubic in self.cubics.sprites():
            self.screen.blit(cubic.image, cubic.rect)

    def rotate(self, temp_cubics, dead_cubics):
        """顺时针旋转方块编组"""
        # 设置转出屏幕后的回移次数
        move_back_right_times = 0
        move_back_left_times = 0
        move_back_up_times = 0
        # 获取下一个方向的位置字典
        next_dir_num = self.recent_dir_num + 1
        if next_dir_num > 4:
            next_dir_num -= 4
        next_dir_dict = self.dir_dict[next_dir_num]
        # 清空temp_cubics
        temp_cubics.empty()
        # 遍历方块位置名,修改所有元方块位置
        for position_flag in next_dir_dict.keys():
            # 计算位置变动值
            x_diff = next_dir_dict[position_flag][
                0] - self.recent_chosen_dir_dict[position_flag][0]
            y_diff = next_dir_dict[position_flag][
                1] - self.recent_chosen_dir_dict[position_flag][1]
            # 遍历临时方块组,找到对应的元方块修改其位置
            for cubic in self.cubics.sprites():
                if cubic.position_flag == position_flag:
                    # 把fall_cubics复制到temp_cubics
                    new_cubic = MetaCubic('images/cubic_lblue.bmp')
                    new_cubic.rect.x = cubic.rect.x + x_diff
                    new_cubic.rect.y = cubic.rect.y + y_diff
                    new_cubic.position_flag = cubic.position_flag
                    temp_cubics.add(new_cubic)
                    break

            for cubic in temp_cubics.sprites():
                # 计算越界的长度
                if cubic.rect.x >= self.game_settings.screen_width:
                    if (int((cubic.rect.x + self.game_settings.metacubic_width - self.game_settings.screen_width) \
                                    / self.game_settings.metacubic_width) > move_back_left_times):
                        move_back_left_times = int((cubic.rect.x + self.game_settings.metacubic_width \
                                                    - self.game_settings.screen_width) \
                                                   / self.game_settings.metacubic_width)

                elif cubic.rect.x < 0:
                    if (int((0 - cubic.rect.x) /
                            self.game_settings.metacubic_width) >
                            move_back_right_times):
                        move_back_right_times = int(
                            (0 - cubic.rect.x) /
                            self.game_settings.metacubic_width)

                if cubic.rect.y >= self.game_settings.screen_height:
                    if (int((cubic.rect.y + self.game_settings.metacubic_width - self.game_settings.screen_height) \
                                    / self.game_settings.metacubic_width) > move_back_up_times):
                        move_back_up_times = int((cubic.rect.y + self.game_settings.metacubic_width \
                                                  - self.game_settings.screen_height) \
                                                 / self.game_settings.metacubic_width)

        # 判断是否需要旋转的标志位
        rotate = True
        # 出界判断是否需要旋转
        # 下方出界则不允许旋转
        if move_back_up_times > 0:
            rotate = False
        # 出界超过一个单位长度则不允许旋转
        if move_back_left_times > 1 or move_back_right_times > 1:
            rotate = False
        # 只有前面已经允许旋转时,尝试回移
        if rotate:
            if move_back_right_times == 1:
                temp_cubics.update(self.game_settings, pygame.K_RIGHT)
            elif move_back_left_times == 1:
                temp_cubics.update(self.game_settings, pygame.K_LEFT)
                # 再检测碰撞
                collisions = pygame.sprite.groupcollide(
                    temp_cubics, dead_cubics.cubics, False, False)
                # 有碰撞则不做任何事情返回
                if collisions:
                    temp_cubics.empty()
                    return
        else:
            temp_cubics.empty()
            return

        # 旋转及回移后的temp_cubics与dead_cubics做碰撞判断
        # 记录碰撞后记元方块的不重复的x,y值
        x_values = []
        y_values = []
        # 记录为了解决碰撞需要做的横竖移动的方向
        x_move = 0
        y_move = 0
        collisions = pygame.sprite.groupcollide(temp_cubics,
                                                dead_cubics.cubics, False,
                                                False)
        if collisions:
            # 搜集碰撞的元方块的x,y值
            for cubic in collisions:
                if cubic.rect.x not in x_values:
                    x_values.append(cubic.rect.x)
                if cubic.rect.y not in y_values:
                    y_values.append(cubic.rect.y)
            # 如果是竖棍,则超过一个块碰撞就不允许旋转
            if self.randnum_shape == 4:
                if len(x_values) > 1 or len(y_values) > 1:
                    rotate = False
                else:
                    # 只有一个块碰撞则确定回移方向,向下碰撞则不旋转
                    for cubic in temp_cubics.sprites():
                        if x_values[0] > cubic.rect.x:
                            x_move = -1
                            break
                        elif x_values[0] < cubic.rect.x:
                            x_move = 1
                            break
                        elif y_values[0] > cubic.rect.y:
                            rotate = False
                            break
                        elif y_values[0] < cubic.rect.y:
                            y_move = 1
                            break
            else:
                # 其他形状则判断是哪个方向的多块碰撞还是单块碰撞,再作处理
                if len(x_values) > len(y_values):
                    # y方向碰撞,确定回移方向,向下碰撞则不旋转
                    for cubic in temp_cubics.sprites():
                        if y_values[0] > cubic.rect.y:
                            rotate = False
                            break
                        elif y_values[0] < cubic.rect.y:
                            y_move = 1
                            break
                elif len(x_values) < len(y_values):
                    # x方向碰撞,确定回移方向
                    for cubic in temp_cubics.sprites():
                        if x_values[0] > cubic.rect.x:
                            x_move = -1
                            break
                        elif x_values[0] < cubic.rect.x:
                            x_move = 1
                            break
                elif len(x_values) == len(y_values):
                    # 单块碰撞,同时确定两种回移方向
                    for cubic in temp_cubics.sprites():
                        if x_values[0] > cubic.rect.x:
                            x_move = -1
                            break
                        elif x_values[0] < cubic.rect.x:
                            x_move = 1
                            break
                    for cubic in temp_cubics.sprites():
                        if y_values[0] > cubic.rect.y:
                            rotate = False
                            break
                        elif y_values[0] < cubic.rect.y:
                            y_move = 1
                            break

            # 只有前面已经允许旋转时,尝试回移
            if not rotate:
                # 不允许则退出
                temp_cubics.empty()
                return
            else:
                # 优先移动x方向
                if x_move != 0:
                    if x_move == 1:
                        temp_cubics.update(self.game_settings, pygame.K_RIGHT)
                    elif x_move == -1:
                        temp_cubics.update(self.game_settings, pygame.K_LEFT)
                    # 再检测碰撞
                    collisions = pygame.sprite.groupcollide(
                        temp_cubics, dead_cubics.cubics, False, False)
                    if collisions:
                        # 有碰撞还要检测是否属于单方块碰撞,是的话先移回x,再y向移动,否则退出
                        if y_move == 0:
                            temp_cubics.empty()
                            return
                        elif y_move == 1:
                            # 先恢复
                            if x_move == 1:
                                temp_cubics.update(self.game_settings,
                                                   pygame.K_LEFT)
                            elif x_move == -1:
                                temp_cubics.update(self.game_settings,
                                                   pygame.K_RIGHT)
                            temp_cubics.update(self.game_settings, 'down')
                            # 再检测碰撞
                            collisions = pygame.sprite.groupcollide(
                                temp_cubics, dead_cubics.cubics, False, False)
                            if collisions:
                                temp_cubics.empty()
                                return
                # 移动y方向
                if y_move == 1:
                    temp_cubics.update(self.game_settings, 'down')
                    # 再检测碰撞
                    collisions = pygame.sprite.groupcollide(
                        temp_cubics, dead_cubics.cubics, False, False)
                    if collisions:
                        temp_cubics.empty()
                        return

        # 所有移动都没碰撞则把temp_cubics的方块转移到fall_cubics,temp_cubics清空后自然返回
        for cubic_t in temp_cubics.sprites():
            for cubic_f in self.cubics.sprites():
                if cubic_t.position_flag == cubic_f.position_flag:
                    # 把fall_cubics复制到temp_cubics
                    cubic_f.rect.x = cubic_t.rect.x
                    cubic_f.rect.y = cubic_t.rect.y
                    break
        temp_cubics.empty()
        # 记录最近一次的方向值和方向字典
        self.recent_dir_num = next_dir_num
        self.recent_chosen_dir_dict = next_dir_dict
Exemplo n.º 41
0
class ScoreBoard():
    """A class to report scoring information"""
    def __init__(self, setting_obj, screen, stat_obj):
        """Initialize scorekeeping attribute"""
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.setting_obj = setting_obj
        self.stats = stat_obj

        # font setting for storing information
        self.text_color = (100,100,100)
        self.font = pygame.font.SysFont(None, 60)

        # prepare the initial score image
        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_rockets()

    def prep_score(self):
        """Turn the score into the render image"""
        score_str = str(self.stats.score)
        self.score_image = self.font.render("Score- "+score_str, True, self.text_color, self.setting_obj.trans)

        # 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):
        """Turns the high score into a render image"""
        high_score_str = str(self.stats.high_score)
        self.high_score_image = self.font.render("High Score- "+high_score_str, True, self.text_color, self.setting_obj.trans)

        # display the gigh score at middle top 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("Lvl- "+str(self.stats.level), True, self.text_color, self.setting_obj.trans)

        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_rockets(self):
        """Show how many rockets are left."""
        self.rockets = Group()
        for rocket_number in range(self.stats.rockets_left):
            rocket = Rocket(self.setting_obj, self.screen)
            rocket.rect.x = 10 + rocket_number * rocket.rect.width
            rocket.rect.y = 10
            self.rockets.add(rocket)

    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)
        # draw rockets
        self.rockets.draw(self.screen)
Exemplo n.º 42
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 = 5

    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 = 5

    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.score_image.get_rect()
        self.level_rect.right = self.screen_rect.right
        self.level_rect.top = self.score_rect.bottom

    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.º 43
0
class Scoreboard():
    """ A class to store and show scoring info. """
    def __init__(self, infrompy_settings, screen, stats):
        """ Initialize score attributes. """
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.infrompy_settings = infrompy_settings
        self.stats = stats

        # font settings for score.
        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.infrompy_settings.bg_color)

        # Display the score in 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 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)

        # Draw ships
        self.ships.draw(self.screen)

    def prep_high_score(self):
        """ Turn the highscore 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.infrompy_settings.bg_color)

        # center the highscore 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 level into a rendered image. """
        self.level_image = self.font.render(str(self.stats.level), True,
                                            self.text_color,
                                            self.infrompy_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 lives we have left. """
        self.ships = Group()
        for ship_number in range(self.stats.ships_left):
            ship = Ship(self.infrompy_settings, self.screen)
            ship.rect.x = 10 + ship_number * ship.rect.width
            ship.rect.y = 10
            self.ships.add(ship)
Exemplo n.º 44
0
class Scoreboard:
    """ A class to report scoring information. """
    def __init__(self, ai_game):
        """ Initialize scorekeeping attributes. """
        self.screen = ai_game.screen
        self.screen_rect = ai_game.screen.get_rect()
        self.settings = ai_game.settings
        self.stats = ai_game.stats
        self.ai_game = ai_game

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

        # 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 = round(self.stats.score, -1)
        score_str = "Score - " + "{:,}".format(rounded_score)
        self.score_image = self.font.render(score_str, True, self.text_color)

        # Display the score at the top 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 = "HiScore - " + "{:,}".format(high_score)
        self.high_score_image = self.font.render(high_score_str, True,
                                                 self.text_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 text into a rendered image. """
        level = self.stats.level
        level_str = "Level - " + str(level)
        self.level_image = self.font.render(level_str, True, self.text_color)

        # Position the level below the score.
        self.level_rect = self.level_image.get_rect()
        self.level_rect.x = self.score_rect.x
        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)

    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.save_high_score()
            self.prep_high_score()

    def show_score(self):
        """ Draw score, 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 save_high_score(self):
        try:
            # Write the file to disk
            high_score_file = open("high_score.dat", "w")
            high_score_file.write(str(self.stats.high_score))
            high_score_file.close()
        except IOError:
            # Hmm, can't write it.
            pass
Exemplo n.º 45
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.º 46
0
class Scoreboard():
    """Klasa przeznaczona do przedstawiania informacji o punktacji"""
    def __init__(self, ai_settings, screen, stats):
        """inicalizacja atrybutow dotyczacych punktacji"""
        self.screen = screen
        self.screen_rect = self.screen.get_rect()
        self.ai_settings = ai_settings
        self.stats = stats

        #ustawienia czcionki
        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None, 48)
        #przygotowanie poczatkowych obrazow z punktacja i aktualny poziom
        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_ships()

    def prep_level(self):
        """konwersja numeru poziomu na wygenerowany obraz"""
        self.level_image = self.font.render(str(self.stats.level), True,
                                            self.text_color,
                                            self.ai_settings.bg_color)
        #wyswietlanie poziomu pod aktualnym wynikiem
        self.level_rect = self.level_image.get_rect()
        self.level_rect.right = self.screen_rect.right - 20
        self.level_rect.top = self.score_rect.bottom + 10

    def prep_ships(self):
        """Wyświetla liczbę statków jakie zostały graczowi"""
        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 prep_score(self):
        """przeksztalcenie punktacji na wygenerowany obraz"""
        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)
        #wyswietlanie puntkacji w prawym gornym rogu ekranu
        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):
        """konwersja najlepszego wyniku w grze na wygenerowany obraz"""
        rounded_high_score = int(round(self.stats.high_score, -1))
        high_score_str = "{:,}".format(rounded_high_score)
        self.high_score_image = self.font.render(high_score_str, True,
                                                 self.text_color,
                                                 self.ai_settings.bg_color)
        #wyswietlanie puntkacji w prawym gornym rogu ekranu
        self.high_score_rect = self.high_score_image.get_rect()
        self.high_score_rect.center = self.screen_rect.center
        self.high_score_rect.top = 20

    def show_score(self):
        """wyświetlenie punktacji, poziomu na ekranie"""
        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)
        #wyświetlanie statków
        self.ships.draw(self.screen)
Exemplo n.º 47
0
class Fleet:
    """A class to manage all alien and ufo sprites."""
    def __init__(self, ai_settings, screen, sprite_sheet, sounds):
        """Initialize the fleet."""
        self.ai_settings = ai_settings
        self.screen = screen
        self.sprite_sheet = sprite_sheet
        self.sounds = sounds
        self.aliens = Group()
        self.ufos = Group()
        self.alien_bullet_time = 0
        self.spawn_ufo = 0

    def create_fleet(self):
        """Create a full fleet of aliens."""
        row = 4
        self.aliens.empty()
        # Create the fleet of aliens.
        for row_number in range(self.ai_settings.number_rows):
            for alien_number in range(self.ai_settings.number_aliens_x):
                self.create_alien(alien_number, row_number, row)
            row -= 1

    def create_alien(self, alien_number, row_number, row):
        """Create an alien and place it in the row."""
        alien = Alien(ai_settings=self.ai_settings,
                      screen=self.screen,
                      sprite_sheet=self.sprite_sheet,
                      row=row)
        # alien_width = alien.rect.width
        alien_width = 50
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = 100 + alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def check_aliens_bottom(self):
        """Check if any aliens have reached the bottom of the screen."""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                return True

    def check_fleet_edges(self):
        """Respond appropriately if any aliens have reached an edge."""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self.change_fleet_direction()
                break

    def change_fleet_direction(self):
        """Drop the entire fleet and change the fleet's direction."""
        for alien in self.aliens.sprites():
            alien.rect.y += self.ai_settings.fleet_drop_speed
        self.ai_settings.fleet_direction *= -1

    def update_aliens(self, ship, display, bullets):
        """Check if the fleet is at an edge, and then update the positions of all aliens in the fleet."""
        self.check_fleet_edges()
        if display.animate_aliens == self.ai_settings.animate_aliens:
            for alien in self.aliens:
                alien.switch_image()
            display.animate_aliens = 0
        display.animate_aliens += 1
        self.aliens.update()

        # Look for alien-ship collisions.
        if pygame.sprite.spritecollideany(ship, self.aliens):
            ship.ship_hit(bullets=bullets, fleet=self, display=display)

        # Shoot bullets from aliens
        if self.alien_bullet_time >= random.randint(500, 1000):
            alien_list = self.aliens.sprites()
            alien_firing = len(alien_list) - 11
            if alien_firing < 0:
                alien_firing = 0
            if len(alien_list) > 0:
                bullets.alien_shoot(alien_list[random.randint(
                    alien_firing,
                    len(alien_list) - 1)])
            self.alien_bullet_time = 0
        self.alien_bullet_time += 1
        # Look for aliens hitting the bottom of the screen.
        if self.check_aliens_bottom():
            ship.ship_hit(bullets=bullets, fleet=self, display=display)

    def create_ufos(self):
        """Create ufos at a random interval."""
        if len(self.ufos) < 1:
            self.sounds.ufo_sound.play(-1)
            ufo = Ufo(ai_settings=self.ai_settings,
                      screen=self.screen,
                      sprite_sheet=self.sprite_sheet)
            ufo.rect.x = 50
            ufo.rect.y = 60
            self.ufos.add(ufo)

    def update_ufos(self):
        """Check if ufo is at the edge, de-spawn ufo if it is."""
        self.check_ufo_edges()
        self.ufos.update()

    def check_ufo_edges(self):
        """Check if ufo reached the edge of the screen."""
        for ufo in self.ufos.sprites():
            if ufo.check_edges():
                self.sounds.ufo_sound.stop()
                self.spawn_ufo = 0
Exemplo n.º 48
0
def run_game():
    pygame.init()

    screen_size = (600, 385)
    screen = pygame.display.set_mode(screen_size)
    mario_main_menu_pic_load = pygame.image.load(
        './mario_pics/super_mario_logo.png')
    mario_main_menu_pic = pygame.transform.scale(mario_main_menu_pic_load,
                                                 [500, 200])
    main_menu_x = 50
    main_menu_y = 50
    mario = Mario(screen)
    background = Background(screen, './mario_pics/full_background_no_sky.png',
                            mario, 0)
    main_menu_background = Background(
        screen, './mario_pics/full_background_no_sky.png', mario, 300)
    question_blocks = Group()
    reg_blocks = Group()
    physics = Physics()
    # first_goomba = Goomba(screen)
    enemies = Group()
    dead_enemies = Group()
    stars = Group()
    game_on = True
    tick = 0
    power_timer = 0
    background_color = (93, 148, 251)
    main_menu_font = pygame.font.Font('./mario_pics/8_bit_pusab.ttf', 10)
    star_game_text = main_menu_font.render('Press SPACE to Start.', False,
                                           (0, 0, 0))
    start_text_x = 200
    start_text_y = 250
    game_over_font = pygame.font.Font('./mario_pics/8_bit_pusab.ttf', 25)
    main_menu = True
    start_game = False

    for i in background.block_locations:
        question_blocks.add(QuestionBlock(screen, mario.speed, i))

    # for i in background.reg_block_locations:
    # 	reg_blocks.add(RegBlock(screen, mario.speed, i))
    # for block in question_blocks:
    # 	stars.add(Star(screen, block.x))
    r = randint(150, 255)
    g = randint(150, 255)
    b = randint(150, 255)
    #//////////////////////////////
    #////////MUSICnSOUNDS/////////
    #////////////////////////////
    theme_song_load = pygame.mixer.music.load('./sounds/mario_theme.wav')
    theme_song = pygame.mixer.music.play(-1)
    # star_power_song_load = pygame.mixer.music.load('./sounds/mario_dubstep.wav')
    star_power_song = pygame.mixer.Sound('./sounds/mario_dubstep.wav')
    star_power_song.set_volume(.2)
    power_up_sound = pygame.mixer.Sound('./sounds/smb_powerup.wav')
    death_sound = pygame.mixer.Sound('./sounds/smb_mariodie.wav')

    while game_on:

        # print main_menu
        if main_menu:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    if event.key == 32:
                        start_game = True
            if start_game:
                if main_menu_background.y > 0:
                    main_menu_background.y -= 1
                    main_menu_y -= 1
                    start_text_y -= 1
                elif main_menu_background.y == 0:
                    main_menu = False

            screen.fill(background_color)
            screen.blit(mario_main_menu_pic, (main_menu_x, main_menu_y))
            screen.blit(star_game_text, [start_text_x, start_text_y])
            main_menu_background.draw_background(mario)
            # pygame.display.flip()

        # print tick
        elif not main_menu:
            for i in background.goomba_spawn_points:
                if background.x == i:
                    enemies.add(Goomba(screen))
                if background.x < i:
                    background.goomba_spawn_points.remove(i)
            check_events(background, mario, screen)
            screen.fill(background_color)
            background.draw_background(mario)
            for star in stars:
                star.draw_me(background, physics, question_blocks, mario)
            for block in question_blocks:
                block.draw_block(background)
            for blokc in reg_blocks:
                block.draw_block(background)
            for block in question_blocks:
                if block.x <= mario.x + 27 and block.x >= mario.x:
                    if mario.hit_block and block.power_up_remaining > 0:
                        stars.add(Star(screen, block.x))
                        mario.hit_block = False
                        block.power_up_remaining -= 1
                    elif block.power_up_remaining <= 0:
                        mario.hit_block = False
            mario.draw_mario(physics, background, question_blocks, stars)
            # question_block.draw_block(background)
            # print enemies
            # print question_block.y
            for enemy in enemies:
                enemy.draw_goomba(mario, physics, background)
                mario.check_mario_is_alive(background, enemy, death_sound)
            for enemy in dead_enemies:
                enemy.dead = True
                enemy.draw_goomba(mario, physics, background)
            if mario.star_power:
                theme_song = pygame.mixer.music.pause()
                star_power_song.play()
                power_timer += 1
                mario.max_jump_height = 100
                if power_timer == 10:
                    mario.scale += 15
                    background.floor -= 14
                elif power_timer == 20:
                    mario.scale += 15
                    background.floor -= 14
                elif power_timer == 30:
                    mario.scale += 15
                    background.floor -= 14
                # star_power_song = pygame.mixer.music.play(-1)
                background_color = (r, g, b)
                if tick % 5 == 0:
                    r += 10
                    g += 15
                    b += 16
                if r > 230:
                    r -= 150
                if g > 230:
                    g -= 150
                if b > 230:
                    b -= 150
                for enemy in enemies:
                    distance_from_enemy = fabs(mario.x -
                                               enemy.x) + fabs(mario.y -
                                                               enemy.y)
                    if distance_from_enemy < 100:
                        enemy.dead == True
                        dead_enemies.add(enemy)
                        # screen.blit(goomba_smush_load, [200, 150])
                        enemies.remove(enemy)
                # for enemy in dead_enemies:
                # 	screen.blit(goomba_smush_load, [enemy.x,enemy.y])
                if power_timer > 600:
                    mario.star_power = False
                    power_timer = 0
                    background.floor = 290
                    mario.max_jump_height = 163
                    background_color = (93, 148, 251)
                    star_power_song.stop()
                    theme_song = pygame.mixer.music.unpause()
            if mario.alive == False:
                game_over_text = game_over_font.render("GAME OVER!", False,
                                                       (0, 0, 0))
                screen.blit(game_over_text, [150, 150])
                theme_song = pygame.mixer.music.stop()
            # print background.x
            # first_goomba.draw_goomba(mario)
        pygame.display.flip()
Exemplo n.º 49
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.º 50
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()
    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_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:
                #     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
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_x, mouse_y = pygame.mouse.get_pos()
                new_bullet = Bullet(ai_settings, screen, ship, mouse_x,
                                    mouse_y)
                bullets.add(new_bullet)
        ship.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()
            first = randint(0, 200)
            second = randint(0, 200)
            three = randint(0, 200)
            ai_settings.bullet_color = (first, second, three)

            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()
        aliens.draw(screen)
        alien.blitme()
        chek_fleet_edges(ai_settings, aliens)
        aliens.update()
        if pygame.sprite.spritecollideany(ship, aliens):
            print('you lose')
            break
        pygame.display.flip()
Exemplo n.º 51
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)
class Scoreboard:
    def __init__(self, ai_game):
        #initialize scorekeeping attribute
        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 info
        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None, 32)

        #prepate the initial scrore image
        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_ships()

    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)

    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):
        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 prep_level(self):
        #turn 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 the score
        self.level_rect = self.level_image.get_rect()
        self.level_rect.right = self.screen_rect.right - 20
        self.level_rect.top = self.score_rect.bottom + 10

    def show_score(self):
        #draw 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)

    def check_high_score(self):
        #check to see if there is a new high scrore
        if self.stats.score > self.stats.high_score:
            self.stats.high_score = self.stats.score
            self.prep_high_score()
Exemplo n.º 53
0
class Scoreboard():
    """ A class to report scoring info"""

    def __init__(self, ai_settings, screen, stats):
        """init the scorekeeping"""
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.ai_settings = ai_settings
        self.stats = stats

        # Font setting for the scoreboard
        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None, 48)

        # Prep the different score images
        self.prep_high_score()
        self.prep_score()
        self.prep_ships()
        self.prep_level()
        self.prep_ships()

    def prep_level(self):
        """Turn the level into rendered image"""
        self.level_image = self.font.render(str(self.stats.level), True, self.text_color, self.ai_settings.bg_color)
        # Place the level just 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 prep_score(self):
        """ Turn the score into a rendered image"""
        round_score = int(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)

        # Display the score at the top 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 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 on top left
        self.ships.draw(self.screen)

    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)

        # Place the high score on top
        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
Exemplo n.º 54
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 = (20, 20, 20)
        self.font = pygame.font.SysFont(None, 48)

        self.prep_score()
        self.prep_level()
        self.prep_ships()
        self.prep_high_score()

    def prep_score(self):
        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.bgcolor)

        self.score_rect = self.score_image.get_rect()
        self.score_rect.right = self.screen_rect.right - 20
        self.score_rect.top = 20

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

        self.level_image_rect = self.level_image.get_rect()
        self.level_image_rect.right = self.screen_rect.right
        self.level_image_rect.top = self.score_rect.bottom + 10

    def prep_ships(self):
        self.ships = Group()
        for ship_number in range(self.stats.ships_left):
            ship = Ships(self.ai_game)
            ship.rect.x = 10 + ship_number * ship.rect.width
            ship.rect.y = 10
            self.ships.add(ship)

    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.settings.bgcolor)

        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 check_high_score(self):
        if self.stats.score > self.stats.high_score:
            self.stats.high_score = self.stats.score
            self.prep_high_score()

    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_image_rect)
        self.ships.draw(self.screen)
Exemplo n.º 55
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.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.º 56
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.º 57
0
class Scoreboard():

    def __init__(self, game_settings, screen, stats):
        """"Initialize scorekeeping attributes"""
        self.game_settings = game_settings
        self.screen = screen
        self.stats = stats

        self.screen_rect = screen.get_rect()

        # 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()

        # Prepare the highest score image
        self.prep_high_score()

        # Prepare the level
        self.prep_level()

        # Prepare ship (lives) left
        self.prep_ships()


    def prep_score(self):
        """"Turn the scores 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.game_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 highest scores into a rendered image"""
        rounded_high_score = int(round(self.stats.high_score, -1))
        high_score_str = "{:,}".format(rounded_high_score)
        self.high_score_image = self.font.render(high_score_str, True,
                                self.text_color, self.game_settings.bg_color)

        # Display the high score at the top middle of the screen
        self.high_score_rect = self.high_score_image.get_rect()
        self.high_score_rect.right = self.screen_rect.centerx
        self.high_score_rect.top = 20


    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.game_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):
        """Show how many ships are left"""
        self.ships = Group()
        for ship_number in range(self.stats.ship_left):
            ship = Ship(self.screen, self.game_settings)
            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"""
        self.screen.blit(self.score_image, self.score_rect)


    def show_high_score(self):
        """Draw the highest score to the screen"""
        self.screen.blit(self.high_score_image, self.high_score_rect)


    def show_level(self):
        """Draw the highest score to the screen"""
        self.screen.blit(self.level_image, self.level_rect)


    def show_ships(self):
        """"Draw the ships left (lives) to the screen"""
        self.ships.draw(self.screen)
Exemplo n.º 58
0
class Scoreboard:
    """A class to report scoring information."""

    def __init__(self, ss):
        """Initialize scorekeeping attributes."""

        self.ai_game = ss
        self.screen = ss.screen
        self.screen_rect = self.screen.get_rect()
        self.settings = ss.settings
        self.stats = ss.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("High score picked up")

    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):
            sb_ship = ScoreboardShip(self.ai_game)
            sb_ship.rect.x = 10 + ship_number * sb_ship.rect.width
            sb_ship.rect.y = 10
            self.ships.add(sb_ship)
Exemplo n.º 59
0
        if shownoise and not present:
            continue
        
        sprite = Sprite()
        sprite.image = Surface((4,4), flags=SRCALPHA)
        if present:
            sprite.exists = True
            male = sex(x/8,y/8)
            draw.circle(sprite.image, (196,196,255) if male else (255,196,196),
                            (2,2), 2, 1 if shownoise else 0)
        else:
            sprite.exists = False
        if not shownoise:
            draw.circle(sprite.image, (128,128,128), (2,2), 2, 1)
        sprite.rect = sprite.image.get_rect().move(x, y)
        sprites.add(sprite)

limit = Clock()

done = False

def family(generation, index):
    fam = 0
    infam = False
    for i in range(0, index):
        if personat(generation, i):
            if not infam:
                infam = True
        else:
            if infam:
                infam = False
Exemplo n.º 60
0
class Scoreboard():
    """Uma classe para mostrar informações sobre pontuação."""
    def __init__(self, ai_settings, screen, stats):
        """Inicializa os atributos da pontuação."""
        self.screen = screen
        self.screen_rect = screen.get_rect()
        self.ai_settings = ai_settings
        self.stats = stats

        # Configurações de fonte para as informações de pontuação
        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None, 48)

        # Prepara a imagem da pontuação inicial
        self.prep_score()
        self.prep_high_score()
        self.prep_level()
        self.prep_ships()

    def prep_score(self):
        """Transforma a pontuação em uma imagem renderizada."""
        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.ai_settings.bg_color)

        # Exibe a pontuação na parte superior direita da tela
        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):
        """Desenha a pontuação na tela."""
        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)
        # Desenha as espaçonaves
        self.ships.draw(self.screen)

    def prep_high_score(self):
        """Transforma a pontuação máxima em uma imagem renderizada."""
        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)

        # Centraliza a pontuação máxima na parte superior da tela
        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):
        """Transforma o nível em uma imagem renderizada."""
        self.level_image = self.font.render(str(self.stats.level), True,
                                            self.text_color,
                                            self.ai_settings.bg_color)

        # Posiciona o nível abaixo da pontuação
        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):
        """Mostra quantas espaçonaves restam."""
        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 update_high_score(self):
        # Atualiza e grava a pontuação máxima
        with open('high_score.json', 'w') as f_obj:
            json.dump(self.stats.high_score, f_obj)