From 839a82d719e6534244adbd2f87c83656b7f965bf Mon Sep 17 00:00:00 2001 From: renzon Date: Sat, 3 Feb 2018 12:51:00 -0200 Subject: [PATCH 01/27] 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 b8ed5c9469dc5416765649d20f0360253d8c4216 Mon Sep 17 00:00:00 2001 From: renzon Date: Sat, 3 Feb 2018 13:05:07 -0200 Subject: [PATCH 02/27] =?UTF-8?q?Criado=20m=C3=A9todo=20cumprimentar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index e1da50e22..f9cc586bb 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,2 +1,10 @@ class Pessoa: - pass \ No newline at end of file + def cumprimentar(self): + return f'Olá {id(self)}' + + +if __name__ == '__main__': + p = Pessoa() + print(Pessoa.cumprimentar(p)) + print(id(p)) + print(p.cumprimentar()) From 1332e4eee0f30363951d489ac18da946d1d019f9 Mon Sep 17 00:00:00 2001 From: renzon Date: Sat, 3 Feb 2018 13:18:27 -0200 Subject: [PATCH 03/27] =?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 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index f9cc586bb..cb0765d3e 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,10 +1,18 @@ class Pessoa: + def __init__(self, nome=None, idade=35): + self.idade = idade + self.nome = nome + def cumprimentar(self): return f'Olá {id(self)}' if __name__ == '__main__': - p = Pessoa() + p = Pessoa('Luciano') print(Pessoa.cumprimentar(p)) print(id(p)) print(p.cumprimentar()) + print(p.nome) + p.nome = 'Renzo' + print(p.nome) + print(p.idade) From ce250e45befea2be1539457cd2cc0be7f27180f9 Mon Sep 17 00:00:00 2001 From: renzon Date: Sat, 3 Feb 2018 13:27:31 -0200 Subject: [PATCH 04/27] Criado atributo complexo filhos --- oo/pessoa.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index cb0765d3e..0b4cbe23a 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,18 +1,20 @@ 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 f'Olá {id(self)}' if __name__ == '__main__': - p = Pessoa('Luciano') - print(Pessoa.cumprimentar(p)) - print(id(p)) - print(p.cumprimentar()) - print(p.nome) - p.nome = 'Renzo' - print(p.nome) - print(p.idade) + renzo = Pessoa(nome='Renzo') + luciano = Pessoa(renzo, nome='Luciano') + print(Pessoa.cumprimentar(luciano)) + print(id(luciano)) + print(luciano.cumprimentar()) + print(luciano.nome) + print(luciano.idade) + for filho in luciano.filhos: + print(filho.nome) From f9229a86021310f92ea36d3779457524280f713e Mon Sep 17 00:00:00 2001 From: renzon Date: Tue, 6 Feb 2018 13:46:02 -0200 Subject: [PATCH 05/27] =?UTF-8?q?Criado=20e=20removido=20atributo=20din?= =?UTF-8?q?=C3=A2mico=20de=20objetos=20do=20tipo=20Pessoa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/oo/pessoa.py b/oo/pessoa.py index 0b4cbe23a..3ce39b2c9 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -18,3 +18,7 @@ def cumprimentar(self): print(luciano.idade) for filho in luciano.filhos: print(filho.nome) + luciano.sobrenome = 'Ramalho' + del luciano.filhos + print(luciano.__dict__) + print(renzo.__dict__) From 409189a8b367b3851a126a8c279265176bc5fba2 Mon Sep 17 00:00:00 2001 From: renzon Date: Tue, 6 Feb 2018 14:00:32 -0200 Subject: [PATCH 06/27] Criado atributo de classe olhos --- oo/pessoa.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 3ce39b2c9..21d4505df 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -1,4 +1,6 @@ class Pessoa: + olhos = 2 + def __init__(self, *filhos, nome=None, idade=35): self.idade = idade self.nome = nome @@ -20,5 +22,12 @@ def cumprimentar(self): print(filho.nome) luciano.sobrenome = 'Ramalho' del luciano.filhos - print(luciano.__dict__) + luciano.olhos = 1 + del luciano.olhos print(renzo.__dict__) + print(luciano.__dict__) + Pessoa.olhos = 3 + print(Pessoa.olhos) + print(luciano.olhos) + print(renzo.olhos) + print(id(Pessoa.olhos), id(luciano.olhos), id(renzo.olhos)) From ba023ddb30648922e1988185165ac5d782ca062f Mon Sep 17 00:00:00 2001 From: renzon Date: Tue, 6 Feb 2018 14:30:06 -0200 Subject: [PATCH 07/27] =?UTF-8?q?Criado=20doctest=20com=20enunciado=20do?= =?UTF-8?q?=20problema=20Carro,=20Motor,=20Dire=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/carro.py | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 oo/carro.py diff --git a/oo/carro.py b/oo/carro.py new file mode 100644 index 000000000..6595233c2 --- /dev/null +++ b/oo/carro.py @@ -0,0 +1,95 @@ +""" +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: +1) Atributo de dado velocidade +2) Método acelerar, que deverá incremetar a velocidade de uma unidade +3) 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: +1) Valor de diração com valores possíveis: Norte, Sul, Leste, Oeste. +2) Método girar_a_direita +2) 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' +""" From fd6aeee66aba908ecfc3b84abdbe39af615c2ece Mon Sep 17 00:00:00 2001 From: renzon Date: Tue, 6 Feb 2018 14:44:45 -0200 Subject: [PATCH 08/27] Implementado Motor --- oo/carro.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/oo/carro.py b/oo/carro.py index 6595233c2..3feeefaf5 100644 --- a/oo/carro.py +++ b/oo/carro.py @@ -93,3 +93,15 @@ >>> 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) From d07344aedd7bce8acb4200338bb69a88c66a82a6 Mon Sep 17 00:00:00 2001 From: renzon Date: Tue, 6 Feb 2018 14:45:03 -0200 Subject: [PATCH 09/27] Implementada Direcao --- oo/carro.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/oo/carro.py b/oo/carro.py index 3feeefaf5..8ea91522e 100644 --- a/oo/carro.py +++ b/oo/carro.py @@ -94,6 +94,29 @@ >>> 'Oeste' """ +NORTE = 'Norte' +SUL = 'Sul' +LESTE = 'Leste' +OESTE = 'Oeste' + + +class Direcao: + rotacao_a_direita_dct = { + NORTE: LESTE, LESTE: SUL, SUL: OESTE, OESTE: NORTE + } + rotacao_a_esquerda_dct = { + NORTE: OESTE, LESTE: NORTE, SUL: LESTE, OESTE: SUL + } + + def __init__(self): + self.valor = NORTE + + def girar_a_direita(self): + self.valor = self.rotacao_a_direita_dct[self.valor] + + def girar_a_esquerda(self): + self.valor = self.rotacao_a_esquerda_dct[self.valor] + class Motor: def __init__(self): From 14dd53669beb825ba8aad96b75956e3a0154ddeb Mon Sep 17 00:00:00 2001 From: renzon Date: Tue, 6 Feb 2018 14:55:53 -0200 Subject: [PATCH 10/27] Implementado Carro --- oo/carro.py | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/oo/carro.py b/oo/carro.py index 8ea91522e..5f2e48c24 100644 --- a/oo/carro.py +++ b/oo/carro.py @@ -82,18 +82,43 @@ >>> carro.calcular_velocidade() 0 >>> carro.calcular_direcao() - >>> 'Norte' + 'Norte' >>> carro.girar_a_direita() >>> carro.calcular_direcao() - >>> 'Leste' + 'Leste' >>> carro.girar_a_esquerda() >>> carro.calcular_direcao() - >>> 'Norte' + 'Norte' >>> carro.girar_a_esquerda() >>> carro.calcular_direcao() - >>> 'Oeste' + 'Oeste' """ + +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() + + NORTE = 'Norte' SUL = 'Sul' LESTE = 'Leste' From a0eebf74e1f37dc1cfe9af65f71f6ab50593a135 Mon Sep 17 00:00:00 2001 From: renzon Date: Tue, 6 Feb 2018 15:03:33 -0200 Subject: [PATCH 11/27] =?UTF-8?q?Implementada=20adi=C3=A7=C3=A3o=20de=20pa?= =?UTF-8?q?ssaros,=20porcos=20e=20obst=C3=A1culos=20em=20fase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fase.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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): """ From 79a53a3de888f317ebc4a3a3bb4adb79ee550a95 Mon Sep 17 00:00:00 2001 From: renzon Date: Wed, 21 Feb 2018 19:39:04 -0300 Subject: [PATCH 12/27] =?UTF-8?q?Implementado=20m=C3=A9todo=20de=20classe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/oo/pessoa.py b/oo/pessoa.py index 21d4505df..94cae75ec 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -9,6 +9,14 @@ def __init__(self, *filhos, nome=None, idade=35): def cumprimentar(self): return f'Olá {id(self)}' + @staticmethod + def metodo_estatico(): + return 42 + + @classmethod + def nome_e_atributos_de_classe(cls): + return f'{cls} - olhos {cls.olhos}' + if __name__ == '__main__': renzo = Pessoa(nome='Renzo') @@ -31,3 +39,5 @@ def cumprimentar(self): print(luciano.olhos) print(renzo.olhos) print(id(Pessoa.olhos), id(luciano.olhos), id(renzo.olhos)) + print(Pessoa.metodo_estatico(), luciano.metodo_estatico()) + print(Pessoa.nome_e_atributos_de_classe(), luciano.nome_e_atributos_de_classe()) From 072bd609978556340bed735433d2c4e9e52faf97 Mon Sep 17 00:00:00 2001 From: renzon Date: Wed, 21 Feb 2018 23:02:54 -0300 Subject: [PATCH 13/27] =?UTF-8?q?Implementada=20Heran=C3=A7a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 94cae75ec..ed018e26b 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -18,9 +18,13 @@ def nome_e_atributos_de_classe(cls): return f'{cls} - olhos {cls.olhos}' +class Homem(Pessoa): + pass + + if __name__ == '__main__': - renzo = Pessoa(nome='Renzo') - luciano = Pessoa(renzo, nome='Luciano') + renzo = Homem(nome='Renzo') + luciano = Homem(renzo, nome='Luciano') print(Pessoa.cumprimentar(luciano)) print(id(luciano)) print(luciano.cumprimentar()) @@ -41,3 +45,8 @@ def nome_e_atributos_de_classe(cls): print(id(Pessoa.olhos), id(luciano.olhos), id(renzo.olhos)) print(Pessoa.metodo_estatico(), luciano.metodo_estatico()) print(Pessoa.nome_e_atributos_de_classe(), luciano.nome_e_atributos_de_classe()) + pessoa = Pessoa('Anonimo') + print(isinstance(pessoa, Pessoa)) + print(isinstance(pessoa, Homem)) + print(isinstance(renzo, Pessoa)) + print(isinstance(renzo, Homem)) From 0eb96cb48b710020862d70282022d188fb70e80a Mon Sep 17 00:00:00 2001 From: renzon Date: Wed, 21 Feb 2018 23:24:39 -0300 Subject: [PATCH 14/27] =?UTF-8?q?Explica=C3=A7=C3=A3o=20do=20unittest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/teste_carro.py | 14 ++++++++++++++ testes/{atores_testes.py => testes_atores.py} | 0 testes/{fase_testes.py => testes_fase.py} | 0 testes/{integracao.py => testes_integracao.py} | 0 4 files changed, 14 insertions(+) create mode 100644 oo/teste_carro.py rename testes/{atores_testes.py => testes_atores.py} (100%) rename testes/{fase_testes.py => testes_fase.py} (100%) rename testes/{integracao.py => testes_integracao.py} (100%) diff --git a/oo/teste_carro.py b/oo/teste_carro.py new file mode 100644 index 000000000..49837c5c8 --- /dev/null +++ b/oo/teste_carro.py @@ -0,0 +1,14 @@ +from unittest import TestCase + +from oo.carro import Motor + + +class CarroTestCase(TestCase): + def teste_velocidade_inicial(self): + motor = Motor() + self.assertEqual(0, motor.velocidade) + + def teste_acelerar(self): + motor = Motor() + motor.acelerar() + self.assertEqual(1, motor.velocidade) diff --git a/testes/atores_testes.py b/testes/testes_atores.py similarity index 100% rename from testes/atores_testes.py rename to testes/testes_atores.py 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 From b0adedeeeb4d460e22abe06139b3314813bee67c Mon Sep 17 00:00:00 2001 From: renzon Date: Fri, 23 Feb 2018 14:38:13 -0300 Subject: [PATCH 15/27] Sobrescrita de atributo de classe --- atores.py | 7 +++---- oo/pessoa.py | 8 ++++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/atores.py b/atores.py index cfc2ef5ea..18178671c 100644 --- a/atores.py +++ b/atores.py @@ -55,13 +55,12 @@ def colidir(self, outro_ator, intervalo=1): pass - class Obstaculo(Ator): - pass + _caracter_ativo = 'O' class Porco(Ator): - pass + _caracter_ativo = '@' class DuploLancamentoExcecao(Exception): @@ -137,4 +136,4 @@ class PassaroAmarelo(Passaro): class PassaroVermelho(Passaro): - pass \ No newline at end of file + _caracter_ativo = 'V' \ No newline at end of file diff --git a/oo/pessoa.py b/oo/pessoa.py index ed018e26b..92f3a53a1 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -22,8 +22,12 @@ class Homem(Pessoa): pass +class Mutante(Pessoa): + olhos = 3 + + if __name__ == '__main__': - renzo = Homem(nome='Renzo') + renzo = Mutante(nome='Renzo') luciano = Homem(renzo, nome='Luciano') print(Pessoa.cumprimentar(luciano)) print(id(luciano)) @@ -38,7 +42,6 @@ class Homem(Pessoa): del luciano.olhos print(renzo.__dict__) print(luciano.__dict__) - Pessoa.olhos = 3 print(Pessoa.olhos) print(luciano.olhos) print(renzo.olhos) @@ -50,3 +53,4 @@ class Homem(Pessoa): print(isinstance(pessoa, Homem)) print(isinstance(renzo, Pessoa)) print(isinstance(renzo, Homem)) + print(renzo.olhos) From d69aee2d5256f23a1194cddf29b163738318f167 Mon Sep 17 00:00:00 2001 From: renzon Date: Mon, 26 Feb 2018 11:40:37 -0300 Subject: [PATCH 16/27] =?UTF-8?q?Sobrescrita=20de=20m=C3=A9todo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oo/pessoa.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/oo/pessoa.py b/oo/pessoa.py index 92f3a53a1..c355df45a 100644 --- a/oo/pessoa.py +++ b/oo/pessoa.py @@ -7,7 +7,7 @@ def __init__(self, *filhos, nome=None, idade=35): self.filhos = list(filhos) def cumprimentar(self): - return f'Olá {id(self)}' + return f'Olá, meu nome é {self.nome}' @staticmethod def metodo_estatico(): @@ -19,7 +19,9 @@ def nome_e_atributos_de_classe(cls): class Homem(Pessoa): - pass + def cumprimentar(self): + cumprimentar_da_classe = super().cumprimentar() + return f'{cumprimentar_da_classe}. Aperto de mão' class Mutante(Pessoa): @@ -54,3 +56,5 @@ class Mutante(Pessoa): print(isinstance(renzo, Pessoa)) print(isinstance(renzo, Homem)) print(renzo.olhos) + print(luciano.cumprimentar()) + print(renzo.cumprimentar()) From 5ec6e0f287d44e41db372a7412e3b2b69fb4f5a7 Mon Sep 17 00:00:00 2001 From: renzon Date: Mon, 26 Feb 2018 11:42:15 -0300 Subject: [PATCH 17/27] Removidos imports nao utilizados --- testes/testes_fase.py | 6 ++---- testes/testes_integracao.py | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/testes/testes_fase.py b/testes/testes_fase.py index 8158a43f5..8852a98c2 100644 --- a/testes/testes_fase.py +++ b/testes/testes_fase.py @@ -8,15 +8,13 @@ project_dir = path.dirname(__file__) project_dir = path.join('..') sys.path.append(project_dir) -from placa_grafica_tkinter import rodar_fase project_dir = os.path.join(os.path.dirname(__file__), '..') project_dir = os.path.normpath(project_dir) sys.path.append(project_dir) -from atores import (Obstaculo, Porco, PassaroVermelho, PassaroAmarelo, - DESTRUIDO, ATIVO, DuploLancamentoExcecao) -from fase import Fase, Ponto, EM_ANDAMENTO, VITORIA, DERROTA +from atores import Obstaculo, DESTRUIDO, ATIVO, DuploLancamentoExcecao +from fase import Fase, EM_ANDAMENTO, VITORIA, DERROTA class AtorFake: diff --git a/testes/testes_integracao.py b/testes/testes_integracao.py index 11f2f0178..2df2c043e 100644 --- a/testes/testes_integracao.py +++ b/testes/testes_integracao.py @@ -16,8 +16,7 @@ project_dir = os.path.normpath(project_dir) sys.path.append(project_dir) -from atores import Obstaculo, Porco, PassaroVermelho, PassaroAmarelo, DESTRUIDO, ATIVO, \ - Ator, Passaro +from atores import Obstaculo, Porco, PassaroVermelho, PassaroAmarelo, DESTRUIDO from fase import Fase, Ponto, EM_ANDAMENTO, VITORIA, DERROTA class FaseTestes(TestCase): From 7e8ff76221089719b5373cf085e7eaf949809986 Mon Sep 17 00:00:00 2001 From: renzon Date: Mon, 26 Feb 2018 13:40:51 -0300 Subject: [PATCH 18/27] Implementado teste teste_acabou_sem_porcos --- fase.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fase.py b/fase.py index 1c8fd161f..e2d17101e 100644 --- a/fase.py +++ b/fase.py @@ -73,7 +73,7 @@ def status(self): :return: """ - return EM_ANDAMENTO + return VITORIA def lancar(self, angulo, tempo): """ From 04a2df3390a3578eeebe20af78810b6f2a92c657 Mon Sep 17 00:00:00 2001 From: renzon Date: Mon, 26 Feb 2018 14:11:48 -0300 Subject: [PATCH 19/27] =?UTF-8?q?Implementado=20m=C3=A9todo=20status?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fase.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/fase.py b/fase.py index e2d17101e..5ca08ff3c 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 VITORIA + if not self._possui_porco_ativo(): + return VITORIA + elif self._possui_passaros_ativos(): + return EM_ANDAMENTO + else: + return DERROTA def lancar(self, angulo, tempo): """ @@ -88,7 +91,6 @@ def lancar(self, angulo, tempo): """ pass - def calcular_pontos(self, tempo): """ Lógica que retorna os pontos a serem exibidos na tela. @@ -98,10 +100,21 @@ 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] + 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 From 7d33b85eff7ad2ebe24170e14421e3b6d3fdf9a5 Mon Sep 17 00:00:00 2001 From: renzon Date: Mon, 26 Feb 2018 14:23:28 -0300 Subject: [PATCH 20/27] =?UTF-8?q?Implementado=20m=C3=A9todo=20lan=C3=A7ar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fase.py | 5 ++++- testes/testes_fase.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/fase.py b/fase.py index 5ca08ff3c..567c98451 100644 --- a/fase.py +++ b/fase.py @@ -89,7 +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): """ diff --git a/testes/testes_fase.py b/testes/testes_fase.py index 8852a98c2..ee51e1c36 100644 --- a/testes/testes_fase.py +++ b/testes/testes_fase.py @@ -171,7 +171,7 @@ def teste_lancar_passaro_sem_erro_quando_nao_existe_passaro(self): fase.lancar(90, 1) fase.lancar(45, 3) fase.lancar(31, - 5) # testando que lançar passaros depios de todos + 5) # testando que lançar passaros depois de todos # lançados não causa erro self.assertTrue(passaros[0].foi_lancado()) From d122bcee7be73d58477e52155a1d0062a2f075e1 Mon Sep 17 00:00:00 2001 From: renzon Date: Mon, 26 Feb 2018 19:02:16 -0300 Subject: [PATCH 21/27] Implementada a fase --- fase.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fase.py b/fase.py index 567c98451..2066f96e5 100644 --- a/fase.py +++ b/fase.py @@ -103,6 +103,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 From 9bb0fbac6c026a64a820554c18e0d2384b14fc55 Mon Sep 17 00:00:00 2001 From: renzon Date: Mon, 26 Feb 2018 19:10:19 -0300 Subject: [PATCH 22/27] =?UTF-8?q?Implementado=20m=C3=A9todo=20calcular=5Fp?= =?UTF-8?q?osicao=20de=20Ator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- atores.py | 4 ++-- testes/testes_atores.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/atores.py b/atores.py index 18178671c..4bfd6a3b0 100644 --- a/atores.py +++ b/atores.py @@ -9,7 +9,7 @@ GRAVIDADE = 10 # m/s^2 -class Ator(): +class Ator: """ Classe que representa um ator. Ele representa um ponto cartesiano na tela. """ @@ -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): """ diff --git a/testes/testes_atores.py b/testes/testes_atores.py index f4254f29e..d5fd59c7f 100644 --- a/testes/testes_atores.py +++ b/testes/testes_atores.py @@ -8,7 +8,6 @@ project_dir = path.join('..') sys.path.append(project_dir) -import unittest from unittest.case import TestCase from atores import Ator, DESTRUIDO, ATIVO, Obstaculo, Porco, PassaroAmarelo, PassaroVermelho From 929a38377ee3ddf3a42e8595b51aaba6d6260921 Mon Sep 17 00:00:00 2001 From: renzon Date: Mon, 26 Feb 2018 19:30:54 -0300 Subject: [PATCH 23/27] =?UTF-8?q?Implementada=20colis=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- atores.py | 9 ++++++--- testes/testes_atores.py | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/atores.py b/atores.py index 4bfd6a3b0..6337c5704 100644 --- a/atores.py +++ b/atores.py @@ -52,7 +52,11 @@ 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): @@ -118,7 +122,6 @@ def calcular_posicao(self, tempo): """ return 1, 1 - def lancar(self, angulo, tempo_de_lancamento): """ Lógica que lança o pássaro. Deve armazenar o ângulo e o tempo de lançamento para posteriores cálculo. @@ -136,4 +139,4 @@ class PassaroAmarelo(Passaro): class PassaroVermelho(Passaro): - _caracter_ativo = 'V' \ No newline at end of file + _caracter_ativo = 'V' diff --git a/testes/testes_atores.py b/testes/testes_atores.py index d5fd59c7f..762335ca5 100644 --- a/testes/testes_atores.py +++ b/testes/testes_atores.py @@ -112,7 +112,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 @@ -143,7 +143,7 @@ def assert_nao_colisao(self, ator, ator2): class ObstaculoTestes(TestCase): """ - Esperado '0' como caracter de obstáculo ativo e ' ' como caracter de obstáculo destruído + Esperado 'O' como caracter de obstáculo ativo e ' ' como caracter de obstáculo destruído """ def teste_status(self): obstaculo = Obstaculo() From ae8809e072f049b1c58005e94822d885c709e80d Mon Sep 17 00:00:00 2001 From: renzon Date: Mon, 26 Feb 2018 19:35:55 -0300 Subject: [PATCH 24/27] =?UTF-8?q?Implmentado=20Porco=20e=20Obst=C3=A1culo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- atores.py | 1 + 1 file changed, 1 insertion(+) diff --git a/atores.py b/atores.py index 6337c5704..4785bf804 100644 --- a/atores.py +++ b/atores.py @@ -65,6 +65,7 @@ class Obstaculo(Ator): class Porco(Ator): _caracter_ativo = '@' + _caracter_destruido = '+' class DuploLancamentoExcecao(Exception): From 83ab3ad65ee5cf2330e69d0cf39a634c6ee1c3ba Mon Sep 17 00:00:00 2001 From: renzon Date: Mon, 26 Feb 2018 19:43:45 -0300 Subject: [PATCH 25/27] Implementada velocidade escalar de Passaro Vermelho --- atores.py | 2 ++ testes/testes_atores.py | 12 ++++-------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/atores.py b/atores.py index 4785bf804..760741213 100644 --- a/atores.py +++ b/atores.py @@ -141,3 +141,5 @@ class PassaroAmarelo(Passaro): class PassaroVermelho(Passaro): _caracter_ativo = 'V' + _caracter_destruido = 'v' + velocidade_escalar = 20 diff --git a/testes/testes_atores.py b/testes/testes_atores.py index 762335ca5..e8ea91c12 100644 --- a/testes/testes_atores.py +++ b/testes/testes_atores.py @@ -41,7 +41,6 @@ def teste_ator_posicao(self): self.assertEqual(0.3, x) self.assertEqual(0.5, y) - def teste_colisao_entre_atores_ativos(self): """ Teste de colisão entre dois atores @@ -108,7 +107,6 @@ def test_caracter(self): ator.colidir(outro_ator_na_mesma_posicao) self.assertEqual(' ', ator.caracter()) - def assert_colisao_atores_ativos(self, ator, ator2, intervalo=1): """ Se certifica que há colisão entre atores ativos @@ -145,6 +143,7 @@ class ObstaculoTestes(TestCase): """ Esperado 'O' como caracter de obstáculo ativo e ' ' como caracter de obstáculo destruído """ + def teste_status(self): obstaculo = Obstaculo() self.assertEqual('O', obstaculo.caracter()) @@ -157,6 +156,7 @@ class PorcoTestes(TestCase): """ Esperado '@' como caracter de porco ativo e '+' como caracter de porco destruido """ + def teste_status(self): porco = Porco() self.assertEqual('@', porco.caracter()) @@ -201,11 +201,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 @@ -264,8 +262,6 @@ def teste_lacamento_vertical(self): passaro_amarelo = PassaroAmarelo(1, 1) passaro_amarelo.lancar(90, 2) # passaro lancado a 90 graus no tempo 2 segundos - - # subindo self.assert_posicao_vertical(1, 2.0, passaro_amarelo) @@ -758,6 +754,6 @@ def assert_posicao_vertical(self, y, tempo, passaro): self.assert_passaro_posicao(1, y, ATIVO, passaro, tempo) -if __name__=='__main__': - teste= AtorTestes() +if __name__ == '__main__': + teste = AtorTestes() teste.teste_colisao_entre_atores_ativos() From 2150ca79841c4a90546646cedcb131b52f7d3726 Mon Sep 17 00:00:00 2001 From: renzon Date: Mon, 26 Feb 2018 19:52:23 -0300 Subject: [PATCH 26/27] =?UTF-8?q?Implementada=20l=C3=B3gica=20de=20lan?= =?UTF-8?q?=C3=A7amento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- atores.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/atores.py b/atores.py index 760741213..9a3a88c97 100644 --- a/atores.py +++ b/atores.py @@ -93,11 +93,11 @@ def __init__(self, x=0, y=0): def foi_lancado(self): """ - Método que retorna verdaeira se o pássaro já foi lançado e falso caso contrário + Método que retorna verdadeiro 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): """ @@ -132,7 +132,8 @@ 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 class PassaroAmarelo(Passaro): From 9aa412d681ece51945dbb34ade5e52e9428c3c9f Mon Sep 17 00:00:00 2001 From: renzon Date: Mon, 26 Feb 2018 21:33:54 -0300 Subject: [PATCH 27/27] Implementado jogo completo --- atores.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/atores.py b/atores.py index 9a3a88c97..86deb1d72 100644 --- a/atores.py +++ b/atores.py @@ -105,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): """ @@ -121,7 +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_posicao_vertical(delta_t) + self._calcular_posicao_horizontal(delta_t) + return super().calcular_posicao(tempo) def lancar(self, angulo, tempo_de_lancamento): """ @@ -132,12 +137,30 @@ def lancar(self, angulo, tempo_de_lancamento): :param tempo_de_lancamento: :return: """ - self._angulo_de_lancamento = angulo + 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):