From b48b24af38b4a8b925b6819ea993e47e1236a76e Mon Sep 17 00:00:00 2001 From: "felipe.nogueira" Date: Tue, 2 Mar 2021 18:59:34 -0300 Subject: [PATCH 1/8] =?UTF-8?q?Criado=20o=20m=C3=B3dulo=20e=20a=20classe?= =?UTF-8?q?=20pessoa.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 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 1dde0918f2934da3fbdbc1f2861112cd2a70b4b7 Mon Sep 17 00:00:00 2001 From: "felipe.nogueira" Date: Tue, 2 Mar 2021 19:05:50 -0300 Subject: [PATCH 2/8] =?UTF-8?q?Cria=20m=C3=A9todo=20cumprimentar=20no=20m?= =?UTF-8?q?=C3=B3dulo=20pessoa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index e1da50e22..2527937fe 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,2 +1,8 @@ class Pessoa: - pass \ No newline at end of file + def cumprimentar(self): + return 'Olá' + +if __name__ == '__main__': + p = Pessoa() + print(Pessoa.cumprimentar(p)) + print(p.cumprimentar()) \ No newline at end of file From c22d3e35d866f377fe921db938bad48b6299297a Mon Sep 17 00:00:00 2001 From: "felipe.nogueira" Date: Tue, 2 Mar 2021 19:10:58 -0300 Subject: [PATCH 3/8] =?UTF-8?q?Criados=20atributos=20de=20inst=C3=A2ncia?= =?UTF-8?q?=20nome=20e=20idade?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 2527937fe..6d0c4c05c 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,8 +1,15 @@ + class Pessoa: + def __init__(self, nome = None, idade=35): + self.idade = idade + self.nome = nome + def cumprimentar(self): return 'Olá' if __name__ == '__main__': - p = Pessoa() + p = Pessoa('Felipe') print(Pessoa.cumprimentar(p)) - print(p.cumprimentar()) \ No newline at end of file + print(p.cumprimentar()) + print(p.nome) + print(p.idade) From 2274202e00d01eb6a35d3afc1423754bf14e756b Mon Sep 17 00:00:00 2001 From: "felipe.nogueira" Date: Tue, 2 Mar 2021 19:23:41 -0300 Subject: [PATCH 4/8] Criado atributo complexo *filhos --- oo/pessoa.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 6d0c4c05c..30480b9f9 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,15 +1,18 @@ class Pessoa: - def __init__(self, nome = None, idade=35): + def __init__(self, *filhos, nome = None, idade=35): self.idade = idade self.nome = nome - + self.filhos = list(filhos) def cumprimentar(self): return 'Olá' if __name__ == '__main__': - p = Pessoa('Felipe') - print(Pessoa.cumprimentar(p)) - print(p.cumprimentar()) - print(p.nome) - print(p.idade) + matheus = Pessoa(nome='Matheus') + felipe = Pessoa(matheus, nome='Felipe') + print(Pessoa.cumprimentar(felipe)) + print(felipe.cumprimentar()) + print(felipe.nome) + print(felipe.idade) + for filho in felipe.filhos: + print(filho.nome) \ No newline at end of file From 799c9eb1af53700dae615843a5e376ccd36e7899 Mon Sep 17 00:00:00 2001 From: "felipe.nogueira" Date: Tue, 2 Mar 2021 19:27:46 -0300 Subject: [PATCH 5/8] =?UTF-8?q?Criado=20e=20removido=20atributo=20din?= =?UTF-8?q?=C3=A2mico=20do=20objeto=20de=20tipo=20Pessoa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 30480b9f9..6dcdace5e 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -14,5 +14,12 @@ def cumprimentar(self): print(felipe.cumprimentar()) print(felipe.nome) print(felipe.idade) + for filho in felipe.filhos: - print(filho.nome) \ No newline at end of file + print(filho.nome) + + felipe.sobrenome = 'Nogueira' + print(felipe.sobrenome) + del felipe.filhos + print(felipe.__dict__) + print(matheus.__dict__) \ No newline at end of file From 7298973cac673d751e387ae82e44e559412fa358 Mon Sep 17 00:00:00 2001 From: "felipe.nogueira" Date: Tue, 2 Mar 2021 19:38:35 -0300 Subject: [PATCH 6/8] =?UTF-8?q?Criado=20m=C3=A9todo=20de=20classe=20e=20m?= =?UTF-8?q?=C3=A9todo=20est=C3=A1tico,=20onde=20no=20primeiro=20eu=20tenho?= =?UTF-8?q?=20acesso=20aos=20atributos=20da=20classe=20e=20no=20segundo=20?= =?UTF-8?q?=C3=A9=20um=20m=C3=A9todo=20indiferente=20da=20classe.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 6dcdace5e..7187c8c3b 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,12 +1,23 @@ - class Pessoa: - def __init__(self, *filhos, nome = None, idade=35): + olhos = 2 + + def __init__(self, *filhos, nome=None, idade=35): self.idade = idade self.nome = nome self.filhos = list(filhos) + def cumprimentar(self): return 'Olá' + @staticmethod + def estatico(): + return 42 + + @classmethod + def nome_e_atributos_de_classe(cls): + return f'{cls} - olhos {cls.olhos}' + + if __name__ == '__main__': matheus = Pessoa(nome='Matheus') felipe = Pessoa(matheus, nome='Felipe') @@ -22,4 +33,9 @@ def cumprimentar(self): print(felipe.sobrenome) del felipe.filhos print(felipe.__dict__) - print(matheus.__dict__) \ No newline at end of file + print(matheus.__dict__) + print(felipe.olhos) + print(id(felipe.olhos), id(matheus.olhos)) + + print(felipe.estatico()) + print(felipe.nome_e_atributos_de_classe()) From c9f90a9d51db3219dfaebfdff583af213dfcce70 Mon Sep 17 00:00:00 2001 From: "felipe.nogueira" Date: Tue, 2 Mar 2021 19:57:21 -0300 Subject: [PATCH 7/8] =?UTF-8?q?Come=C3=A7o=20de=20implementa=C3=A7=C3=A3o?= =?UTF-8?q?=20do=20m=C3=B3dulo=20carro=20com=20as=20classes=20motor,=20dir?= =?UTF-8?q?e=C3=A7=C3=A3o=20e=20carro=20(estudando=20composi=C3=A7=C3=A3o)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/carro.py | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 oo/carro.py diff --git a/oo/carro.py b/oo/carro.py new file mode 100644 index 000000000..2c409b3b2 --- /dev/null +++ b/oo/carro.py @@ -0,0 +1,117 @@ +""" +Você deve criar uma classe carro que vai possuir +dois atributos compostos por outras duas classes: + +1)Motor +2)Direção + +O Motor terá a responsabilidade de controlar a velocidade. +Ele oferece os seguintes atributos: + +-Atributo de dado velocidade +-Método acelerar, que deverá incremetar a velocidade de uma unidade +-Método frear que deverá decrementar a velocidade em duas unidades + +A Direção terá a responsabilidade de controlar a direção. Ela oferece +os seguintes atributos: + +-Valor de diração com valores possíveis: Norte, Sul, Leste, Oeste. +-Método girar_a_direita +-Método girar_a_esquerda + + N + O L + S + +Exemplo: + >>> # 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 + if self.velocidade < 0: + self.velocidade = 0 + + +class Direcao: + pass + + From 470ba167f4333f183e543a32af0544baebded637 Mon Sep 17 00:00:00 2001 From: "felipe.nogueira" Date: Tue, 16 Mar 2021 07:52:32 -0300 Subject: [PATCH 8/8] =?UTF-8?q?Finalizada=20a=20implementa=C3=A7=C3=A3o=20?= =?UTF-8?q?do=20jogos=20PythonBirds.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Assuntos abordados: Programação Procedural (tipos básicos, iteração, modularização); OO (classe e composição, herança); Framework de testes (unittests). --- atores.py | 50 +++++++++++++++---- fase.py | 35 +++++++++++-- oo/carro.py | 50 +++++++++++++++++-- oo/pessoa.py | 20 +++++++- oo/test_carro.py | 14 ++++++ testes/{atores_testes.py => testes_atores.py} | 4 +- testes/{fase_testes.py => testes_fase.py} | 0 .../{integracao.py => testes_integracao.py} | 0 8 files changed, 151 insertions(+), 22 deletions(-) create mode 100644 oo/test_carro.py rename testes/{atores_testes.py => testes_atores.py} (99%) rename testes/{fase_testes.py => testes_fase.py} (100%) rename testes/{integracao.py => testes_integracao.py} (100%) diff --git a/atores.py b/atores.py index cfc2ef5ea..7fd5863a2 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: """ + if self.status == ATIVO == outro_ator.status: + 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 pass - class Obstaculo(Ator): - pass + _caracter_ativo = 'O' class Porco(Ator): - pass + _caracter_ativo = '@' + _caracter_destruido = '+' class DuploLancamentoExcecao(Exception): @@ -93,7 +98,7 @@ 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,8 +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_hotizontal(delta_t) + return super().calcular_posicao(tempo) def lancar(self, angulo, tempo_de_lancamento): """ @@ -129,12 +138,33 @@ def lancar(self, angulo, tempo_de_lancamento): :param tempo_de_lancamento: :return: """ + self._angulo_de_lancamento = math.radians(angulo) + self._tempo_de_lancamento = tempo_de_lancamento pass + def _calcular_posicao_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 / 2 * delta_t ** 2 + self.y = y_atual + + def _calcular_posicao_hotizontal(self, delta_t): + # X=X0+v*cos(teta)*delta_t. + x_atual = self._x_inicial + x_atual += self.velocidade_escalar * math.cos(self._angulo_de_lancamento) * delta_t + 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..44a9558f3 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): """ @@ -73,7 +73,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,7 +91,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 obstaculos in self._porcos+self._obstaculos: + passaro.colidir(obstaculos, 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,15 @@ 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/carro.py b/oo/carro.py index 2c409b3b2..6f3e823c9 100644 --- a/oo/carro.py +++ b/oo/carro.py @@ -107,11 +107,55 @@ def acelerar(self): def frear(self): self.velocidade -= 2 - if self.velocidade < 0: - self.velocidade = 0 + self.velocidade = max(0, self.velocidade) + + +NORTE = 'Norte' +SUL = 'Sul' +LESTE = 'Leste' +OESTE = 'Oeste' class Direcao: - pass + def __init__(self): + self.direcao = [NORTE, LESTE, SUL, OESTE] + self.num = 0 + self.valor = self.direcao[self.num] + + def girar_a_esquerda(self): + self.num -= 1 + if self.num == -5: + self.num = -1 + self.valor = self.direcao[self.num] + + def girar_a_direita(self): + self.num += 1 + if self.num == 4: + self.num = 0 + self.valor = self.direcao[self.num] + + +class Carro: + + def __init__(self, direcao, motor): + self.direcao = direcao + self.motor = motor + + def girar_a_esquerda(self): + self.direcao.girar_a_esquerda() + + def girar_a_direita(self): + self.direcao.girar_a_direita() + + def frear(self): + self.motor.frear() + + def acelerar(self): + self.motor.acelerar() + + def calcular_direcao(self): + return self.direcao.valor + def calcular_velocidade(self): + return self.motor.velocidade diff --git a/oo/pessoa.py b/oo/pessoa.py index 7187c8c3b..64245726b 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -18,8 +18,16 @@ def nome_e_atributos_de_classe(cls): return f'{cls} - olhos {cls.olhos}' +class Homem(Pessoa): + def cumprimentar(self): + cumprimentar_da_pai = super().cumprimentar() + return f'{cumprimentar_da_pai}. Aperto de mão' + + olhos = 3 + + if __name__ == '__main__': - matheus = Pessoa(nome='Matheus') + matheus = Homem(nome='Matheus') felipe = Pessoa(matheus, nome='Felipe') print(Pessoa.cumprimentar(felipe)) print(felipe.cumprimentar()) @@ -39,3 +47,13 @@ def nome_e_atributos_de_classe(cls): print(felipe.estatico()) print(felipe.nome_e_atributos_de_classe()) + + anonima = Pessoa(nome='Anonimo') + + print(isinstance(anonima, Pessoa)) + print(isinstance(anonima, Homem)) + print(isinstance(matheus, Pessoa)) + print(isinstance(matheus, Homem)) + + print(felipe.cumprimentar()) + print(matheus.cumprimentar()) diff --git a/oo/test_carro.py b/oo/test_carro.py new file mode 100644 index 000000000..eaec4e017 --- /dev/null +++ b/oo/test_carro.py @@ -0,0 +1,14 @@ +from unittest import TestCase + +from 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/testes_atores.py similarity index 99% rename from testes/atores_testes.py rename to testes/testes_atores.py index f4254f29e..da6ee959d 100644 --- a/testes/atores_testes.py +++ b/testes/testes_atores.py @@ -113,7 +113,7 @@ def test_caracter(self): def assert_colisao_atores_ativos(self, ator, ator2, intervalo=1): """ Se certifica que há colisão entre atores ativos - 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 serve apenas para encapsular toda lógica de teste de colisão entre dois atores ativos """ # Conferindo status dos dois atores antes da colisão @@ -202,11 +202,9 @@ 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) - def teste_foi_lancado(self): """ Teste de lançamento. Enquanto o método lançar do passaro não for chamado, o méotodo foi_lancado deve retornar diff --git a/testes/fase_testes.py b/testes/testes_fase.py similarity index 100% rename from testes/fase_testes.py rename to testes/testes_fase.py diff --git a/testes/integracao.py b/testes/testes_integracao.py similarity index 100% rename from testes/integracao.py rename to testes/testes_integracao.py