Skip to content

Commit c65bab5

Browse files
committed
Implementaćão do jogo completo
1 parent d2a19fc commit c65bab5

8 files changed

Lines changed: 115 additions & 27 deletions

File tree

atores.py

Lines changed: 40 additions & 11 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,16 +52,20 @@ def colidir(self, outro_ator, intervalo=1):
5252
:param intervalo: Intervalo a ser considerado
5353
:return:
5454
"""
55-
pass
56-
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
5760

5861

5962
class Obstaculo(Ator):
60-
pass
63+
_caracter_ativo = 'O'
6164

6265

6366
class Porco(Ator):
64-
pass
67+
_caracter_ativo = '@'
68+
_caracter_destruido = '+'
6569

6670

6771
class DuploLancamentoExcecao(Exception):
@@ -93,15 +97,16 @@ def foi_lancado(self):
9397
9498
:return: booleano
9599
"""
96-
return True
100+
return not self._tempo_de_lancamento is None
97101

98102
def colidir_com_chao(self):
99103
"""
100104
Método que executa lógica de colisão com o chão. Toda vez que y for menor ou igual a 0,
101105
o status dos Passaro deve ser alterado para destruido, bem como o seu caracter
102106
103107
"""
104-
pass
108+
if self.y <= 0 :
109+
self.status = DESTRUIDO
105110

106111
def calcular_posicao(self, tempo):
107112
"""
@@ -117,8 +122,13 @@ def calcular_posicao(self, tempo):
117122
:param tempo: tempo de jogo a ser calculada a posição
118123
:return: posição x, y
119124
"""
120-
return 1, 1
121125

126+
if self.foi_lancado() and self.status == ATIVO:
127+
delta_t = tempo - self._tempo_de_lancamento
128+
self._calcular_posicao_vertical(delta_t)
129+
self._calcular_posicao_horizontal(delta_t)
130+
131+
return super().calcular_posicao(tempo)
122132

123133
def lancar(self, angulo, tempo_de_lancamento):
124134
"""
@@ -129,12 +139,31 @@ def lancar(self, angulo, tempo_de_lancamento):
129139
:param tempo_de_lancamento:
130140
:return:
131141
"""
132-
pass
142+
self._angulo_de_lancamento = math.radians(angulo)
143+
self._tempo_de_lancamento = tempo_de_lancamento
144+
145+
def _calcular_posicao_vertical(self, delta_t):
146+
y_atual = self._y_inicial
147+
angulo_radianos = self._angulo_de_lancamento
148+
y_atual += self.velocidade_escalar * delta_t * math.sin(angulo_radianos)
149+
# gravidade
150+
y_atual -= (GRAVIDADE * delta_t ** 2) / 2
151+
self.y = y_atual
152+
153+
def _calcular_posicao_horizontal(self, delta_t):
154+
x_atual = self._x_inicial
155+
angulo_radianos = self._angulo_de_lancamento
156+
x_atual += self.velocidade_escalar * delta_t * math.cos(angulo_radianos)
157+
self.x = x_atual
133158

134159

135160
class PassaroAmarelo(Passaro):
136-
pass
161+
velocidade_escalar = 30
162+
_caracter_ativo = 'A'
163+
_caracter_destruido = 'a'
137164

138165

139166
class PassaroVermelho(Passaro):
140-
pass
167+
velocidade_escalar = 20
168+
_caracter_ativo = 'V'
169+
_caracter_destruido = 'v'

fase.py

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,23 @@ def adicionar_obstaculo(self, *obstaculos):
4343
4444
:param obstaculos:
4545
"""
46-
pass
46+
self._obstaculos.extend(obstaculos)
4747

4848
def adicionar_porco(self, *porcos):
4949
"""
5050
Adiciona porcos em uma fase
5151
5252
:param porcos:
5353
"""
54-
pass
54+
self._porcos.extend(porcos)
5555

5656
def adicionar_passaro(self, *passaros):
5757
"""
5858
Adiciona pássaros em uma fase
5959
6060
:param passaros:
6161
"""
62-
pass
62+
self._passaros.extend(passaros)
6363

6464
def status(self):
6565
"""
@@ -73,7 +73,15 @@ def status(self):
7373
7474
:return:
7575
"""
76-
return EM_ANDAMENTO
76+
if not self._possui_porco_ativo():
77+
return VITORIA
78+
elif self._possui_passaros_ativos():
79+
return EM_ANDAMENTO
80+
else:
81+
return DERROTA
82+
83+
84+
return VITORIA
7785

7886
def lancar(self, angulo, tempo):
7987
"""
@@ -86,7 +94,11 @@ def lancar(self, angulo, tempo):
8694
:param angulo: ângulo de lançamento
8795
:param tempo: Tempo de lançamento
8896
"""
89-
pass
97+
for passaro in self._passaros:
98+
if not passaro.foi_lancado():
99+
passaro.lancar(angulo, tempo)
100+
break
101+
90102

91103

92104
def calcular_pontos(self, tempo):
@@ -98,10 +110,27 @@ def calcular_pontos(self, tempo):
98110
:param tempo: tempo para o qual devem ser calculados os pontos
99111
:return: objeto do tipo Ponto
100112
"""
113+
for passaro in self._passaros:
114+
passaro.calcular_posicao(tempo)
115+
for alvo in self._obstaculos+self._porcos:
116+
passaro.colidir(alvo, self.intervalo_de_colisao)
117+
passaro.colidir_com_chao()
101118
pontos=[self._transformar_em_ponto(a) for a in self._passaros+self._obstaculos+self._porcos]
102119

103120
return pontos
104121

105122
def _transformar_em_ponto(self, ator):
106123
return Ponto(ator.x, ator.y, ator.caracter())
107124

125+
def _possui_porco_ativo(self):
126+
for porco in self._porcos:
127+
if porco.status==ATIVO:
128+
return True
129+
return False
130+
131+
def _possui_passaros_ativos(self):
132+
for passaro in self._passaros:
133+
if passaro.status==ATIVO:
134+
return True
135+
return False
136+

oo/carro.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
'Oeste'
9595
"""
9696

97+
9798
class Motor:
9899
def __init__(self, velocidade=0):
99100
self.velocidade = velocidade
@@ -102,15 +103,24 @@ def acelerar(self):
102103
self.velocidade += 1
103104

104105
def frear(self):
105-
if self.velocidade > 2:
106-
self.velocidade -= 2
107-
else:
108-
self.velocidade = 0
106+
# if self.velocidade > 2:
107+
# self.velocidade -= 2
108+
# else:
109+
# self.velocidade = 0
110+
self.velocidade -= 2
111+
self.velocidade = max(0, self.velocidade)
112+
113+
114+
NORTE = 'Norte'
115+
LESTE = 'Leste'
116+
SUL = 'Sul'
117+
OESTE = 'Oeste'
109118

110119

111120
class Direcao:
112-
direcoes = ['Norte', 'Leste', 'Sul', 'Oeste']
113-
def __init__(self, direcao=0 ):
121+
direcoes = [NORTE, LESTE, SUL, OESTE]
122+
123+
def __init__(self, direcao=0):
114124
self.direcao = direcao
115125
self.valor = Direcao.direcoes[self.direcao]
116126

@@ -128,11 +138,10 @@ def girar_a_esquerda(self):
128138
if self.direcao > 0:
129139
self.direcao -= 1
130140
else:
131-
self.direcao = len(Direcao.direcoes)-1
141+
self.direcao = len(Direcao.direcoes) - 1
132142
self.valor = Direcao.direcoes[self.direcao]
133143

134144

135-
136145
class Carro:
137146
def __init__(self, direcao, motor):
138147
self.direcao = direcao
@@ -154,4 +163,4 @@ def girar_a_direita(self):
154163
self.direcao.girar_a_direita()
155164

156165
def calcular_direcao(self):
157-
return self.direcao.valor
166+
return self.direcao.valor

oo/pessoa.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@ def metodo_estatico():
1717
def nome_e_atributos_de_classe(cls):
1818
return f'{cls} - olhos {cls.olhos}'
1919

20+
class Homem(Pessoa):
21+
pass
22+
23+
2024
if __name__ == '__main__':
21-
renzo = Pessoa(nome='Renzo')
25+
renzo = Homem(nome='Renzo')
2226
luciano = Pessoa(renzo, nome='Luciano')
2327
print(Pessoa.cumprimentar(luciano))
2428
print(id(luciano))
@@ -39,4 +43,9 @@ def nome_e_atributos_de_classe(cls):
3943
print(luciano.olhos)
4044
print(renzo.olhos)
4145
print(Pessoa.metodo_estatico(),luciano.metodo_estatico())
42-
print(Pessoa.nome_e_atributos_de_classe(),luciano.nome_e_atributos_de_classe())
46+
print(Pessoa.nome_e_atributos_de_classe(),luciano.nome_e_atributos_de_classe())
47+
pessoa = Pessoa('Anonimo')
48+
print(isinstance(pessoa, Pessoa))
49+
print(isinstance(pessoa, Homem))
50+
print(isinstance(renzo, Pessoa))
51+
print(isinstance(renzo, Homem))

oo/teste_carro.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from unittest import TestCase
2+
from oo.carro import Motor
3+
4+
class CarroTestCase(TestCase):
5+
def teste_velocidade_inicial(self):
6+
motor = Motor()
7+
self.assertEqual(0, motor.velocidade)
8+
9+
def teste_acelerar(self):
10+
motor = Motor()
11+
motor.acelerar()
12+
self.assertEqual(1, motor.velocidade)

0 commit comments

Comments
 (0)