Skip to content

Commit a94bdc8

Browse files
author
renzon
committed
melhora em lógica de colisao
método lançar gerando excecao se executado mais de uma vez
1 parent 3801ad9 commit a94bdc8

File tree

3 files changed

+60
-22
lines changed

3 files changed

+60
-22
lines changed

atores.py

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# -*- coding: utf-8 -*-
22

33
from __future__ import unicode_literals
4+
45
import math
56

67
DESTRUIDO = 'Destruido'
@@ -17,7 +18,8 @@ class Ator():
1718

1819
def __init__(self, x=0, y=0):
1920
"""
20-
Método de inicialização da classe. Deve inicializar os parâmetros x, y, caracter e status
21+
Método de inicialização da classe. Deve inicializar os parâmetros x,
22+
y, caracter e status
2123
2224
:param x: Posição horizontal inicial do ator
2325
:param y: Posição vertical inicial do ator
@@ -27,7 +29,8 @@ def __init__(self, x=0, y=0):
2729
self.status = ATIVO
2830

2931
def caracter(self):
30-
return self._caracter_ativo if self.status == ATIVO else self._caracter_destruido
32+
return self._caracter_ativo if self.status == ATIVO else \
33+
self._caracter_destruido
3134

3235
def calcular_posicao(self, tempo):
3336
"""
@@ -43,8 +46,10 @@ def colidir(self, outro_ator, intervalo=1):
4346
"""
4447
Método que executa lógica de colisão entre dois atores.
4548
Só deve haver colisão se os dois atores tiverem seus status ativos.
46-
Para colisão, é considerado um quadrado, com lado igual ao parâmetro intervalo, em volta do ponto onde se
47-
encontra o ator. Se os atores estiverem dentro desse mesmo quadrado, seus status devem ser alterados para
49+
Para colisão, é considerado um quadrado, com lado igual ao parâmetro
50+
intervalo, em volta do ponto onde se
51+
encontra o ator. Se os atores estiverem dentro desse mesmo quadrado,
52+
seus status devem ser alterados para
4853
destruido, seus caracteres para destruido também.
4954
5055
:param outro_ator: Ator a ser considerado na colisão
@@ -54,7 +59,8 @@ def colidir(self, outro_ator, intervalo=1):
5459
if self.status == DESTRUIDO or outro_ator.status == DESTRUIDO:
5560
return
5661

57-
if self.x - intervalo <= outro_ator.x <= self.x + intervalo and self.y - intervalo <= outro_ator.y <= self.y + intervalo:
62+
if abs(self.x - outro_ator.x) <= intervalo and abs(
63+
self.y - outro_ator.y) <= intervalo:
5864
self.status = DESTRUIDO
5965
outro_ator.status = DESTRUIDO
6066

@@ -68,14 +74,19 @@ class Porco(Ator):
6874
_caracter_destruido = '+'
6975

7076

77+
class DuploLancamentoExcecao(Exception):
78+
pass
79+
80+
7181
class Passaro(Ator):
7282
velocidade_escalar = None
7383

7484
def __init__(self, x=0, y=0):
7585
"""
7686
Método de inicialização de pássaro.
7787
78-
Deve chamar a inicialização de ator. Além disso, deve armazenar a posição inicial e incializar o tempo de
88+
Deve chamar a inicialização de ator. Além disso, deve armazenar a
89+
posição inicial e incializar o tempo de
7990
lançamento e angulo de lançamento
8091
8192
:param x:
@@ -89,27 +100,33 @@ def __init__(self, x=0, y=0):
89100

90101
def foi_lancado(self):
91102
"""
92-
Método que retorna verdaeira se o pássaro já foi lançado e falso caso contrário
103+
Método que retorna verdadeiro se o pássaro já foi lançado e falso
104+
caso contrário
93105
94106
:return: booleano
95107
"""
96108
return self._tempo_de_lancamento is not None
97109

98110
def colidir_com_chao(self):
99111
"""
100-
Método que executa lógica de colisão com o chão. Toda vez que y for menor ou igual a 0,
101-
o status dos Passaro deve ser alterado para destruido, bem como o seu caracter
112+
Método que executa lógica de colisão com o chão. Toda vez que y for
113+
menor ou igual a 0,
114+
o status dos Passaro deve ser alterado para destruido, bem como o
115+
seu caracter
102116
103117
"""
104118
if self.y <= 0:
105119
self.status = DESTRUIDO
106120

107121
def _calcular_posicao_horizontal(self, delta_t):
108-
self.x = self._x_inicial + self.velocidade_escalar * delta_t * math.cos(self._angulo_de_lancamento)
122+
self.x = self._x_inicial + self.velocidade_escalar * delta_t * \
123+
math.cos(
124+
self._angulo_de_lancamento)
109125

110126
def _calcular_posicao_vertical(self, delta_t):
111127
self.y = (self._y_inicial +
112-
self.velocidade_escalar * delta_t * math.sin(self._angulo_de_lancamento) -
128+
self.velocidade_escalar * delta_t * math.sin(
129+
self._angulo_de_lancamento) -
113130
(GRAVIDADE / 2) * delta_t ** 2)
114131

115132
def _calcular_posicao(self, tempo):
@@ -121,12 +138,16 @@ def calcular_posicao(self, tempo):
121138
"""
122139
Método que cálcula a posição do passaro de acordo com o tempo.
123140
124-
Antes do lançamento o pássaro deve retornar o valor de sua posição inicial
141+
Antes do lançamento o pássaro deve retornar o valor de sua posição
142+
inicial
125143
126-
Depois do lançamento o pássaro deve calcular de acordo com sua posição inicial, velocidade escalar,
127-
ângulo de lancamento, gravidade (constante GRAVIDADE) e o tempo do jogo.
144+
Depois do lançamento o pássaro deve calcular de acordo com sua
145+
posição inicial, velocidade escalar,
146+
ângulo de lancamento, gravidade (constante GRAVIDADE) e o tempo do
147+
jogo.
128148
129-
Após a colisão, ou seja, ter seus status destruido, o pássaro deve apenas retornar a última posição calculada.
149+
Após a colisão, ou seja, ter seus status destruido, o pássaro deve
150+
apenas retornar a última posição calculada.
130151
131152
:param tempo: tempo de jogo a ser calculada a posição
132153
:return: posição x, y
@@ -137,16 +158,18 @@ def calcular_posicao(self, tempo):
137158
self._calcular_posicao(tempo)
138159
return self.x, self.y
139160

140-
141161
def lancar(self, angulo, tempo_de_lancamento):
142162
"""
143-
Lógica que lança o pássaro. Deve armazenar o ângulo e o tempo de lançamento para posteriores cálculo.
163+
Lógica que lança o pássaro. Deve armazenar o ângulo e o tempo de
164+
lançamento para posteriores cálculo.
144165
O ângulo é passado em graus e deve ser transformado em radianos
145166
146167
:param angulo:
147168
:param tempo_de_lancamento:
148169
:return:
149170
"""
171+
if self.foi_lancado():
172+
raise DuploLancamentoExcecao('Pássaro já foi lançado')
150173
self._tempo_de_lancamento = tempo_de_lancamento
151174
self._angulo_de_lancamento = math.radians(angulo)
152175

fase.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22
from itertools import chain
3-
from atores import ATIVO
3+
from atores import ATIVO, DuploLancamentoExcecao
44

55
# Status possíveis do jogo
66

@@ -104,11 +104,14 @@ def lancar(self, angulo, tempo):
104104
Se não houver esse tipo de pássaro, não deve fazer nada
105105
106106
:param angulo: ângulo de lançamento
107-
:param tempo: Tempo de lançamento
107+
:param tempo: tempo de lançamento
108108
"""
109109
for passaro in self._passaros:
110-
if not passaro.foi_lancado():
110+
try:
111111
passaro.lancar(angulo, tempo)
112+
except DuploLancamentoExcecao:
113+
continue
114+
else:
112115
return
113116

114117

testes/atores_testes.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
from __future__ import unicode_literals
44
from unittest.case import TestCase
5-
from atores import Ator, DESTRUIDO, ATIVO, Obstaculo, Porco, PassaroAmarelo, PassaroVermelho
5+
from atores import Ator, DESTRUIDO, ATIVO, Obstaculo, Porco, PassaroAmarelo, PassaroVermelho, \
6+
DuploLancamentoExcecao
67

78

89
class AtorTestes(TestCase):
@@ -206,6 +207,15 @@ def teste_foi_lancado(self):
206207
self.assertTrue(passaro_vermelho.foi_lancado(),
207208
'Se o método lançar foi executado, deve retornar verdadeiro')
208209

210+
def test_excecao_ao_lancar_passaro_pela_segunda_vez(self):
211+
"""Se certifica que pássaro só pode ser lançado uma vez"""
212+
passaro = PassaroVermelho(0,0)
213+
passaro.lancar(0,0)
214+
with self.assertRaises(DuploLancamentoExcecao):
215+
passaro.lancar(1,1)
216+
self.assertEqual(passaro._angulo_de_lancamento,0,'Deveria continuar com angulo passado no primeiro lançamento')
217+
self.assertEqual(passaro._tempo_de_lancamento,0,'Deveria continuar com tempo passado no primeiro lançamento')
218+
209219
def teste_colisao_com_chao(self):
210220
"""
211221
Testando que o passáro colido quando sua posição y é menor ou igual a 0
@@ -229,6 +239,7 @@ def teste_colisao_com_chao(self):
229239

230240

231241
class PassaroAmareloTests(PassaroBaseTests):
242+
232243
"""
233244
Classe de Tests para passaros amarelos
234245
"""
@@ -243,9 +254,10 @@ def teste_status(self):
243254
def teste_velocidade_escalar(self):
244255
self.assertEqual(30, PassaroAmarelo.velocidade_escalar)
245256

257+
246258
def teste_lacamento_vertical(self):
247259
"""
248-
Tests de lançamento vertical. Nele, o passaro só se move verticalmente e sua posição y se matém contanstante
260+
Testes de lançamento vertical. Nele, o passaro só se move verticalmente e sua posição y se matém contanstante
249261
:return:
250262
"""
251263
passaro_amarelo = PassaroAmarelo(1, 1)

0 commit comments

Comments
 (0)