From ff6bf60dc5c908ef95d3c812843a7ef50b4d0e8f Mon Sep 17 00:00:00 2001 From: Cleberton Junior Date: Thu, 5 Mar 2020 21:02:53 -0300 Subject: [PATCH 1/5] Classe pessoa --- oo/__init__.py | 0 oo/pessoa.py | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 oo/__init__.py create mode 100644 oo/pessoa.py 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..0089e7e8e --- /dev/null +++ b/oo/pessoa.py @@ -0,0 +1,18 @@ +class Pesssoa(): + def __init__(self, *filhos, nome, idade=24): + self.nome = nome + self.idade = idade + self.filhos = list(filhos) + + def cumprimentar(self): + return f'Olá {id(self)}' + +if __name__ == "__main__": + f = Pesssoa(nome='Lucca') + p = Pesssoa(f, nome='Junior') + print(Pesssoa.cumprimentar(p)) + print(id(p)) + print(p.cumprimentar()) + print(p.nome, p.idade) + for filho in p.filhos: + print(filho.nome) \ No newline at end of file From a74d4af6edc9a466b09e2467af0cc5a1961ae41d Mon Sep 17 00:00:00 2001 From: Cleberton Junior Date: Tue, 10 Mar 2020 22:09:30 -0300 Subject: [PATCH 2/5] Classe Motor, Direcao e Carro completas --- oo/carro.py | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 oo/carro.py diff --git a/oo/carro.py b/oo/carro.py new file mode 100644 index 000000000..aece3945f --- /dev/null +++ b/oo/carro.py @@ -0,0 +1,133 @@ +""" + >>># Testando motor + >>> motor = Motor() + >>> motor.velocidade + 0 + >>> motor.acelerar() + >>> motor.velocidade + 1 + >>> motor.acelerar() + >>> motor.velocidade + 2 + >>> motor.acelerar() + >>> motor.velocidade + 3 + >>> motor.frear() + >>> motor.velocidade + 1 + >>> motor.frear() + >>> motor.velocidade + 0 + >>> # Testando Direcao + >>> direcao = Direcao() + >>> direcao.valor + 'Norte' + >>> direcao.girar_a_direita() + >>> direcao.valor + 'Leste' + >>> direcao.girar_a_direita() + >>> direcao.valor + 'Sul' + >>> direcao.girar_a_direita() + >>> direcao.valor + 'Oeste' + >>> direcao.girar_a_direita() + >>> direcao.valor + 'Norte' + >>> direcao.girar_a_esquerda() + >>> direcao.valor + 'Oeste' + >>> direcao.girar_a_esquerda() + >>> direcao.valor + 'Sul' + >>> direcao.girar_a_esquerda() + >>> direcao.valor + 'Leste' + >>> direcao.girar_a_esquerda() + >>> direcao.valor + 'Norte' + >>> carro = Carro(direcao, motor) + >>> carro.calcular_velocidade() + 0 + >>> carro.acelerar() + >>> carro.calcular_velocidade() + 1 + >>> carro.acelerar() + >>> carro.calcular_velocidade() + 2 + >>> carro.frear() + >>> carro.calcular_velocidade() + 0 + >>> carro.calcular_direcao() + 'Norte' + >>> carro.girar_a_direita() + >>> carro.calcular_direcao() + 'Leste' + >>> carro.girar_a_esquerda() + >>> carro.calcular_direcao() + 'Norte' + >>> carro.girar_a_esquerda() + >>> carro.calcular_direcao() + 'Oeste' +""" + + +class Motor: + + def __init__(self): + self.velocidade = 0 + + def acelerar(self): + self.velocidade += 1 + + def frear(self): + self.velocidade -= 2 + self.velocidade = max(0, self.velocidade) + + +NORTE = 'Norte' +LESTE = 'Leste' +SUL = 'Sul' +OESTE = 'Oeste' + + +class Direcao: + + direita_dict = { + NORTE: LESTE, LESTE: SUL, SUL: OESTE, OESTE: NORTE + } + esquerda_dict = { + NORTE: OESTE, OESTE: SUL, SUL: LESTE, LESTE: NORTE + } + + def __init__(self): + self.valor = NORTE + + def girar_a_direita(self): + self.valor = self.direita_dict[self.valor] + + def girar_a_esquerda(self): + self.valor = self.esqueda_dict[self.valor] + +class Carro: + def __init__(self, direcao, motor): + self.motor = motor + self.direcao = direcao + + def calcular_velocidade(self): + return self.motor.velocidade + + def acelerar(self): + self.motor.acelerar() + + def frear(self): + self.motor.frear() + + def calcular_direcao(self): + return self.direcao.valor + + def girar_a_direita(self): + self.direcao.girar_a_direita() + + def girar_a_esquerda(self): + self.direcao.girar_a_esquerda() \ No newline at end of file From c3f840cec65e8b0763679b31d0360d9602d89d3d Mon Sep 17 00:00:00 2001 From: Cleberton Junior Date: Wed, 11 Mar 2020 21:20:11 -0300 Subject: [PATCH 3/5] Unittest --- fase.py | 6 +++--- oo/test_carro.py | 13 +++++++++++++ testes/{atores_testes.py => test_atores.py} | 0 testes/{fase_testes.py => test_fase.py} | 0 testes/{integracao.py => test_integracao.py} | 0 ...estes_placa_grafica.py => test_placa_grafica.py} | 0 6 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 oo/test_carro.py rename testes/{atores_testes.py => test_atores.py} (100%) rename testes/{fase_testes.py => test_fase.py} (100%) rename testes/{integracao.py => test_integracao.py} (100%) rename testes/{testes_placa_grafica.py => test_placa_grafica.py} (100%) diff --git a/fase.py b/fase.py index 3385175c6..1c8fd161f 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,7 +59,7 @@ def adicionar_passaro(self, *passaros): :param passaros: """ - pass + self._passaros.extend(passaros) def status(self): """ diff --git a/oo/test_carro.py b/oo/test_carro.py new file mode 100644 index 000000000..622627860 --- /dev/null +++ b/oo/test_carro.py @@ -0,0 +1,13 @@ +from unittest import TestCase + +from pythonbirds.oo.carro import Motor + +class CarroTestCase(TestCase): + def test_velocidade_inicial(self): + motor = Motor() + self.assertEqual(0, motor.velocidade) + + def test_acelerar(self): + motor = Motor() + motor.acelerar() + self.assertEqual(1, motor.velocidade) \ No newline at end of file diff --git a/testes/atores_testes.py b/testes/test_atores.py similarity index 100% rename from testes/atores_testes.py rename to testes/test_atores.py diff --git a/testes/fase_testes.py b/testes/test_fase.py similarity index 100% rename from testes/fase_testes.py rename to testes/test_fase.py diff --git a/testes/integracao.py b/testes/test_integracao.py similarity index 100% rename from testes/integracao.py rename to testes/test_integracao.py diff --git a/testes/testes_placa_grafica.py b/testes/test_placa_grafica.py similarity index 100% rename from testes/testes_placa_grafica.py rename to testes/test_placa_grafica.py From 822ded7534513fd93deac130a3bc4befc43c4faa Mon Sep 17 00:00:00 2001 From: Cleberton Junior Date: Tue, 17 Mar 2020 22:40:39 -0300 Subject: [PATCH 4/5] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20Fase=20conclu?= =?UTF-8?q?=C3=ADda?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fase.py | 34 ++++++++++++++++++++++++++++------ testes/test_fase.py | 2 +- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/fase.py b/fase.py index 1c8fd161f..b3bfb2b67 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,7 +35,6 @@ def __init__(self, intervalo_de_colisao=1): self._porcos = [] self._obstaculos = [] - def adicionar_obstaculo(self, *obstaculos): """ Adiciona obstáculos em uma fase @@ -73,7 +71,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 +89,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 +103,27 @@ 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._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 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/testes/test_fase.py b/testes/test_fase.py index 8158a43f5..dc0dcfbd3 100644 --- a/testes/test_fase.py +++ b/testes/test_fase.py @@ -179,7 +179,7 @@ def teste_lancar_passaro_sem_erro_quando_nao_existe_passaro(self): self.assertTrue(passaros[0].foi_lancado()) self.assertTrue(passaros[1].foi_lancado()) - def teste_intervalo_de_colisao_padrão(self): + def teste_intervalo_de_colisao_padrao(self): ''' Método que testa se o intervalo de colisão da Fase é repassado aos atores. Padrão de intervalo é 1 From 507f944412703bc30c03cf34177d98a7d6a0fa21 Mon Sep 17 00:00:00 2001 From: Cleberton Junior Date: Wed, 18 Mar 2020 23:40:36 -0300 Subject: [PATCH 5/5] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20Atores=20conclu?= =?UTF-8?q?=C3=ADda?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- atores.py | 53 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/atores.py b/atores.py index cfc2ef5ea..42c4e9021 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): """ @@ -101,7 +105,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,8 +122,11 @@ 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._esta_voando(): + delta_t = tempo - self._tempo_de_lancamento + self._calcular_pocicao_vertical(delta_t) + self._calcular_pocicao_horizontal(delta_t) + return super().calcular_posicao(tempo) def lancar(self, angulo, tempo_de_lancamento): """ @@ -129,12 +137,33 @@ 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 + + def _calcular_pocicao_vertical(self, delta_t): + y_atual = self._y_inicial + y_atual += self.velocidade_escalar * delta_t * math.sin(self._angulo_de_lancamento) + y_atual -= (GRAVIDADE * delta_t ** 2) / 2 + self.y = y_atual + + def _calcular_pocicao_horizontal(self, delta_t): + x_atual = self._x_inicial + x_atual += self.velocidade_escalar * delta_t * math.cos(self._angulo_de_lancamento) + 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 + +