class EscudoTestCase(unittest.TestCase): """ ========================================================================== Casos de prueba detectados ========================================================================== Escenario: un escudo es atacable Dado que existe un escudo Cuando un escudo recibe ataque Entonces no hay error -------------------------------------------------------------------------- Escenario: un escudo tiene una resistencia predeterminada de 5 Dado que existe un escudo Cuando se crea un escudo Entonces el escudo tiene una resistencia de 5 -------------------------------------------------------------------------- Escenario: un escudo tiene una resistencia de 4 si es atacado solo una vez Dado que existe un escudo Cuando el escudo recibe un ataque Entonces el escudo pasa a tener una resistencia de 4 -------------------------------------------------------------------------- Escenario: un escudo se queda sin resistencia al recibir 5 ataques Dado que existe un escudo Cuando el escudo recibe 5 ataques Entonces el escudo pasa a tener una resistencia de 0 -------------------------------------------------------------------------- Escenario: un escudo sin resistencia no puede recibir ataques Dado que existe un escudo Cuando el escudo ya recibió 5 ataques Y se intenta un sexto ataque Entonces se recibe un ValueError con el mensaje '¡El objetivo ya no puede recibir ataques!' """ def setUp(self): self.escudo = Escudo() def test_escudo_es_atacable(self): self.escudo.recibir_ataque() def test_escudo_inicia_con_resistencia_5(self): self.assertEqual(5, 5)
class Fauno(Atacable, Atacante): def __init__(self, resistencia=100): self._resistencia = resistencia self.__escudo = Escudo() self.__arma = Arma() def atacar(self, objetivo): self.__arma.atacar(objetivo) def recibir_ataque(self, potencia): self._validar_resistencia() try: self.__escudo.recibir_ataque() except ValueError: if self._resistencia - potencia > 0: self._resistencia -= potencia else: self._resistencia = 0
def setUp(self): self.arma = Arma() self.escudo = Escudo() self.fauno = Fauno()
def __init__(self, resistencia=100): self._resistencia = resistencia self.__escudo = Escudo() self.__arma = Arma()
def setUp(self): self.escudo = Escudo()
class EscudoTestCase(unittest.TestCase): """ ========================================================================== Casos de prueba detectados ========================================================================== Escenario: un escudo es atacable Dado que existe un escudo Cuando un escudo recibe ataque Entonces no hay error -------------------------------------------------------------------------- Escenario: un escudo tiene una resistencia predeterminada de 5 Dado que existe un escudo Cuando se crea un escudo Entonces el escudo tiene una resistencia de 5 -------------------------------------------------------------------------- Escenario: un escudo tiene una resistencia de 4 si es atacado solo una vez Dado que existe un escudo Cuando el escudo recibe un ataque Entonces el escudo pasa a tener una resistencia de 4 -------------------------------------------------------------------------- Escenario: un escudo se queda sin resistencia al recibir 5 ataques Dado que existe un escudo Cuando el escudo recibe 5 ataques Entonces el escudo pasa a tener una resistencia de 0 -------------------------------------------------------------------------- Escenario: un escudo sin resistencia no puede recibir ataques Dado que existe un escudo Cuando el escudo ya recibió 5 ataques Y se intenta un sexto ataque Entonces se recibe un ValueError con el mensaje '¡El objetivo ya no puede recibir ataques!' """ def setUp(self): self.escudo = Escudo() def test_escudo_es_atacable(self): self.escudo.recibir_ataque() def test_escudo_inicia_con_resistencia_5(self): self.assertEqual(5, self.escudo.resistencia) def test_escudo_tiene_resistencia_4_al_recibir_ataque(self): self.escudo.recibir_ataque() self.assertEqual(4, self.escudo.resistencia) def test_escudo_tiene_0_al_recibir_5_ataques(self): for _ in range(5): self.escudo.recibir_ataque() self.assertEqual(0, self.escudo.resistencia) def test_escudo_en_0_arroja_value_error_al_recibir_ataque(self): for _ in range(5): self.escudo.recibir_ataque() with self.assertRaises(ValueError) as contexto: self.escudo.recibir_ataque() self.assertEqual("¡El objetivo ya no puede recibir ataques!", str(contexto.exception))
def main(self, volume): run = True FPS = 60 nivel = 1 vidas = 5 clock = pygame.time.Clock() parado = True # Pontuação para o próximo nível pontuacao_limite = 800 #variáveis pro inimigo inimigos = [] onda_de_inimigos = 0 velocidade_inimigo = 2 #variáveis pro meteoro meteoros = [] velocidade_meteoro = 1 #variáveis pro boost boosts = [] onda_de_boost = 1 velocidade_boost = 3 #vidas vidas_a_captar = [] onda_de_vida = 1 velocidade_vida = 5 #escudo escudos = [] velocidade_escudo = 3 onda_de_escudos = 1 ativar_escudo = False TIMERESCUDO = pygame.USEREVENT pygame.time.set_timer(TIMERESCUDO, 0) # Saude height_barra = 10 saude = 100 # Lasers resfriamento_laser = 0 tempo_resfriamento = 20 velocidade_laser = 7 lasers_inimigos = [] lasers_jogador = [] # Jogador movimento_jogador = 8 jogador = Jogador(int(largura / 2 - WH_JOGADOR / 2), int(altura - 125), altura, largura, JOGADOR, JOGADOR_PARADO, ESCUDO_NO_JOGADOR, ESCUDO_NO_JOGADOR2, LASER_JOGADOR, saude) fim_de_jogo = False contador_fim_de_jogo = 0 # Definindo volume for som in lista_sons: som.set_volume(volume) def desenhar_janela(pos_y): WIN.blit(PLANO_DE_FUNDO, (0, pos_y)) WIN.blit(PLANO_DE_FUNDO, (0, pos_y - altura + 1)) WIN.blit(PORTA, (574, 543)) # mostrando textos na tela label_vidas = fonte.render(f"Vidas: {vidas}", True, preto) # 1 - suavização de serrilhado label_nivel = fonte.render(f"Nivel: {nivel}", True, preto) label_pontuacao = fonte.render(f"{jogador.pontuacao}", True, preto) WIN.blit(label_vidas, (10, 10)) WIN.blit(label_nivel, (largura - label_nivel.get_width() - 10, 10)) WIN.blit(label_pontuacao, (10, 595)) for inimigo in inimigos: inimigo.desenhar(WIN) for meteoro in meteoros: meteoro.desenhar(WIN) for laser_inimigo in lasers_inimigos: laser_inimigo.desenhar(WIN) for laser_jogador in lasers_jogador: laser_jogador.desenhar(WIN) for boost in boosts: boost.desenhar(WIN) for escudo in escudos: escudo.desenhar(WIN) for vida in vidas_a_captar: vida.desenhar(WIN) if ativar_escudo: jogador.desenhar_escudo(WIN) jogador.desenhar(WIN, height_barra, parado) if fim_de_jogo: pygame.mixer.music.stop() WIN.blit(EXPLOSAO, (jogador.x - 50, jogador.y-20)) fim_de_jogo_label = fonte_fim_de_jogo.render("Aguarde", True, preto) WIN.blit(fim_de_jogo_label, (largura / 2 - fim_de_jogo_label.get_width() / 2, altura / 2 - fim_de_jogo_label.get_height() / 2)) pygame.display.update() # sempre que for desenhar, devemos atualizar a tela colocando a "nova imagem" por cima das outras que estavam desenhadas pos_y = 0 #posicao inicial da tela de fundo while run: clock.tick(FPS) desenhar_janela(pos_y) pos_y += velocidade_inimigo/2 #tela de fundo se move sempre a metade da velocidade do inimigo if pos_y >= altura: pos_y = 0 #reseta posicao da tela de fundo if jogador.saude <= 0: if vidas >= 1: jogador.saude = saude vidas -= 1 if vidas <= 0: fim_de_jogo = True contador_fim_de_jogo += 1 # A pontuacao é retornada quando o jogador perde if fim_de_jogo: velocidade_inimigo = 0 if contador_fim_de_jogo == FPS/60: MORTE.play() elif contador_fim_de_jogo > FPS * 3: MUSICA_FIM.play() return True, jogador.pontuacao else: continue # Subida de nivel, Velocidade do Inimigo, do Laser e do Meteoro if jogador.pontuacao >= pontuacao_limite: if nivel < 3: if nivel == 1: velocidade_meteoro += 1 pontuacao_limite = 1800 if nivel == 2: pontuacao_limite = 3000 velocidade_inimigo += 0.5 velocidade_laser += 0.5 elif nivel == 3: pontuacao_limite = 4000 velocidade_inimigo += 0.5 velocidade_laser += 0.5 velocidade_meteoro += 1 elif nivel == 4: pontuacao_limite = 5000 velocidade_inimigo += 0.5 velocidade_laser += 0.5 elif nivel > 4: pontuacao_limite += pontuacao_limite * 0.3 velocidade_inimigo += 1 velocidade_laser += 1 velocidade_meteoro += 1 nivel += 1 #print("vel inimigo:", velocidade_inimigo) # lógica do inimigo if len(inimigos) == 0: onda_de_inimigos += 3 for i in range(onda_de_inimigos): inimigo = Inimigo(random.randrange(50, largura - 128), random.randrange(-8000 * (nivel / 5), -128), str(random.randrange(1, 4)), altura, largura, saude) # ver depois sobre o -1500 inimigos.append(inimigo) for inimigo in inimigos[:]: inimigo.movimentar(velocidade_inimigo, inimigos) if random.randrange(0, 4 * FPS) == 1: lasers_inimigos.append(Atirar.atirar(inimigo, altura, largura)) if inimigo.colisao(jogador, inimigos): COLIDIU.play() if not ativar_escudo: jogador.dano(15) # lógica de criação, remoção e movimento dos meteoros if len(meteoros) == 0: meteoro = Meteoro(-110, random.randrange(0, 400), altura, largura, METEORO) meteoros.append(meteoro) if nivel > 1: meteoro2 = Meteoro(-510, random.randrange(-300, 250), altura, largura, METEORO) meteoros.append(meteoro2) if nivel > 2: meteoro3 = Meteoro(-910, random.randrange(-600, -50), altura, largura, METEORO) meteoros.append(meteoro3) if nivel > 3: meteoro4 = Meteoro(-1310, random.randrange(-1100, -400), altura, largura, METEORO) meteoros.append(meteoro4) if nivel > 4: meteoro6 = Meteoro(-1710, random.randrange(-1150, -550), altura, largura, METEORO) meteoros.append(meteoro6) if nivel > 5: meteoro5 = Meteoro(-1110, random.randrange(-700, -150), altura, largura, METEORO) meteoros.append(meteoro5) if nivel > 6: meteoro7 = Meteoro(-710, random.randrange(-600, 0), altura, largura, METEORO) meteoros.append(meteoro7) for meteoro in meteoros[:]: meteoro.movimentar(velocidade_meteoro, meteoros) if meteoro.colisao(jogador, meteoros): COLIDIU.play() if not ativar_escudo: jogador.dano(15) #logica boost if len(boosts) == 0: if random.randrange(0, 5000) == 9: onda_de_boost += 1 for i in range(onda_de_boost): if random.randrange(0, 5000) == 9: boost = Boost(-110, random.randrange(0, 400), altura, largura, BOOST) boosts.append(boost) for boost in boosts[:]: boost.movimentar(velocidade_boost, boosts) if boost.colisao(jogador, boosts): jogador.inc_pontuacao(1000) #lógica do escudo if len(escudos) == 0: onda_de_escudos += 1 for i in range(onda_de_escudos): if random.randrange(0, 5000) == 9: escudo = Escudo(random.randrange(50, largura - 128), random.randrange(-8000 * (nivel / 5), -128), altura, largura, ESCUDO) # ver depois sobre o -1500 escudos.append(escudo) for escudo in escudos[:]: escudo.movimentar(velocidade_escudo, escudos) if escudo.colisao(jogador, escudos): pygame.time.set_timer(TIMERESCUDO, 4000) ativar_escudo = True #lógica da vida if len(vidas_a_captar) == 0: onda_de_vida += 1 for _ in range(onda_de_vida): if random.randrange(0, 5000) == 9: vida = Vida(random.randrange(50, largura - 128), random.randrange(-8000 * (nivel / 5), -128), altura, largura, VIDA) # ver depois sobre o -1500 vidas_a_captar.append(vida) for vida in vidas_a_captar[:]: vida.movimentar(velocidade_vida, vidas_a_captar) if vida.colisao(jogador, vidas_a_captar): if jogador.saude + 10 <= 90: jogador.saude += 10 elif jogador.saude + 10 > 90 and jogador.saude + 10 < 100: jogador.saude = 100 # EVENTOS # vai passar por todos os eventos que ocorreram, 60 vezes por segundo for event in pygame.event.get(): if event.type == pygame.QUIT: # se clicar no botão de fechar, o while se encerra, ou seja, o jogo fecha quit() if event.type == pygame.MOUSEBUTTONDOWN: if not resfriamento_laser: lasers_jogador.append(Atirar.atirar(jogador, altura, largura)) resfriamento_laser = 1 if event.type == tempo: jogador.inc_pontuacao(10) if event.type == TIMERESCUDO: pygame.time.set_timer(TIMERESCUDO, 0) ativar_escudo = False mouse = pygame.mouse.get_pos() click = pygame.mouse.get_pressed() if 632 > mouse[0] > 593 and 629 > mouse[1] > 569: if click[0] == 1: return True, jogador.pontuacao teclas = pygame.key.get_pressed() # retorna um dicioonário de todas as teclas e diz se estão pressionadas ou não # movimentos do jogador de acordo com a tecla pressionada parado = True if pygame.KEYDOWN: if teclas[pygame.K_a] and jogador.x - movimento_jogador > 0: # esquerda parado =jogador.movimentar(-movimento_jogador, 0) if teclas[pygame.K_d] and jogador.x + movimento_jogador + jogador.get_width() < largura: # direita parado =jogador.movimentar(movimento_jogador, 0) if teclas[pygame.K_w] and jogador.y - movimento_jogador > 0: # cima parado =jogador.movimentar(0, -movimento_jogador) if teclas[ pygame.K_s] and jogador.y + movimento_jogador + jogador.get_height() + 2 * height_barra < altura: # baixo parado = jogador.movimentar(0, movimento_jogador) for laser_inimigo in lasers_inimigos: laser_inimigo.movimentar(velocidade_laser, lasers_inimigos) if laser_inimigo.colisao(jogador, lasers_inimigos): # Definir o som de quando o jogador tomar um dano de laser if not ativar_escudo: jogador.dano(15) # Resfriamento Laser if resfriamento_laser >= tempo_resfriamento: resfriamento_laser = 0 elif resfriamento_laser > 0: resfriamento_laser += 1 for laser_jogador in lasers_jogador: laser_jogador.movimentar(-velocidade_laser, lasers_jogador) for inimigo in inimigos: if laser_jogador.colisao(inimigo, lasers_jogador): EXPLODIU.play() jogador.inc_pontuacao(100) try: inimigos.remove(inimigo) except ValueError: print("ValueError") pass for meteoro in meteoros: laser_jogador.colisao(meteoro, lasers_jogador)