Skip to content

Commit 4bdc9f0

Browse files
author
renzon
committed
Refactoring para tornar objetos stateles, todos dependentes de tempo
1 parent 38a1e83 commit 4bdc9f0

File tree

3 files changed

+68
-62
lines changed

3 files changed

+68
-62
lines changed

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ Classe base para todos os atores do jogo.
1717

1818
### Método calcular_posicao
1919

20-
Método que recebe o tempo (float) como parâmetro e retorna uma tupla com 3 elementos, posição horizontal (x), posição
21-
vertical (y) e sinal a ser exibido em tela (caracter).
20+
Método que recebe o tempo (float) como parâmetro e retorna uma tupla com 2 elementos, posição horizontal (x) como
21+
primeiro elemento e posição vertical (y) como segundo
2222

23-
x e y devem ser números inteiros. Devem ser aproximados utilizando lógica de arredondamento.
23+
### Método Status
2424

25-
### Status
25+
O ator possui os status Ativo e Destruido. Além disso o status deve ser dependente do tempo. Ou seja, se o ator foi
26+
destruido no tempo t, ele deve possuir status ativo antes desse tempo e Destruido após esse tempo.
27+
2628

27-
O ator possui os status Ativo e Destruido. Quando destruido, o caracter the apresentação quando for calculada a posição
28-
deve ser "✝".
29+
## Método sinal
2930

30-
Além disso o status deve ser dependente do tempo. Ou seja, se o ator foi destruido no tempo t, ele deve possuir status
31-
ativo antes desse tempo e Destruido após esse tempo.
31+
O método sinal retorna 'A' quando o ator tem status Ativo e '✝' caso contrário.
3232

3333
### Método colidir
3434

atores.py

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,44 +7,49 @@
77

88

99
class Ator():
10-
caracter = 'A'
10+
_tempo_de_colisao = None
11+
_caracter_ativo = 'A'
12+
_caracter_destruido = '✝'
13+
14+
def caracter(self, tempo):
15+
if self.status(tempo) == ATIVO:
16+
return self._caracter_ativo
17+
else:
18+
return self._caracter_destruido
1119

1220
def __init__(self, x=0, y=0):
1321
self.y = y
1422
self.x = x
15-
self.status = ATIVO
1623

17-
def ponto_cartesiano_inteiro(self):
18-
return round(self.x), round(self.y)
24+
def status(self, tempo):
25+
if self._tempo_de_colisao is None or self._tempo_de_colisao > tempo:
26+
return ATIVO
27+
return DESTRUIDO
1928

2029
def calcular_posicao(self, tempo):
21-
caracter = self.caracter if self.status == ATIVO else '✝'
22-
x, y = self.ponto_cartesiano_inteiro()
23-
return x, y, caracter
30+
return self.arredondar_posicao()
31+
32+
def arredondar_posicao(self):
33+
return round(self.x), round(self.y)
2434

25-
def colidir(self, outro_ator):
26-
if self.status == DESTRUIDO or outro_ator.status == DESTRUIDO:
27-
return False
28-
x1, y1 = self.ponto_cartesiano_inteiro()
29-
x2, y2 = outro_ator.ponto_cartesiano_inteiro()
35+
def colidir(self, outro_ator, tempo):
36+
if self.status(tempo) == DESTRUIDO or outro_ator.status(tempo) == DESTRUIDO:
37+
return
38+
x1, y1 = self.arredondar_posicao()
39+
x2, y2 = outro_ator.arredondar_posicao()
3040

3141
def esta_no_intervalo(coordenada1, coordenada2, intervalo=1):
3242
coordenadas = sorted([coordenada1, coordenada2])
3343
return coordenadas[1] - intervalo <= coordenadas[0]
3444

3545
if esta_no_intervalo(x1, x2) and esta_no_intervalo(y1, y2):
36-
self.status = DESTRUIDO
37-
outro_ator.status = DESTRUIDO
38-
return True
39-
return False
46+
self._tempo_de_colisao = tempo
47+
outro_ator._tempo_de_colisao = tempo
4048

4149

4250
class Obstaculo(Ator):
43-
caracter = 'O'
44-
45-
def calcular_posicao(self, tempo):
46-
x, y, caracter = super().calcular_posicao(tempo)
47-
return x, y, ' ' if self.status == DESTRUIDO else caracter
51+
_caracter_ativo = 'O'
52+
_caracter_destruido = ' '
4853

4954

5055

testes/atores_testes.py

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@
55
from atores import Ator, DESTRUIDO, ATIVO, Obstaculo
66

77

8+
def assert_ator_status(test_case, ator, caracter_status_ativo, carater_status_destruido):
9+
test_case.assertEqual(ATIVO, ator.status(0))
10+
test_case.assertEqual(caracter_status_ativo, ator.caracter(0))
11+
ator.colidir(ator, 3.2)
12+
test_case.assertEqual(ATIVO, ator.status(3.1))
13+
test_case.assertEqual(caracter_status_ativo, ator.caracter(3.1))
14+
test_case.assertEqual(DESTRUIDO, ator.status(3.2))
15+
test_case.assertEqual(carater_status_destruido, ator.caracter(3.2))
16+
test_case.assertEqual(DESTRUIDO, ator.status(4))
17+
test_case.assertEqual(carater_status_destruido, ator.caracter(4))
18+
19+
820
class AtorTestes(TestCase):
921
def teste_ator_posicao(self):
1022
ator = Ator()
@@ -14,25 +26,19 @@ def teste_ator_posicao(self):
1426
ator = Ator(0.6, 2.1)
1527
self.assertTupleEqual((1, 2), ator.calcular_posicao(3.14))
1628

17-
def teste_status(self):
18-
ator = Ator()
19-
self.assertEqual(ATIVO, ator.status)
20-
self.assertEqual('A', ator.calcular_posicao(0)[2])
21-
ator.status = DESTRUIDO
22-
self.assertEqual('✝', ator.calcular_posicao(0)[2])
23-
self.assertEqual(ATIVO, Ator().status)
24-
2529
def assert_colisao_atores_ativos(self, ator, ator2):
26-
self.assertEqual(ator.status, ATIVO)
27-
self.assertEqual(ator2.status, ATIVO)
28-
self.assertTrue(ator.colidir(ator2))
29-
self.assertEqual(ator2.status, DESTRUIDO)
30-
self.assertEqual(ator.status, DESTRUIDO)
30+
tempo_da_colisao = 2
31+
self.assertEqual(ator.status(tempo_da_colisao), ATIVO)
32+
self.assertEqual(ator2.status(tempo_da_colisao), ATIVO)
33+
ator.colidir(ator2, tempo_da_colisao)
34+
self.assertEqual(ator2.status(tempo_da_colisao), DESTRUIDO)
35+
self.assertEqual(ator.status(tempo_da_colisao), DESTRUIDO)
3136

3237
def assert_nao_colisao(self, ator, ator2):
33-
status_iniciais = [ator.status, ator2.status]
34-
self.assertFalse(ator.colidir(ator2))
35-
self.assertListEqual(status_iniciais, [ator.status, ator2.status])
38+
tempo_da_colisao = 2
39+
status_iniciais = [ator.status(tempo_da_colisao), ator2.status(tempo_da_colisao)]
40+
ator.colidir(ator2, tempo_da_colisao)
41+
self.assertListEqual(status_iniciais, [ator.status(tempo_da_colisao), ator2.status(tempo_da_colisao)])
3642

3743
def teste_colisao_entre_atores_ativos(self):
3844
ator = Ator(2, 2)
@@ -59,7 +65,7 @@ def teste_nao_colisao_entre_atores_ativos(self):
5965

6066
def teste_colisao_somente_um_ator_destruido(self):
6167
ator = Ator(2, 2)
62-
ator.status = DESTRUIDO
68+
ator.colidir(ator,0)
6369
ator2 = Ator(2, 2)
6470
self.assert_nao_colisao(ator, ator2)
6571
self.assert_nao_colisao(Ator(2, 3), ator)
@@ -80,28 +86,23 @@ def teste_colisao_somente_um_ator_destruido(self):
8086
self.assert_nao_colisao(Ator(1, 2), ator)
8187
self.assert_nao_colisao(Ator(1, 3), ator)
8288

83-
def teste_status_dependete_de_tempo(self):
89+
def teste_status(self):
8490
ator = Ator()
85-
ator2 = Ator()
86-
87-
self.assertEqual(ATIVO, ator.status)
88-
ator.colidir(ator2, 3.2)
89-
self.assertEqual('A', ator.calcular_posicao(0)[2])
90-
self.assertEqual(ATIVO,ator.status)
91-
self.assertEqual('A', ator.calcular_posicao(3.1)[2])
92-
self.assertEqual(ATIVO,ator.status)
93-
self.assertEqual('✝', ator.calcular_posicao(3.2)[2])
94-
self.assertEqual(ATIVO, Ator().status)
91+
assert_ator_status(self, ator, 'A', '✝')
9592

9693

9794
class ObstaculoTestes(TestCase):
9895
def teste_status(self):
9996
obstaculo = Obstaculo()
100-
self.assertEqual(ATIVO, obstaculo.status)
101-
self.assertEqual('O', obstaculo.calcular_posicao(0)[2])
102-
obstaculo.status = DESTRUIDO
103-
self.assertEqual(' ', obstaculo.calcular_posicao(0)[2])
104-
self.assertEqual(ATIVO, Ator().status)
97+
self.assertEqual(ATIVO, obstaculo.status(0))
98+
self.assertEqual('O', obstaculo.caracter(0))
99+
obstaculo.colidir(obstaculo, 3.2)
100+
self.assertEqual(ATIVO, obstaculo.status(3.1))
101+
self.assertEqual('O', obstaculo.caracter(3.1))
102+
self.assertEqual(DESTRUIDO, obstaculo.status(3.2))
103+
self.assertEqual(' ', obstaculo.caracter(3.2))
104+
self.assertEqual(DESTRUIDO, obstaculo.status(4))
105+
self.assertEqual(' ', obstaculo.caracter(4))
105106

106107

107108

0 commit comments

Comments
 (0)