diff --git a/atores.py b/atores.py index cfc2ef5ea..ed786c310 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,21 @@ 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): + outro_ator.status = self.status = DESTRUIDO class Obstaculo(Ator): - pass + _caracter_ativo = 'O' class Porco(Ator): - pass + _caracter_ativo = '@' + _caracter_destruido = '+' class DuploLancamentoExcecao(Exception): @@ -87,13 +92,14 @@ def __init__(self, x=0, y=0): self._tempo_de_lancamento = None self._angulo_de_lancamento = None # radianos + def foi_lancado(self): """ Método que retorna verdaeira se o pássaro já foi lançado e falso caso contrário :return: booleano """ - return True + return not self._tempo_de_lancamento is None def colidir_com_chao(self): """ @@ -101,7 +107,8 @@ def colidir_com_chao(self): o status dos Passaro deve ser alterado para destruido, bem como o seu caracter """ - pass + if self.y <=0: + self.status = DESTRUIDO def calcular_posicao(self, tempo): """ @@ -117,7 +124,13 @@ def calcular_posicao(self, tempo): :param tempo: tempo de jogo a ser calculada a posição :return: posição x, y """ - return 1, 1 + # Fórmula Y=Y0+v*sen(teta)delta_t-(G*delta_t^2)/2. + # Fórmula X=X0+v*cos(teta)*delta_t. + if self._esta_voando(): + delta_t = tempo - self._tempo_de_lancamento + self._cacular_posicao_vertial(delta_t) + self._cacular_posicao_horizontal(delta_t) + return super().calcular_posicao(tempo) def lancar(self, angulo, tempo_de_lancamento): @@ -129,12 +142,36 @@ def lancar(self, angulo, tempo_de_lancamento): :param tempo_de_lancamento: :return: """ - pass + self._angulo_de_lancamento = math.radians(angulo) + self._tempo_de_lancamento = tempo_de_lancamento + self.foi_lancado() + + def _cacular_posicao_vertial(self, delta_t): + # Fórmula Y=Y0+v*sen(teta)delta_t-(G*delta_t^2)/2. + y_atual = self._y_inicial + angulo_radiano = self._angulo_de_lancamento + y_atual += self.velocidade_escalar * delta_t * math.sin(angulo_radiano) + y_atual -= (GRAVIDADE * (delta_t ** 2)) / 2 + self.y = y_atual + + def _cacular_posicao_horizontal(self, delta_t): + # Fórmula X=X0+v*cos(teta)*delta_t + x_atual = self._x_inicial + angulo_radiano = self._angulo_de_lancamento + x_atual += self.velocidade_escalar * delta_t * math.cos(angulo_radiano) + self.x = x_atual + + def _esta_voando(self): + return self.foi_lancado() and self.status==ATIVO 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..85c9b4a11 100644 --- a/fase.py +++ b/fase.py @@ -2,7 +2,6 @@ from itertools import chain from atores import ATIVO - VITORIA = 'VITORIA' DERROTA = 'DERROTA' EM_ANDAMENTO = 'EM_ANDAMENTO' @@ -36,14 +35,13 @@ def __init__(self, intervalo_de_colisao=1): self._porcos = [] self._obstaculos = [] - def adicionar_obstaculo(self, *obstaculos): """ Adiciona obstáculos em uma fase :param obstaculos: """ - pass + self._obstaculos.extend(obstaculos) def adicionar_porco(self, *porcos): """ @@ -51,7 +49,7 @@ def adicionar_porco(self, *porcos): :param porcos: """ - pass + self._porcos.extend(porcos) def adicionar_passaro(self, *passaros): """ @@ -59,7 +57,7 @@ def adicionar_passaro(self, *passaros): :param passaros: """ - pass + self._passaros.extend(passaros) def status(self): """ @@ -73,7 +71,13 @@ 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 +90,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,10 +104,26 @@ def calcular_pontos(self, tempo): :param tempo: tempo para o qual devem ser calculados os pontos :return: objeto do tipo Ponto """ - pontos=[self._transformar_em_ponto(a) for a in self._passaros+self._obstaculos+self._porcos] + for passaro in self._passaros: + passaro.calcular_posicao(tempo) + for alvo in self._porcos + self._obstaculos: + 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 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..8d2b0dcfb --- /dev/null +++ b/oo/pessoa.py @@ -0,0 +1,36 @@ +class Pessoa: + olhos = 2 + def __init__(self, *filhos, nome=None, idade=10): + self.nome = nome + self.idade = idade + self.filhos = list(filhos) + def cumprimentar(self): + return f"olá {self.nome} id({id(self)})" + @staticmethod + def metodo_estatico(): + return 42 + @classmethod + def nome_e_atributo_de_clsse(cls): + return f"{cls} olhos {cls.olhos}" + + + +if __name__ == "__main__": + joao = Pessoa(nome='João') + pedro = Pessoa(joao,nome='Pedro') + print(Pessoa.cumprimentar(pedro)) + print(id(joao)) + for filho in pedro.filhos: + print(filho.nome) + joao.sobrenome = "Silva" + del pedro.filhos + joao.olhos = 1 + Pessoa.olhos = 3 + print(joao.__dict__) + print(pedro.__dict__) + print(Pessoa.olhos) + print(joao.olhos) + print(pedro.olhos) + print(id(Pessoa.olhos),id(joao.olhos),id(pedro.olhos)) + print(Pessoa.metodo_estatico(),joao.metodo_estatico()) + print(Pessoa.nome_e_atributo_de_clsse(),joao.nome_e_atributo_de_clsse()) \ No newline at end of file diff --git a/testes/integracao.py b/testes/teste_integracao.py similarity index 100% rename from testes/integracao.py rename to testes/teste_integracao.py 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..e97811356 100644 --- a/testes/atores_testes.py +++ b/testes/testes_atores.py @@ -61,6 +61,7 @@ def teste_colisao_entre_atores_ativos(self): self.assert_colisao_atores_ativos(Ator(2, 2), Ator(1, 1)) self.assert_colisao_atores_ativos(Ator(2, 2), Ator(1, 2)) self.assert_colisao_atores_ativos(Ator(2, 2), Ator(1, 3)) + # self.assert_colisao_atores_ativos(Ator(2, 2), Ator(4, 4)) def teste_colisao_entre_atores_ativos_com_intervalo(self): # Com intervalo 2, diferente do padrão 1, essa colisão deveria acontecer diff --git a/testes/fase_testes.py b/testes/testes_fase.py similarity index 99% rename from testes/fase_testes.py rename to testes/testes_fase.py index 8158a43f5..d4c0ba216 100644 --- a/testes/fase_testes.py +++ b/testes/testes_fase.py @@ -180,10 +180,10 @@ def teste_lancar_passaro_sem_erro_quando_nao_existe_passaro(self): self.assertTrue(passaros[1].foi_lancado()) def teste_intervalo_de_colisao_padrão(self): - ''' + """ Método que testa se o intervalo de colisão da Fase é repassado aos atores. Padrão de intervalo é 1 - ''' + """ fase = Fase() passaro = PassaroFake(1, 1) fase.adicionar_passaro(passaro)