From ad4220cb96cc539e77000c7936d12d2e2224ac40 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 1 Feb 2022 18:05:27 -0300 Subject: [PATCH 1/9] Criada a classe Pessoa. --- oo/__init__.py | 0 oo/pessoa.py | 2 ++ 2 files changed, 2 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..e1da50e22 --- /dev/null +++ b/oo/pessoa.py @@ -0,0 +1,2 @@ +class Pessoa: + pass \ No newline at end of file From a7d151b05757f68bfc9d7f2cf0c73d9e12188091 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 1 Feb 2022 18:24:02 -0300 Subject: [PATCH 2/9] Criado metodo cumprimentar. --- oo/pessoa.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index e1da50e22..a23fb3f9c 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,2 +1,9 @@ class Pessoa: - pass \ No newline at end of file + def cumprimentar(self): + return f'Ola {id(self)}' + +if __name__ == '__main__': + p = Pessoa() + print(Pessoa.cumprimentar(p)) + print(id(p)) + print(p.cumprimentar()) From 3fc7694d6a6576cb30101b3b2a40da3fc3e53ccf Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 1 Feb 2022 18:36:23 -0300 Subject: [PATCH 3/9] Criados Aributos de Instancia nome e idade. --- oo/pessoa.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index a23fb3f9c..63c98c46b 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,9 +1,17 @@ class Pessoa: + def __init__(self, nome=None, idade=38): + self.idade = idade + self.nome = nome + def cumprimentar(self): return f'Ola {id(self)}' if __name__ == '__main__': - p = Pessoa() + p = Pessoa('Luis') print(Pessoa.cumprimentar(p)) print(id(p)) print(p.cumprimentar()) + print(p.nome) + p.nome = 'Fabio' + print(p.nome) + print(p.idade) \ No newline at end of file From 55175f8be56d290b9ca3551900c1e218ff47a342 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 1 Feb 2022 18:47:23 -0300 Subject: [PATCH 4/9] Criados Aributo complexo filhos. --- oo/pessoa.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 63c98c46b..88d00fa80 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,17 +1,19 @@ class Pessoa: - def __init__(self, nome=None, idade=38): + def __init__(self, *filhos, nome=None, idade=38): self.idade = idade self.nome = nome + self.filhos = list(filhos) def cumprimentar(self): return f'Ola {id(self)}' if __name__ == '__main__': - p = Pessoa('Luis') - print(Pessoa.cumprimentar(p)) - print(id(p)) - print(p.cumprimentar()) - print(p.nome) - p.nome = 'Fabio' - print(p.nome) - print(p.idade) \ No newline at end of file + fabio = Pessoa(nome='Fabio') + luis = Pessoa(fabio, nome='Luis') + print(Pessoa.cumprimentar(luis)) + print(id(luis)) + print(luis.cumprimentar()) + print(luis.nome) + print(luis.idade) + for filho in luis.filhos: + print(filho.nome) \ No newline at end of file From 13def7d91f20a30dfa793694c3c796e782bb1273 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 1 Feb 2022 18:58:45 -0300 Subject: [PATCH 5/9] Criado e removido Aributo dinamico de objetos do tipo Pessoa. --- oo/pessoa.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 88d00fa80..652235404 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -16,4 +16,8 @@ def cumprimentar(self): print(luis.nome) print(luis.idade) for filho in luis.filhos: - print(filho.nome) \ No newline at end of file + print(filho.nome) + luis.sobrenome = 'Santos da Silva' + del luis.filhos + print(luis.__dict__) + print(fabio.__dict__) From ae82d7b5e2c00cafecce680b45adf8ded37b0fa1 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 1 Feb 2022 19:15:59 -0300 Subject: [PATCH 6/9] Criado Atributo de Classe, Olhos. --- oo/pessoa.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/oo/pessoa.py b/oo/pessoa.py index 652235404..707347384 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,4 +1,5 @@ class Pessoa: + olhos = 2 def __init__(self, *filhos, nome=None, idade=38): self.idade = idade self.nome = nome @@ -19,5 +20,11 @@ def cumprimentar(self): print(filho.nome) luis.sobrenome = 'Santos da Silva' del luis.filhos + luis.olhos = 1 + del luis.olhos print(luis.__dict__) print(fabio.__dict__) + print(Pessoa.olhos) + print(luis.olhos) + print(fabio.olhos) + print(id(Pessoa.olhos), id(luis.olhos), id(fabio.olhos)) \ No newline at end of file From 5a913bc068b08a651df60a73ccfaa6dbf2deec0d Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 1 Feb 2022 19:31:13 -0300 Subject: [PATCH 7/9] Criado Metodo de Classe @static and @class. --- oo/pessoa.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 707347384..2a8fa00d5 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -8,6 +8,14 @@ def __init__(self, *filhos, nome=None, idade=38): def cumprimentar(self): return f'Ola {id(self)}' + @staticmethod + def metodo_estatico(): + return 42 + + @classmethod + def nome_e_aributos_de_classe(cls): + return f'{cls} - olhos {cls.olhos}' + if __name__ == '__main__': fabio = Pessoa(nome='Fabio') luis = Pessoa(fabio, nome='Luis') @@ -27,4 +35,6 @@ def cumprimentar(self): print(Pessoa.olhos) print(luis.olhos) print(fabio.olhos) - print(id(Pessoa.olhos), id(luis.olhos), id(fabio.olhos)) \ No newline at end of file + print(id(Pessoa.olhos), id(luis.olhos), id(fabio.olhos)) + print(Pessoa.metodo_estatico(), luis.metodo_estatico()) + print(Pessoa.nome_e_aributos_de_classe(), luis.nome_e_aributos_de_classe()) \ No newline at end of file From fe2a8bdb81972fc70ea7cebdd97ba251260f90e8 Mon Sep 17 00:00:00 2001 From: fabio1008 Date: Thu, 10 Mar 2022 21:10:31 -0300 Subject: [PATCH 8/9] Readme Linux --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cbb6dfb5e..4c7d42737 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/pythonprobr/pythonbirds) Python Birds -=========== +================ Essa versão é a mais simples. Ela não contém replay nem reset, de forma que o jogo não pode retroceder. From c8e0edbc2743163a95fdb82cdc981f47b65888d0 Mon Sep 17 00:00:00 2001 From: fabio1008 Date: Mon, 18 Jul 2022 23:11:59 +0200 Subject: [PATCH 9/9] Testes implementados! --- atores.py | 53 +++++++++++++++---- fase.py | 39 ++++++++++---- testes/{atores_testes.py => test_atores.py} | 3 +- testes/{fase_testes.py => test_fase.py} | 0 testes/{integracao.py => test_integracao.py} | 0 ...placa_grafica.py => test_placa_grafica.py} | 0 6 files changed, 73 insertions(+), 22 deletions(-) rename testes/{atores_testes.py => test_atores.py} (99%) 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/atores.py b/atores.py index cfc2ef5ea..06387d1b6 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,8 @@ def foi_lancado(self): :return: booleano """ - return True + + return not self._tempo_de_lancamento is None def colidir_com_chao(self): """ @@ -101,7 +106,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 +123,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_posicao_vertical(delta_t) + self._calcular_posicao_horizontal(delta_t) + return super().calcular_posicao(tempo) def lancar(self, angulo, tempo_de_lancamento): @@ -129,12 +139,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_posicao_vertical(self, delta_t): + y_atual = self._y_inicial + angulo_radianos = 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 + + def _calcular_posicao_horizontal(self, delta_t): + x_atual = self._x_inicial + angulo_radianos = self._angulo_de_lancamento + x_atual += self.velocidade_escalar*delta_t*math.cos(angulo_radianos) + 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 diff --git a/fase.py b/fase.py index 3385175c6..2066f96e5 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,12 @@ def status(self): :return: """ - return EM_ANDAMENTO + if not self._possui_porco_ativo(): + return VITORIA + elif self._possui_passaros_ativos(): + 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,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._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_passaros_ativos(self): + for passaro in self._passaros: + if passaro.status == ATIVO: + return True + return False diff --git a/testes/atores_testes.py b/testes/test_atores.py similarity index 99% rename from testes/atores_testes.py rename to testes/test_atores.py index f4254f29e..22314b0ad 100644 --- a/testes/atores_testes.py +++ b/testes/test_atores.py @@ -127,7 +127,7 @@ def assert_colisao_atores_ativos(self, ator, ator2, intervalo=1): def assert_nao_colisao(self, ator, ator2): """ Se certifica que não colisão entre dois atores - Atenção: Esse não é método de teste porque nao se inicia com prefixo "text". + Atenção: Esse não é método de teste porque nao se inicia com prefixo "test". Ele apenas encapsula a lógica de não colisão entre dois atores. So seja, eles deve manter seus respectivos status mesmo depois da chamada do metodo colidir """ @@ -266,7 +266,6 @@ def teste_lacamento_vertical(self): passaro_amarelo.lancar(90, 2) # passaro lancado a 90 graus no tempo 2 segundos - # subindo self.assert_posicao_vertical(1, 2.0, passaro_amarelo) 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