11# -*- coding: utf-8 -*-
22
33from __future__ import unicode_literals
4+
45import math
56
67DESTRUIDO = '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+
7181class 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
0 commit comments