Skip to content

Commit e26869e

Browse files
author
renzon
committed
Retornando com solução que tinha sido removida pelo merge
1 parent 4c08138 commit e26869e

3 files changed

Lines changed: 97 additions & 22 deletions

File tree

.gitignore

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ coverage.xml
4343
.pydevproject
4444
.idea
4545

46-
# Floobits
47-
48-
.floorc.json
49-
5046
# Rope
5147
.ropeproject
5248

atores.py

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

4242
def colidir(self, outro_ator, intervalo=1):
4343
"""
@@ -51,20 +51,25 @@ def colidir(self, outro_ator, intervalo=1):
5151
:param intervalo: Intervalo a ser considerado
5252
:return:
5353
"""
54-
pass
54+
if self.status == DESTRUIDO or outro_ator.status == DESTRUIDO:
55+
return
5556

57+
if self.x - intervalo <= outro_ator.x <= self.x + intervalo and self.y - intervalo <= outro_ator.y <= self.y + intervalo:
58+
self.status = DESTRUIDO
59+
outro_ator.status = DESTRUIDO
5660

5761

5862
class Obstaculo(Ator):
59-
pass
63+
_caracter_ativo = 'O'
6064

6165

6266
class Porco(Ator):
63-
pass
67+
_caracter_ativo = '@'
68+
_caracter_destruido = '+'
6469

6570

6671
class Passaro(Ator):
67-
velocidade_escalar = 10
72+
velocidade_escalar = None
6873

6974
def __init__(self, x=0, y=0):
7075
"""
@@ -88,15 +93,29 @@ def foi_lancado(self):
8893
8994
:return: booleano
9095
"""
91-
return True
96+
return self._tempo_de_lancamento is not None
9297

9398
def colidir_com_chao(self):
9499
"""
95100
Método que executa lógica de colisão com o chão. Toda vez que y for menor ou igual a 0,
96101
o status dos Passaro deve ser alterado para destruido, bem como o seu caracter
97102
98103
"""
99-
pass
104+
if self.y <= 0:
105+
self.status = DESTRUIDO
106+
107+
def _calcular_posicao_horizontal(self, delta_t):
108+
self.x = self._x_inicial + self.velocidade_escalar * delta_t * math.cos(self._angulo_de_lancamento)
109+
110+
def _calcular_posicao_vertical(self, delta_t):
111+
self.y = (self._y_inicial +
112+
self.velocidade_escalar * delta_t * math.sin(self._angulo_de_lancamento) -
113+
(GRAVIDADE / 2) * delta_t ** 2)
114+
115+
def _calcular_posicao(self, tempo):
116+
delta_t = tempo - self._tempo_de_lancamento
117+
self._calcular_posicao_vertical(delta_t)
118+
self._calcular_posicao_horizontal(delta_t)
100119

101120
def calcular_posicao(self, tempo):
102121
"""
@@ -112,7 +131,11 @@ def calcular_posicao(self, tempo):
112131
:param tempo: tempo de jogo a ser calculada a posição
113132
:return: posição x, y
114133
"""
115-
return 1, 1
134+
if self._tempo_de_lancamento is None:
135+
return self._x_inicial, self._y_inicial
136+
if self.status == ATIVO:
137+
self._calcular_posicao(tempo)
138+
return self.x, self.y
116139

117140

118141
def lancar(self, angulo, tempo_de_lancamento):
@@ -124,12 +147,23 @@ def lancar(self, angulo, tempo_de_lancamento):
124147
:param tempo_de_lancamento:
125148
:return:
126149
"""
127-
pass
150+
self._tempo_de_lancamento = tempo_de_lancamento
151+
self._angulo_de_lancamento = math.radians(angulo)
152+
153+
def _aguardando_lancamento(self, tempo):
154+
return not self.foi_lancado() or tempo < self._tempo_de_lancamento
155+
156+
def _ja_colidiu(self):
157+
return self.foi_lancado() and self.status() == DESTRUIDO
128158

129159

130160
class PassaroAmarelo(Passaro):
131-
pass
161+
velocidade_escalar = 30 # m/s
162+
_caracter_ativo = 'A'
163+
_caracter_destruido = 'a'
132164

133165

134166
class PassaroVermelho(Passaro):
135-
pass
167+
velocidade_escalar = 20 # m/s
168+
_caracter_ativo = 'V'
169+
_caracter_destruido = 'v'

fase.py

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from itertools import chain
33
from atores import ATIVO
44

5+
# Status possíveis do jogo
56

67
VITORIA = 'VITORIA'
78
DERROTA = 'DERROTA'
@@ -36,30 +37,45 @@ def __init__(self, intervalo_de_colisao=1):
3637
self._porcos = []
3738
self._obstaculos = []
3839

40+
def _adicionar_ator(self, lista, *atores):
41+
lista.extend(atores)
3942

4043
def adicionar_obstaculo(self, *obstaculos):
4144
"""
4245
Adiciona obstáculos em uma fase
4346
4447
:param obstaculos:
4548
"""
46-
pass
49+
self._adicionar_ator(self._obstaculos, *obstaculos)
4750

4851
def adicionar_porco(self, *porcos):
4952
"""
5053
Adiciona porcos em uma fase
5154
5255
:param porcos:
5356
"""
54-
pass
57+
self._adicionar_ator(self._porcos, *porcos)
5558

5659
def adicionar_passaro(self, *passaros):
5760
"""
5861
Adiciona pássaros em uma fase
5962
6063
:param passaros:
6164
"""
62-
pass
65+
self._adicionar_ator(self._passaros, *passaros)
66+
67+
# def acabou(self):
68+
# """
69+
# Método que retorna verdadeiro se o jogo acabou e falso caso contrário
70+
#
71+
# O jogo pode acabar por dois motivos:
72+
#
73+
# 1. Não existem mais porcos ativos no jogo
74+
# 2. Não existem mais pássaros ativos no jogo
75+
#
76+
# :return: booleano
77+
# """
78+
# return self.status() != EM_ANDAMENTO
6379

6480
def status(self):
6581
"""
@@ -73,7 +89,11 @@ def status(self):
7389
7490
:return:
7591
"""
76-
return EM_ANDAMENTO
92+
if not self._existe_porco_ativo():
93+
return VITORIA
94+
if self._existe_passaro_ativo():
95+
return EM_ANDAMENTO
96+
return DERROTA
7797

7898
def lancar(self, angulo, tempo):
7999
"""
@@ -86,7 +106,10 @@ def lancar(self, angulo, tempo):
86106
:param angulo: ângulo de lançamento
87107
:param tempo: Tempo de lançamento
88108
"""
89-
pass
109+
for passaro in self._passaros:
110+
if not passaro.foi_lancado():
111+
passaro.lancar(angulo, tempo)
112+
return
90113

91114

92115
def calcular_pontos(self, tempo):
@@ -98,10 +121,32 @@ def calcular_pontos(self, tempo):
98121
:param tempo: tempo para o qual devem ser calculados os pontos
99122
:return: objeto do tipo Ponto
100123
"""
101-
pontos=[]
102-
124+
pontos = [self._calcular_ponto_de_passaro(p, tempo) for p in self._passaros]
125+
obstaculos_e_porcos = chain(self._obstaculos, self._porcos)
126+
pontos.extend([self._transformar_em_ponto(ator) for ator in obstaculos_e_porcos])
103127
return pontos
104128

105129
def _transformar_em_ponto(self, ator):
106130
return Ponto(ator.x, ator.y, ator.caracter())
107131

132+
def _calcular_ponto_de_passaro(self, passaro, tempo, ):
133+
passaro.calcular_posicao(tempo)
134+
for ator in chain(self._obstaculos, self._porcos):
135+
if ATIVO == passaro.status:
136+
passaro.colidir(ator, self.intervalo_de_colisao)
137+
passaro.colidir_com_chao()
138+
else:
139+
break
140+
return self._transformar_em_ponto(passaro)
141+
142+
def _existe_porco_ativo(self):
143+
return self._verificar_se_existe_ator_ativo(self._porcos)
144+
145+
def _verificar_se_existe_ator_ativo(self, atores):
146+
for a in atores:
147+
if a.status == ATIVO:
148+
return True
149+
return False
150+
151+
def _existe_passaro_ativo(self):
152+
return self._verificar_se_existe_ator_ativo(self._passaros)

0 commit comments

Comments
 (0)