Skip to content

Commit 79b0408

Browse files
committed
Finalizado
1 parent 54a8716 commit 79b0408

5 files changed

Lines changed: 95 additions & 30 deletions

File tree

atores.py

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def calcular_posicao(self, tempo):
3838
:param tempo: o tempo do jogo
3939
:return: posição x, y do ator
4040
"""
41-
return 1, 1
41+
return self.x, self.y
4242

4343
def colidir(self, outro_ator, intervalo=1):
4444
"""
@@ -52,7 +52,11 @@ def colidir(self, outro_ator, intervalo=1):
5252
:param intervalo: Intervalo a ser considerado
5353
:return:
5454
"""
55-
pass
55+
if self.status == ATIVO and outro_ator.status == ATIVO:
56+
delta_x = abs(self.x - outro_ator.x)
57+
delta_y = abs(self.y - outro_ator.y)
58+
if delta_x <= intervalo and delta_y <= intervalo:
59+
self.status = outro_ator.status = DESTRUIDO
5660

5761

5862
class Obstaculo(Ator):
@@ -61,6 +65,7 @@ class Obstaculo(Ator):
6165

6266
class Porco(Ator):
6367
_caracter_ativo = '@'
68+
_caracter_destruido = '+'
6469

6570

6671
class DuploLancamentoExcecao(Exception):
@@ -92,15 +97,16 @@ def foi_lancado(self):
9297
9398
:return: booleano
9499
"""
95-
return True
100+
return not self._tempo_de_lancamento is None
96101

97102
def colidir_com_chao(self):
98103
"""
99104
Método que executa lógica de colisão com o chão. Toda vez que y for menor ou igual a 0,
100105
o status dos Passaro deve ser alterado para destruido, bem como o seu caracter
101106
102107
"""
103-
pass
108+
if self.y <= 0:
109+
self.status = DESTRUIDO
104110

105111
def calcular_posicao(self, tempo):
106112
"""
@@ -116,7 +122,11 @@ def calcular_posicao(self, tempo):
116122
:param tempo: tempo de jogo a ser calculada a posição
117123
:return: posição x, y
118124
"""
119-
return 1, 1
125+
if self._esta_voando():
126+
delta_t = tempo - self._tempo_de_lancamento
127+
self._calcular_posicao_vertical(delta_t)
128+
self._calcular_posicao_horizontal(delta_t)
129+
return super().calcular_posicao(tempo)
120130

121131
def lancar(self, angulo, tempo_de_lancamento):
122132
"""
@@ -127,12 +137,35 @@ def lancar(self, angulo, tempo_de_lancamento):
127137
:param tempo_de_lancamento:
128138
:return:
129139
"""
130-
pass
140+
self._angulo_de_lancamento = math.radians(angulo)
141+
self._tempo_de_lancamento = tempo_de_lancamento
142+
143+
def _calcular_posicao_vertical(self, delta_t):
144+
y_atual = self._y_inicial
145+
angulo_radianos = self._angulo_de_lancamento
146+
y_atual += self.velocidade_escalar * \
147+
delta_t * math.sin(angulo_radianos)
148+
y_atual -= (GRAVIDADE * delta_t ** 2) / 2
149+
self.y = y_atual
150+
151+
def _calcular_posicao_horizontal(self, delta_t):
152+
x_atual = self._x_inicial
153+
angulo_radianos = self._angulo_de_lancamento
154+
x_atual += self.velocidade_escalar * \
155+
delta_t * math.cos(angulo_radianos)
156+
self.x = x_atual
157+
158+
def _esta_voando(self):
159+
return self.foi_lancado() and self.status == ATIVO
131160

132161

133162
class PassaroAmarelo(Passaro):
134-
pass
163+
_caracter_ativo = 'A'
164+
_caracter_destruido = 'a'
165+
velocidade_escalar = 30
135166

136167

137168
class PassaroVermelho(Passaro):
138169
_caracter_ativo = 'V'
170+
_caracter_destruido = 'v'
171+
velocidade_escalar = 20

fase.py

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

4+
from atores import ATIVO
55

66
VITORIA = 'VITORIA'
77
DERROTA = 'DERROTA'
@@ -72,7 +72,12 @@ def status(self):
7272
7373
:return:
7474
"""
75-
return EM_ANDAMENTO
75+
if not self._possui_porco_ativo():
76+
return VITORIA
77+
elif self._possui_passaros_ativos():
78+
return EM_ANDAMENTO
79+
else:
80+
return DERROTA
7681

7782
def lancar(self, angulo, tempo):
7883
"""
@@ -85,7 +90,10 @@ def lancar(self, angulo, tempo):
8590
:param angulo: ângulo de lançamento
8691
:param tempo: Tempo de lançamento
8792
"""
88-
pass
93+
for passaro in self._passaros:
94+
if not passaro.foi_lancado():
95+
passaro.lancar(angulo, tempo)
96+
break
8997

9098
def calcular_pontos(self, tempo):
9199
"""
@@ -96,10 +104,27 @@ def calcular_pontos(self, tempo):
96104
:param tempo: tempo para o qual devem ser calculados os pontos
97105
:return: objeto do tipo Ponto
98106
"""
107+
for passaro in self._passaros:
108+
passaro.calcular_posicao(tempo)
109+
for alvo in self._obstaculos + self._porcos:
110+
passaro.colidir(alvo, self.intervalo_de_colisao)
111+
passaro.colidir_com_chao()
99112
pontos = [self._transformar_em_ponto(
100113
a) for a in self._passaros+self._obstaculos+self._porcos]
101114

102115
return pontos
103116

104117
def _transformar_em_ponto(self, ator):
105118
return Ponto(ator.x, ator.y, ator.caracter())
119+
120+
def _possui_porco_ativo(self):
121+
for porco in self._porcos:
122+
if porco.status == ATIVO:
123+
return True
124+
return False
125+
126+
def _possui_passaros_ativos(self):
127+
for passaro in self._passaros:
128+
if passaro.status == ATIVO:
129+
return True
130+
return False

testes/testes_atores.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def test_caracter(self):
113113
def assert_colisao_atores_ativos(self, ator, ator2, intervalo=1):
114114
"""
115115
Se certifica que há colisão entre atores ativos
116-
Atenção: Esse não é método de teste porque nao se inicia com prefixo "text".
116+
Atenção: Esse não é método de teste porque nao se inicia com prefixo "test".
117117
Ele serve apenas para encapsular toda lógica de teste de colisão entre dois atores ativos
118118
"""
119119
# Conferindo status dos dois atores antes da colisão

testes/testes_fase.py

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

3+
from fase import Fase, Ponto, EM_ANDAMENTO, VITORIA, DERROTA
4+
from atores import (Obstaculo, Porco, PassaroVermelho, PassaroAmarelo,
5+
DESTRUIDO, ATIVO, DuploLancamentoExcecao)
6+
from placa_grafica_tkinter import rodar_fase
37
import os
48
import sys
59
from os import path
@@ -8,18 +12,13 @@
812
project_dir = path.dirname(__file__)
913
project_dir = path.join('..')
1014
sys.path.append(project_dir)
11-
from placa_grafica_tkinter import rodar_fase
1215

1316
project_dir = os.path.join(os.path.dirname(__file__), '..')
1417
project_dir = os.path.normpath(project_dir)
1518
sys.path.append(project_dir)
1619

17-
from atores import (Obstaculo, Porco, PassaroVermelho, PassaroAmarelo,
18-
DESTRUIDO, ATIVO, DuploLancamentoExcecao)
19-
from fase import Fase, Ponto, EM_ANDAMENTO, VITORIA, DERROTA
2020

21-
22-
class AtorFake:
21+
class AtorFake: # Mock
2322
def __init__(self, x=0, y=0):
2423
self.y = y
2524
self.x = x
@@ -113,7 +112,7 @@ def teste_acabou_com_porcos_e_passaros(self):
113112

114113
self.assertEqual(EM_ANDAMENTO, fase.status())
115114

116-
for ator in porcos + passaros:
115+
for ator in porcos + passaros: # concatenação listas
117116
ator.status = DESTRUIDO
118117
self.assertEqual(VITORIA, fase.status())
119118

testes/testes_integracao.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
# -*- coding: utf-8 -*-
2+
from fase import Fase, Ponto, EM_ANDAMENTO, VITORIA, DERROTA
3+
from atores import Obstaculo, Porco, PassaroVermelho, PassaroAmarelo, DESTRUIDO, ATIVO, \
4+
Ator, Passaro
5+
from placa_grafica_tkinter import rodar_fase
26
from itertools import chain
37

48
import os
@@ -10,21 +14,18 @@
1014
project_dir = path.dirname(__file__)
1115
project_dir = path.join('..')
1216
sys.path.append(project_dir)
13-
from placa_grafica_tkinter import rodar_fase
1417

1518
project_dir = os.path.join(os.path.dirname(__file__), '..')
1619
project_dir = os.path.normpath(project_dir)
1720
sys.path.append(project_dir)
1821

19-
from atores import Obstaculo, Porco, PassaroVermelho, PassaroAmarelo, DESTRUIDO, ATIVO, \
20-
Ator, Passaro
21-
from fase import Fase, Ponto, EM_ANDAMENTO, VITORIA, DERROTA
2222

2323
class FaseTestes(TestCase):
2424
def teste_acabou_com_porcos_e_passaros(self):
2525
fase = Fase()
2626
porcos = [Porco(1, 1) for i in range(2)] # criando 2 porcos
27-
passaros = [PassaroAmarelo(1, 1) for i in range(2)] # criando 2 pássaros
27+
passaros = [PassaroAmarelo(1, 1)
28+
for i in range(2)] # criando 2 pássaros
2829
fase.adicionar_porco(*porcos)
2930
fase.adicionar_passaro(*passaros)
3031

@@ -37,10 +38,12 @@ def teste_acabou_com_porcos_e_passaros(self):
3738
self.assertEqual(VITORIA, fase.status())
3839

3940
fase.adicionar_obstaculo(Obstaculo())
40-
self.assertEqual(VITORIA, fase.status(), 'Obstáculo não interfere no fim do jogo')
41+
self.assertEqual(VITORIA, fase.status(),
42+
'Obstáculo não interfere no fim do jogo')
4143

4244
fase.adicionar_porco(Porco())
43-
self.assertEqual(DERROTA, fase.status(), 'Com Porco ativo e sem pássaro para lançar, o jogo deveria acabar')
45+
self.assertEqual(DERROTA, fase.status(
46+
), 'Com Porco ativo e sem pássaro para lançar, o jogo deveria acabar')
4447

4548
fase.adicionar_passaro(PassaroAmarelo())
4649
self.assertEqual(EM_ANDAMENTO, fase.status(),
@@ -78,21 +81,25 @@ def teste_status(self):
7881
'Sem porco ativo, o jogo deveria acabar com vitória')
7982

8083
def teste_lancar_passaro_sem_erro_quando_nao_existe_passaro(self):
81-
passaro_vermelho, passaro_amarelo = PassaroVermelho(1, 1), PassaroAmarelo(1, 1)
84+
passaro_vermelho, passaro_amarelo = PassaroVermelho(
85+
1, 1), PassaroAmarelo(1, 1)
8286
fase = Fase()
8387
fase.adicionar_passaro(passaro_vermelho, passaro_amarelo)
8488
self.assertFalse(passaro_vermelho.foi_lancado())
8589
self.assertFalse(passaro_amarelo.foi_lancado())
8690
fase.lancar(90, 1)
8791
fase.lancar(45, 3)
88-
fase.lancar(31, 5) # testando que lançar passaros depios de todos lançados não causa erro
92+
# testando que lançar passaros depios de todos lançados não causa erro
93+
fase.lancar(31, 5)
8994

9095
self.assertTrue(passaro_vermelho.foi_lancado())
91-
self.assertEqual(math.radians(90), passaro_vermelho._angulo_de_lancamento)
96+
self.assertEqual(math.radians(
97+
90), passaro_vermelho._angulo_de_lancamento)
9298
self.assertEqual(1, passaro_vermelho._tempo_de_lancamento)
9399

94100
self.assertTrue(passaro_amarelo.foi_lancado())
95-
self.assertEqual(math.radians(45), passaro_amarelo._angulo_de_lancamento)
101+
self.assertEqual(math.radians(
102+
45), passaro_amarelo._angulo_de_lancamento)
96103
self.assertEqual(3, passaro_amarelo._tempo_de_lancamento)
97104

98105
def teste_intervalo_de_colisao_padrão(self):
@@ -174,7 +181,8 @@ def criar_fase_exemplo(multiplicador=1):
174181
passaros = [PassaroVermelho(3 * multiplicador, 3 * multiplicador),
175182
PassaroAmarelo(3 * multiplicador, 3 * multiplicador),
176183
PassaroAmarelo(3 * multiplicador, 3 * multiplicador)]
177-
porcos = [Porco(78 * multiplicador, multiplicador), Porco(70 * multiplicador, multiplicador)]
184+
porcos = [Porco(78 * multiplicador, multiplicador),
185+
Porco(70 * multiplicador, multiplicador)]
178186
obstaculos = [Obstaculo(31 * multiplicador, 10 * multiplicador)]
179187

180188
fase_exemplo.adicionar_passaro(*passaros)

0 commit comments

Comments
 (0)