def create_level(self, level): height = len(level) width = max(len(string) for string in level) self.level_width, self.level_height = width * BLOCK_SIZE, height * BLOCK_SIZE self.root = pygame.Surface((width * BLOCK_SIZE, height * BLOCK_SIZE)) all(width == len(row) for row in level) objects = pygame.sprite.Group() x = y = 0 for row in level: for col in row: if col == '-': objects.add(Ground(x, y)) elif col == '#': objects.add(Stone(x, y)) elif col == 't': objects.add(Trap(x, y)) elif col == 'p': self.player = Player(x, y) elif col == 'e': objects.add(Enemy(x, y)) elif col == 'T': objects.add(Target(x, y)) elif col == 'u': objects.add(Upper(x, y)) x += BLOCK_SIZE y += BLOCK_SIZE x = 0 self.camera = Camera(self.player, (width * BLOCK_SIZE, height * BLOCK_SIZE), self.resolution) return objects
def __init__(self): super().__init__() # Load the screen for the current stage state = Config.state() entities = (Player(Colors.VIR), Enemy(state['color'], state['shoot_delay'])) self.screen_intro = ScreenIntro(entities, state['balls']) if Config.level == 4: self.screen_play = ScreenHardcore(entities, state['balls'], state['max_balls'], state['max_score']) else: self.screen_play = ScreenNormal(entities, state['balls'], state['max_balls'], state['max_score']) # Set the current screen self.current_screen = self.screen_intro # Pause sound self.snd_click = SoundManager.load_sound('snd_click.wav') # Play the background music SoundManager.load_music('bgm_stage1.ogg')
def __init__(self, update=True): super().__init__() # Repeat cutscene if not update: Cutscene.current_cutscene -= 1 ScreenDialog.current_dialog -= 1 SoundManager.load_music('bgm_dialog.ogg') # Change level if Cutscene.current_cutscene in (4, 6, 8, 11, 14, 17): Config.level += 1 # Background state = Config.state() self.background = ScreenBackground( (Player(Colors.VIR), Enemy(state['color'], state['shoot_delay']))) # Transition self.transition = False self.transition_delay = 50 self.snd_transition = SoundManager.load_sound('snd_transition1.wav') # Set the current screen if Cutscene.current_cutscene in (1, 4, 8, 11, 14, 17): self.current_screen = ScreenNarrator() elif Cutscene.current_cutscene in (3, 6, 7, 10, 13, 16, 19): self.current_screen = ScreenDialog() SoundManager.load_music('bgm_dialog.ogg') else: self.current_screen = ScreenDialog()
def spawn_wave(self): for i in range(self.wave_length): x = random.randrange(100, self.window_width - 100) y = random.randrange(-1500, -100) color = random.choice(['red', 'green', 'blue']) enemy = Enemy(x, y, self.enemy_velocity, self.laser_velocity, color) self.enemies.append(enemy)
def __init__(self): self.score = 0 self.graphic = [] self.objects = [] self.shifty = 0 self.player = Player(20, 75, game=self) for i in range(0, 20): for j in range(1, 3): self.objects.append(Enemy(i * 10, j * 10, game=self)) for i in range(0, 40): self.graphic.append([]) for j in range(0, 80): if ((j) % 2 == 0 and i == self.shifty): self.graphic[i].append("A") else: self.graphic[i].append(" ")
def __init__(self, victory=False): super().__init__() # Background state = Config.state() self.background = ScreenBackground( (Player(Colors.VIR), Enemy(state['color'], state['shoot_delay']))) # Screens self.screen_menu = ScreenMenu(self) self.screen_options = ScreenOptions(self) # Set the current screen self.current_screen = self.screen_menu # Play the background music if victory: SoundManager.load_music('bgm_victory.ogg') else: SoundManager.load_music('bgm_menu.ogg')
heart.draw_rect(screen) heart.go() # генерация объектов count += 1 if count % max( 5, 30 - count // 240 ) == 0: # со временем враги будут появляться быстрее, но не быстрее, 5 # генерация врага со случайными характеристиками enemy_type = types[randint(0, 2)] enemy_type[0], enemy_type[1], enemy_type[4], enemy_type[5] = randint(0, WIDTH - 100),\ randint(0, HEIGHT // 2),\ randint(-5, 5),\ randint(0, 5) enemy = Enemy(enemy_type[0], enemy_type[1], enemy_type[2], enemy_type[3], enemy_type[4], enemy_type[5], enemy_type[6], enemy_type[7], enemy_type[8]) # добавление врага в список объектов queue.append(enemy) # обработка коллизии # не важно как, оно работает for enem in queue: # проверка жив ли враг и находится ли он на экране if (not enem.is_alive() or enem.get_x() < -enem.get_size_x() or enem.get_x() > WIDTH or enem.get_y() > HEIGHT or enem.get_y() < -enem.get_size_y()): # удаление из списка если нет queue.remove(enem) # действия врага
current_time = pygame.time.get_ticks() delta_time = current_time - start_time if delta_time >= plane_frequency: if level == 1: type = 1 elif level == 2: type = 2 elif level == 3: type = 3 elif level == 4: type = random.randint(4, 5) elif level == 5: type = random.randint(1, 5) x = random.randint(10, WIDTH - 100) e = Enemy(x, -150, type) enemy_group.add(e) start_time = current_time if plane_destroy_count: if plane_destroy_count % 5 == 0 and level < 5: level += 1 plane_destroy_count = 0 p.fuel -= 0.05 bg.update(1) win.blit(clouds_img, (0, 70)) p.update(moving_left, moving_right, explosion_group) p.draw(win)
rb_crash = False p.rect.y = yoffset + HEIGHT // 2 if not restart_menu and not main_menu: bg.update() draw.top_black_bar() draw.replay_black_bar() draw.border() if counter.count > 0: counter.update() if counter.count == 0: bg.move = True e = Enemy(win) enemy_group = pygame.sprite.Group() enemy_group.add(e) rb = Roadblock(win) roadblock_group = pygame.sprite.Group() roadblock_group.add(rb) coin = Coin(win) coin_group = pygame.sprite.Group() coin_group.add(coin) else: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False
from manager import Manager import time #set up manager mgr = Manager() #set up rooms kitchen = Room("Kitchen", "A dank and dirty room buzzing with flies.") dining_room = Room("Dining Room", "a room for eating") ballroom = Room("Ballroom", "a room for dancing") kitchen.link_room(dining_room, "south") dining_room.link_room(kitchen, "north") dining_room.link_room(ballroom, "west") ballroom.link_room(dining_room, "east") kitchen.set_subroom("Stove", "There is an old saucepan on the hob, it's greasy") mgr.set_current_room(kitchen) #create characters dave = Enemy("Dave", "A smelly zombie") dave.set_conversation("Rahh, I what to eat you!") dave.set_weakness("cheese") potion = Health_potion("potion", kitchen.subrooms.get("Stove"), "description") mgr.mainloop()
async def gameloop(self): if random.randint(0, 4) == 0: self.objects.append(Enemy(30, 20, game=self)) row = 0 toprint = "" for i in range(0, 40): for j in range(0, 80): if ((j) % 2 == 0 and i == self.shifty): self.graphic[i][j] = "A" elif self.graphic[i][j] == "{" or self.graphic[i][j] == "}": self.graphic[i][j] = "o" else: self.graphic[i][j] = "'" #after initialization #for all the self.objects, render their position for idx, obj in enumerate(self.objects): render = obj.render() if (obj.type == "bullet" and type(obj.parent) == Player): for tracy, row in enumerate(render): for tracx, c in enumerate(row): if (self.graphic[(obj.y + tracy) % 40][(obj.x - 1 + tracx) % 80] != "'"): for i in range(0, 2): for j in range(0, 2): self.graphic[(obj.y+i)%40][(obj.x+j)%80] =\ random.choice(['{','}']) if(self.graphic[(obj.y+tracy)%40][(obj.x-1+tracx)%80]=="{" or\ self.graphic[(obj.y+tracy)%40][(obj.x-1+tracx)%80]=="}"): self.objects[idx].state = "destroyed" else: self.graphic[(obj.y - 1 + tracy) % 40][(obj.x - 1 + tracx) % 80] = c elif (obj.type == "enemy"): if random.randint(0, 20) == 0: obj.shoot(direction=1, velocity=2) for tracy, row in enumerate(render): for tracx, c in enumerate(row): if (self.graphic[(obj.y - 1 + tracy) % 40][(obj.x - 3 + tracx) % 80] == "o"): destroyed = obj.damage() if (destroyed): self.score += 100 else: self.graphic[(obj.y - 1 + tracy) % 40][(obj.x - 3 + tracx) % 80] = c else: for tracy, row in enumerate(render): for tracx, c in enumerate(row): if(self.graphic[(obj.y+tracy)%40][(obj.x-1+tracx)%80]=="{" or\ self.graphic[(obj.y+tracy)%40][(obj.x-1+tracx)%80]=="}"): self.objects[idx].state = "destroyed" else: self.graphic[(obj.y - 1 + tracy) % 40][(obj.x - 1 + tracx) % 80] = c if (obj.state == "destroyed"): self.objects.remove(obj) render = self.player.render() for tracy, row in enumerate(render): for tracx, c in enumerate(row): if (self.graphic[(self.player.y - 1 + tracy) % 40][(self.player.x - 2 + tracx) % 80] in ["{", "}", "[", "]"]): self.player.state = "destroyed" else: self.graphic[(self.player.y - 1 + tracy) % 40][(self.player.x - 2 + tracx) % 80] = c toprint += "score: " + str(self.score) toprint += "\n" toprint += "\n" if self.player.state != "destroyed": for y in range(0, 40): toprint += "\n" for x in range(0, 80): toprint += self.graphic[y][x] call(['clear']) print(toprint) print("player:", self.player.x, self.player.y, self.player.state) time.sleep(0.1) else: while (True): for y in range(0, 40): toprint += "\n" for x in range(0, 80): toprint += self.graphic[y][x] call(['clear']) print(toprint) print("player:", self.player.x, self.player.y, self.player.state) print("GAME OVER!!!") time.sleep(0.1)
def game_screen(window, save_data): game_clock = pygame.time.Clock() assets = load_assets() # Carrega todos os assets # Criamos um dicionário com todos os sprite groups sprite_groups = {} # Grupo com todos os sprites sprites = pygame.sprite.Group() sprite_groups['sprites'] = sprites # Grupo com as balas atiradas pelo jogador player_bullets = pygame.sprite.Group() sprite_groups['player_bullets'] = player_bullets # Grupo com todos os inimigos enemies = pygame.sprite.Group() sprite_groups['enemies'] = enemies # Grupo com as nuvens clouds = pygame.sprite.Group() sprite_groups['clouds'] = clouds # Criamos o jogador player = Player(sprite_groups, assets, save_data) sprites.add(player) player_speed = 8 firing = False # Criamos os inimigos e definimos suas variáveis enemy_count = 0 base_timer = 6500 enemy_timer = base_timer last_spawn = pygame.time.get_ticks() for i in range(3): e = Enemy(assets, ENEMY_CONFIG) enemies.add(e) sprites.add(e) enemy_count += 1 # Variáveis do jogo score = 0 # Distância percorrida lscore = 0 # Igual ao score, mas volta a 0 quando ganha uma vida extra coinframe = 0 # Frame de animação do contador de moedas coins = save_data['coins'] heartframe = 0 # Frame de animação do contador de vidas lives = 3 keys_pressed = {} # Quais teclas já foram pressionadas extralifei = 0 difficulty = 6 cloudtimer = 0 # Timer de geração de nuvens cloudtimetocreate = 200 # Prepara a tela window.fill((125, 190, 215)) sprites.draw(window) pygame.display.update() # Inicia a musica pygame.mixer.music.play(loops=-1) pygame.mixer.music.set_volume(0.25) state = 'GAME' Running = True while Running: while state == 'GAME': game_clock.tick(FPS) # Define limite de frames por segundo now = pygame.time.get_ticks() # Ticks percorridos até o loop atual for event in pygame.event.get(): if event.type == pygame.QUIT: # Sai do loop do jogo e retorna para o launcher state = 'QUIT' Running = False if event.type == pygame.KEYDOWN: keys_pressed[ event. key] = True # Adiciona a tecla pressionada ao dicionário if event.key == pygame.K_UP: player.speedy += -player_speed if event.key == pygame.K_DOWN: player.speedy += player_speed if event.key == pygame.K_RIGHT: player.speedx += player_speed if event.key == pygame.K_LEFT: player.speedx += -player_speed if event.key == pygame.K_SPACE: firing = True if event.type == pygame.KEYUP: if event.key in keys_pressed and keys_pressed[event.key]: # Se a tecla existir no dicionário subtraimos a velocidade ganha ao pressionar a tecla # Se a tecla não estiver no dicionário, não modificamos a velocidade para evitar bugs if event.key == pygame.K_UP: player.speedy += player_speed if event.key == pygame.K_RIGHT: player.speedx += -player_speed if event.key == pygame.K_LEFT: player.speedx += player_speed if event.key == pygame.K_DOWN: player.speedy += -player_speed if event.key == pygame.K_SPACE: firing = False if firing == True: player.shoot() # Cria nuvens aleatóriamente cloudtimer += 1 if cloudtimer >= cloudtimetocreate: speed = random.randint(4, 5) centery = random.randint(30, SCR_HEIGHT - 30) new_cloud = Cloud(assets, centery, speed) clouds.add(new_cloud) cloudtimer = 0 cloudtimetocreate = random.randint(50, 300) # Colisao entre tiros e inimigos bullet_hits = pygame.sprite.groupcollide( enemies, player_bullets, False, True, pygame.sprite.collide_mask) for i in bullet_hits: i.destroy() enemy_count -= 1 coins += 1 # Colisao entre Player e inimigos if player.blink == False: player_hits = pygame.sprite.spritecollide( player, enemies, True, pygame.sprite.collide_mask) if len(player_hits) > 0: lives -= 1 # Quando tomar dano, o jogador pisca por alguns segundos player.blink = True player.blink_timer = 0 elif player.blink == True: player.blink_timer += 1 enemy_timer = base_timer - score * difficulty # Reduz o timer dos inimigos com o tempo, com a dificulade controlando a diferença if enemy_timer < 100: # Se o timer ficaria menor que 100 ticks, retorna a 100 para evitar timers negativos enemy_timer = 100 # Cria novos inimigos, desde que não passe do limite if enemy_count <= 40: if (now - last_spawn) > enemy_timer: for i in range(3): # Cria novos inimigos e = Enemy(assets, ENEMY_CONFIG) enemies.add(e) sprites.add(e) enemy_count += 1 last_spawn = now # Update das nuvens, sprites e background clouds.update() sprites.update() window.fill((125, 190, 215)) # Aumenta score e lscore a cada tick score += 0.2 lscore += 0.2 # Display o score score_num = assets[FONT].render(f"{score:.0f}", True, (255, 255, 255)) score_rect = score_num.get_rect() score_rect.topright = (SCR_WIDTH - 20, 40) window.blit(score_num, score_rect) # Animação da moeda coinframe += 1 canimframe = coinframe // 10 ccoin = assets['coin_anim'][canimframe] coin_rect = ccoin.get_rect() coin_rect.topleft = (10, 10) window.blit(assets['coin_anim'][canimframe], (10, 10)) if coinframe >= 58: coinframe = 0 # Display animação e valor das moedas coin_title = assets[FONT].render('X {}'.format(str(coins)), True, (255, 255, 255)) title_rect = coin_title.get_rect() title_rect.topleft = (55, 18) window.blit(coin_title, title_rect) # Vida extra a cada 500 pontos if lscore > 500: lives += 1 lscore = 0 extralifei = 1 # Aviso de vida extra por 2 segundos if extralifei > 0: extralifei += 1 extralife_title = assets['FONT3'].render( 'vida extra!', True, (255, 50, 50)) title_rect = extralife_title.get_rect() title_rect.center = (SCR_WIDTH / 2, 60) window.blit(extralife_title, title_rect) if extralifei > 120: extralifei = 0 # Animação vidas heartframe += 1 hanimframe = heartframe // 10 cheart = assets['heart_anim'][hanimframe] heart_rect = cheart.get_rect() heart_rect.midtop = (180, 18) window.blit(assets['heart_anim'][hanimframe], heart_rect) if heartframe >= 39: heartframe = 0 # Display animação e número de vidas score_title = assets[FONT].render("SCORE", True, (255, 255, 255)) title_rect = score_title.get_rect() title_rect.topright = (SCR_WIDTH - 20, 20) window.blit(score_title, title_rect) text_surface = assets[FONT].render('X {}'.format(lives), True, (255, 255, 255)) text_rect = text_surface.get_rect() text_rect.topleft = (215, 18) window.blit(text_surface, text_rect) # Checa se morreu (acabaram as vidas), encerra o jogo, inicia Loja if lives <= 0: state = "DEAD" # Muito importante redefinir essas variáveis aos valores iniciais # Se não forem reiniciadas, causa diversos bugs keys_pressed = {} firing = False player.speedx = 0 player.speedy = 0 lives = 0 enemy_count = 0 for i in enemies: i.destroy() pygame.mixer.music.fadeout(2900) # Transiciona a música # Cria tela de morte if score > save_data['high_score']: save_data['high_score'] = score text_surface = assets['FONT4'].render('Perdeu', True, (255, 30, 30)) text_rect = text_surface.get_rect() text_rect.center = (SCR_WIDTH / 2, SCR_HEIGHT / 2) window.blit(text_surface, text_rect) pygame.display.update() # Espera 2 segundos, troca de música time.sleep(2) pygame.mixer.music.load(path.join(SND, 'Menumusic.mp3')) pygame.mixer.music.set_volume(0.25) pygame.mixer.music.play(loops=-1) # Desenha nuvens e sprites, atualiza o display clouds.draw(window) sprites.draw(window) pygame.display.update() while state == "DEAD": # Roda a tela de loja/menu game_clock.tick(FPS) # Limite de FPS window.blit(assets['BGLoja'], (0, 0)) # Desenha o background # Animação e número de moedas coinframe += 1 canimframe = coinframe // 10 ccoin = assets['coin_anim'][canimframe] ccoin_rect = ccoin.get_rect() ccoin_rect.midleft = (50, 275) window.blit(assets['coin_anim'][canimframe], ccoin_rect) if coinframe >= 58: coinframe = 0 coin_title = assets['FONT2'].render('X {}'.format(str(coins)), True, (255, 255, 255)) title_rect = coin_title.get_rect() title_rect.midleft = (100, 280) window.blit(coin_title, title_rect) # Display score dessa vida text_surface = assets['FONT2'].render( 'score: {:.0f}'.format(score), True, (255, 255, 255)) text_rect = text_surface.get_rect() text_rect.midleft = (900, 190) window.blit(text_surface, text_rect) # Display highscore text_surface = assets['FONT2'].render( 'high score: {:.0f}'.format(save_data['high_score']), True, (255, 255, 255)) text_rect = text_surface.get_rect() text_rect.midleft = (900, 220) window.blit(text_surface, text_rect) # Escreve "Aperte R para jogar" text_surface = assets['FONT3'].render('Aperte R para jogar', True, (255, 255, 255)) text_rect = text_surface.get_rect() text_rect.bottomright = (SCR_WIDTH - 25, SCR_HEIGHT - 15) window.blit(text_surface, text_rect) # Display upgrade de vidas text_surface = assets['FONT2'].render('1 - VIDA EXTRA [10 moedas]', True, (255, 255, 255)) text_rect = text_surface.get_rect() text_rect.topleft = (60, 340) window.blit(text_surface, text_rect) text_surface = assets[FONT].render( 'adiciona uma vida (vidas: {})'.format(lives + 3), True, (255, 255, 255)) text_rect = text_surface.get_rect() text_rect.topleft = (70, 370) window.blit(text_surface, text_rect) # Display upgrade de dificuldade text_surface = assets['FONT2'].render('2 - FREIO ABS [15 moedas]', True, (255, 255, 255)) text_rect = text_surface.get_rect() text_rect.topleft = (60, 420) window.blit(text_surface, text_rect) text_surface = assets[FONT].render( 'diminui a aceleracao dos inimigos (max quatro compras)', True, (255, 255, 255)) text_rect = text_surface.get_rect() text_rect.topleft = (70, 450) window.blit(text_surface, text_rect) # Display upgrade de tiro text_surface = assets['FONT2'].render( '3 - TREINAMENTO DE UZI [6 moedas]', True, (255, 255, 255)) text_rect = text_surface.get_rect() text_rect.topleft = (60, 500) window.blit(text_surface, text_rect) text_surface = assets[FONT].render( 'levemente diminui o tempo para atirar (max sete compras)', True, (255, 255, 255)) text_rect = text_surface.get_rect() text_rect.topleft = (70, 530) window.blit(text_surface, text_rect) # Update na tela pygame.display.update() # Trata eventos for event in pygame.event.get(): if event.type == pygame.QUIT: state = 'QUIT' Running = False if event.type == pygame.KEYDOWN: # R volta ao jogo if event.key == pygame.K_r: state = "GAME" pygame.mixer.music.load(path.join( SND, 'Gamemusic.mp3')) pygame.mixer.music.set_volume(0.25) pygame.mixer.music.play(loops=-1) keys_pressed = {} player.rect.left = 90 player.rect.centery = SCR_HEIGHT / 2 player.speedx = 0 player.speedy = 0 lives += 3 score = 0 lscore = 0 # Tecla 1 compra upgrade de vidas if event.key == pygame.K_1: if coins >= 10: lives += 1 coins -= 10 # Tecla 2 compra upgrade de dificuldade if event.key == pygame.K_2: if coins >= 15 and save_data['difficulty'] > 2: save_data['difficulty'] -= 1 coins -= 15 # Tecla 3 compra upgrade de tiros if event.key == pygame.K_3: if coins >= 6 and save_data['shoot_speed'] < 7: player.shoot_ticks -= 100 save_data['shoot_speed'] += 1 coins -= 6 save_data[ 'coins'] = coins # Atualiza as moedas totais que o jogador possui return save_data # Retorna os novos valores para o save