diff --git a/atores.py b/atores.py index cfc2ef5ea..eaa4253e6 100644 --- a/atores.py +++ b/atores.py @@ -38,7 +38,7 @@ def calcular_posicao(self, tempo): :param tempo: o tempo do jogo :return: posição x, y do ator """ - return 1, 1 + return self.x, self.y def colidir(self, outro_ator, intervalo=1): """ @@ -52,16 +52,20 @@ def colidir(self, outro_ator, intervalo=1): :param intervalo: Intervalo a ser considerado :return: """ - pass - + if self.status==ATIVO and outro_ator.status==ATIVO: + delta_x = abs(self.x - outro_ator.x) + delta_y = abs(self.y - outro_ator.y) + if delta_x<=intervalo and delta_y<=intervalo: + self.status=outro_ator.status=DESTRUIDO class Obstaculo(Ator): - pass + _caracter_ativo = 'O' class Porco(Ator): - pass + _caracter_ativo = "@" + _caracter_destruido = '+' class DuploLancamentoExcecao(Exception): @@ -93,7 +97,7 @@ def foi_lancado(self): :return: booleano """ - return True + return not self._tempo_de_lancamento is None def colidir_com_chao(self): """ @@ -117,8 +121,10 @@ def calcular_posicao(self, tempo): :param tempo: tempo de jogo a ser calculada a posição :return: posição x, y """ - return 1, 1 - + if self.foi_lancado(): + delta_t = tempo - self._tempo_de_lancamento + self._calcular_posicao_vertical(delta_t) + return super().calcular_posicao(tempo) def lancar(self, angulo, tempo_de_lancamento): """ @@ -129,12 +135,23 @@ def lancar(self, angulo, tempo_de_lancamento): :param tempo_de_lancamento: :return: """ - pass + self._angulo_de_lancamento = angulo + self._tempo_de_lancamento = tempo_de_lancamento + def _calcular_posicao_vertical(self, delta_t): + y_atual = self._y_inicial + angulo_radianos=math.radians(self._angulo_de_lancamento) + y_atual += self.velocidade_escalar * delta_t * math.sin(angulo_radianos) + y_atual -= (GRAVIDADE * (delta_t**2))/2 + self.y = y_atual class PassaroAmarelo(Passaro): - pass + _caracter_ativo = 'A' + _caracter_destruido = 'a' + velocidade_escalar = 30 class PassaroVermelho(Passaro): - pass \ No newline at end of file + _caracter_ativo = 'V' + _caracter_destruido = 'v' + velocidade_escalar = 20 \ No newline at end of file diff --git a/fase.py b/fase.py index 3385175c6..ebbb32b54 100644 --- a/fase.py +++ b/fase.py @@ -43,7 +43,7 @@ def adicionar_obstaculo(self, *obstaculos): :param obstaculos: """ - pass + self._obstaculos.extend(obstaculos) def adicionar_porco(self, *porcos): """ @@ -51,7 +51,7 @@ def adicionar_porco(self, *porcos): :param porcos: """ - pass + self._porcos.extend(porcos) def adicionar_passaro(self, *passaros): """ @@ -59,8 +59,9 @@ def adicionar_passaro(self, *passaros): :param passaros: """ - pass + self._passaros.extend(passaros) + @property def status(self): """ Método que indica com mensagem o status do jogo @@ -73,7 +74,12 @@ def status(self): :return: """ - return EM_ANDAMENTO + if not self._possui_porco_ativo(): + return VITORIA + elif self._possui_passaro_ativo(): + return EM_ANDAMENTO + else: + return DERROTA def lancar(self, angulo, tempo): """ @@ -86,8 +92,10 @@ def lancar(self, angulo, tempo): :param angulo: ângulo de lançamento :param tempo: Tempo de lançamento """ - pass - + for passaro in self._passaros: + if not passaro.foi_lancado(): + passaro.lancar(angulo, tempo) + break def calcular_pontos(self, tempo): """ @@ -98,6 +106,11 @@ def calcular_pontos(self, tempo): :param tempo: tempo para o qual devem ser calculados os pontos :return: objeto do tipo Ponto """ + for passaro in self._passaros: + passaro.calcular_posicao(tempo) + for alvo in self._obstaculos + self._porcos: + passaro.colidir(alvo, self.intervalo_de_colisao) + passaro.colidir_com_chao() pontos=[self._transformar_em_ponto(a) for a in self._passaros+self._obstaculos+self._porcos] return pontos @@ -105,3 +118,16 @@ def calcular_pontos(self, tempo): def _transformar_em_ponto(self, ator): return Ponto(ator.x, ator.y, ator.caracter()) + def _possui_porco_ativo(self): + for porco in self._porcos: + if porco.status==ATIVO: + return True + return False + + def _possui_passaro_ativo(self): + for passaro in self._passaros: + if passaro.status==ATIVO: + return True + return False + + diff --git a/oo/__init__.py b/oo/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/oo/pessoa.py b/oo/pessoa.py new file mode 100644 index 000000000..686f13e8c --- /dev/null +++ b/oo/pessoa.py @@ -0,0 +1,64 @@ +class Pessoa(): + olhos=2 + + def __init__(self, *filhos, nome = None, idade=51): + self.idade = idade + self.nome = nome + self.filhos = list(filhos) + + def cumprimentar(self): + return f' Olá, id={id(self)}' + + @staticmethod + def metodo_estatico(): + return 7*6 + + @classmethod + def nome_e_atributos_de_classe(cls): + return f'{cls}-olhos{cls.olhos}' + return f'Meu nome é {self.nome}' + + +class Homem(Pessoa): + pass + +class Mutante(Pessoa): + olhos=3 + +class Mulher(Pessoa): + pass + +if __name__ == '__main__': + ronaldo = Mutante(nome='ronaldo') + yaya = Mulher(nome='yaya') + ronaldo = Mutante(yaya, nome='ronaldo') + print(Pessoa.cumprimentar(ronaldo)) + print(id(ronaldo)) + print(ronaldo.cumprimentar()) + print(ronaldo.nome) + print(ronaldo.idade) + for filho in ronaldo.filhos: + print(filho.nome) + ronaldo.sobrenome = 'vieira' + del ronaldo.filhos + ronaldo.olhos = 1 + del ronaldo.olhos + print(ronaldo.__dict__) + print(yaya.__dict__) + print(Pessoa.olhos) + print(ronaldo.olhos) + print(yaya.olhos) + print(id(Pessoa.olhos), id(ronaldo.olhos), id(yaya.olhos)) + print(Pessoa.metodo_estatico(),'e', ronaldo.metodo_estatico()) + print(Pessoa.nome_e_atributos_de_classe(), 'e', ronaldo.nome_e_atributos_de_classe()) + pessoa=Pessoa('Anônimo') + print(isinstance(pessoa, Pessoa)) + print(isinstance(pessoa, Homem)) + print(isinstance(ronaldo, Pessoa)) + print(isinstance(ronaldo, Homem)) + print(yaya.olhos) + print('Digite uma palavra e pressione enter') + input('-->') + print(ronaldo.olhos) + print(yaya.cumprimentar()) + print(ronaldo.cumprimentar()) \ No newline at end of file diff --git a/placa_grafica.py b/placa_grafica.py index 77ae67aef..1cd05cbd5 100644 --- a/placa_grafica.py +++ b/placa_grafica.py @@ -84,7 +84,7 @@ def animar(fase, passo=0.1, delta_t=0.1): velocidade_replay = 1 _animar(delta_t, fase, passo / velocidade_replay, tempo, 'Replay %s vezes mais rápido!' % velocidade_replay) apagar_tela() - print(fase.status(tempo_final)) + print(fase.status) print(FIM) diff --git a/placa_grafica_tkinter.py b/placa_grafica_tkinter.py index 318542e65..6b6a94a5f 100644 --- a/placa_grafica_tkinter.py +++ b/placa_grafica_tkinter.py @@ -59,10 +59,10 @@ def _animar(): if tempo <= 0: tempo = 0 delta_t /= -multiplicador_rebobinar - if fase.status() != EM_ANDAMENTO: + if fase.status != EM_ANDAMENTO: camada_de_atores.create_image(162, 55, image=PYTHONBIRDS_LOGO, anchor=NW) camada_de_atores.create_image(54, 540, image=MENU, anchor=NW) - if fase.status() == VITORIA: + if fase.status == VITORIA: img = VOCE_GANHOU else: img = VOCE_PERDEU diff --git a/testes/integracao.py b/testes/integracao.py index 11f2f0178..b834d465a 100644 --- a/testes/integracao.py +++ b/testes/integracao.py @@ -28,22 +28,22 @@ def teste_acabou_com_porcos_e_passaros(self): fase.adicionar_porco(*porcos) fase.adicionar_passaro(*passaros) - self.assertEqual(EM_ANDAMENTO, fase.status()) + self.assertEqual(EM_ANDAMENTO, fase.status) # colidindo cada passaro com um porco no tempo 3 for passaro, porco in zip(passaros, porcos): passaro.colidir(porco, 3) - self.assertEqual(VITORIA, fase.status()) + self.assertEqual(VITORIA, fase.status) fase.adicionar_obstaculo(Obstaculo()) - self.assertEqual(VITORIA, fase.status(), 'Obstáculo não interfere no fim do jogo') + self.assertEqual(VITORIA, fase.status, 'Obstáculo não interfere no fim do jogo') fase.adicionar_porco(Porco()) - self.assertEqual(DERROTA, fase.status(), 'Com Porco ativo e sem pássaro para lançar, o jogo deveria acabar') + self.assertEqual(DERROTA, fase.status, 'Com Porco ativo e sem pássaro para lançar, o jogo deveria acabar') fase.adicionar_passaro(PassaroAmarelo()) - self.assertEqual(EM_ANDAMENTO, fase.status(), + self.assertEqual(EM_ANDAMENTO, fase.status, 'Com Porco ativo e com pássaro para lançar, o jogo não deveria acabar') def teste_status(self): @@ -52,29 +52,29 @@ def teste_status(self): passaros = [PassaroAmarelo(1, 1) for i in range(2)] fase.adicionar_porco(*porcos) fase.adicionar_passaro(*passaros) - self.assertEqual(EM_ANDAMENTO, fase.status()) + self.assertEqual(EM_ANDAMENTO, fase.status) for passaro, porco in zip(passaros, porcos): passaro.colidir(porco, 3) - self.assertEqual(VITORIA, fase.status(), + self.assertEqual(VITORIA, fase.status, 'Sem porcos ativos o jogo deveria terminar com vitória') fase.adicionar_obstaculo(Obstaculo()) - self.assertEqual(VITORIA, fase.status(), + self.assertEqual(VITORIA, fase.status, 'Obstáculo não interfere para definir vitória') porco = Porco() fase.adicionar_porco(porco) - self.assertEqual(DERROTA, fase.status(), + self.assertEqual(DERROTA, fase.status, 'Com Porco ativo e sem pássaro para lançar, o jogo deveria acabar em derrota') fase.adicionar_passaro(PassaroAmarelo()) - self.assertEqual(EM_ANDAMENTO, fase.status(), + self.assertEqual(EM_ANDAMENTO, fase.status, 'Com Porco ativo e com pássaro para lançar, o jogo não deveria acabar') porco.colidir(porco, 3) - self.assertEqual(VITORIA, fase.status(), + self.assertEqual(VITORIA, fase.status, 'Sem porco ativo, o jogo deveria acabar com vitória') def teste_lancar_passaro_sem_erro_quando_nao_existe_passaro(self): @@ -166,7 +166,7 @@ def teste_calcular_pontos(self): self.assertSetEqual(expected, set(fase_exemplo.calcular_pontos(8.5))) - self.assertEqual(VITORIA, fase_exemplo.status()) + self.assertEqual(VITORIA, fase_exemplo.status) def criar_fase_exemplo(multiplicador=1): diff --git a/testes/atores_testes.py b/testes/testes_atores.py similarity index 99% rename from testes/atores_testes.py rename to testes/testes_atores.py index f4254f29e..96a4646d0 100644 --- a/testes/atores_testes.py +++ b/testes/testes_atores.py @@ -189,7 +189,6 @@ def assert_passaro_posicao(self, x_esperado, y_esperado, status_esperado, passar self.assertEqual(y_esperado, round(y_calculado), 'valor real de y = %s' % y_calculado) self.assertEqual(status_esperado, passaro.status, '(x = %s, y = %s)' % (x_calculado, y_calculado)) - class PassaroVermelhoTests(PassaroBaseTests): """ Classe de teste e Passaro Vermelho @@ -202,7 +201,6 @@ def teste_status(self): passaro_vermelho.colidir(outro_ator_na_mesma_posicao) self.assertEqual('v', passaro_vermelho.caracter()) - def teste_velocidade_escalar(self): self.assertEqual(20, PassaroVermelho.velocidade_escalar) diff --git a/testes/fase_testes.py b/testes/testes_fase.py similarity index 91% rename from testes/fase_testes.py rename to testes/testes_fase.py index 8158a43f5..18a5523d8 100644 --- a/testes/fase_testes.py +++ b/testes/testes_fase.py @@ -102,7 +102,7 @@ def teste_adicionar_passaro(self): def teste_acabou_sem_porcos(self): fase = Fase() - self.assertEqual(VITORIA, fase.status()) + self.assertEqual(VITORIA, fase.status) def teste_acabou_com_porcos_e_passaros(self): fase = Fase() @@ -111,23 +111,23 @@ def teste_acabou_com_porcos_e_passaros(self): fase.adicionar_porco(*porcos) fase.adicionar_passaro(*passaros) - self.assertEqual(EM_ANDAMENTO, fase.status()) + self.assertEqual(EM_ANDAMENTO, fase.status) for ator in porcos + passaros: ator.status = DESTRUIDO - self.assertEqual(VITORIA, fase.status()) + self.assertEqual(VITORIA, fase.status) fase.adicionar_obstaculo(Obstaculo()) - self.assertEqual(VITORIA, fase.status(), + self.assertEqual(VITORIA, fase.status, 'Obstáculo não interfere no fim do jogo') fase.adicionar_porco(PorcoFake()) - self.assertEqual(DERROTA, fase.status(), + self.assertEqual(DERROTA, fase.status, 'Com Porco ativo e sem pássaro para lançar, o jogo ' 'deveria acabar') fase.adicionar_passaro(PassaroFake()) - self.assertEqual(EM_ANDAMENTO, fase.status(), + self.assertEqual(EM_ANDAMENTO, fase.status, 'Com Porco ativo e com pássaro para lançar, o jogo ' 'não deveria acabar') @@ -137,31 +137,31 @@ def teste_status(self): passaros = [PassaroFake(1, 1) for _ in range(2)] fase.adicionar_porco(*porcos) fase.adicionar_passaro(*passaros) - self.assertEqual(EM_ANDAMENTO, fase.status()) + self.assertEqual(EM_ANDAMENTO, fase.status) for ator in porcos + passaros: ator.status = DESTRUIDO - self.assertEqual(VITORIA, fase.status(), + self.assertEqual(VITORIA, fase.status, 'Sem porcos ativos o jogo deveria terminar com ' 'vitória') fase.adicionar_obstaculo(ObstaculoFake()) - self.assertEqual(VITORIA, fase.status(), + self.assertEqual(VITORIA, fase.status, 'Obstáculo não interfere para definir vitória') porco = PorcoFake() fase.adicionar_porco(porco) - self.assertEqual(DERROTA, fase.status(), + self.assertEqual(DERROTA, fase.status, 'Com Porco ativo e sem pássaro para lançar, o jogo ' 'deveria acabar em derrota') fase.adicionar_passaro(PassaroFake()) - self.assertEqual(EM_ANDAMENTO, fase.status(), + self.assertEqual(EM_ANDAMENTO, fase.status, 'Com Porco ativo e com pássaro para lançar, o jogo ' 'não deveria acabar') porco.status = DESTRUIDO - self.assertEqual(VITORIA, fase.status(), + self.assertEqual(VITORIA, fase.status, 'Sem porco ativo, o jogo deveria acabar com vitória') def teste_lancar_passaro_sem_erro_quando_nao_existe_passaro(self):