-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTerrain.py
189 lines (135 loc) · 4.78 KB
/
Terrain.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# -*- coding: utf-8 -*-
"""
Module implémentant les différents terrains utilisés lors de la simulation
d'un terrain.
"""
from abc import ABC, abstractmethod
import random as rnd
from dprint import dprint
class Terrain(ABC):
"""
Créé un case de type Terrain et la rattache à l'écosystème passé en
paramètres
Paramètres
----------
circuit: Circuit
L'instance de circuit gérant la simulation à laquelle le terrain va
se rattacher.
coords: tuple
Abscisse et ordonnée de la case dans la simulation
Notes
-----
La classe Terrain étant abstraite ce sont ses classes filles qui doivent
être instanciées.
"""
Impact_sante_defaut = -1
def __init__(self,circuit, coords,numeroWayPoint):
self._circuit = circuit
self.__coords = coords
self.impact_sante = self.Impact_sante_defaut
self.numeroWayPoint=numeroWayPoint
@property
def impact_sante(self):
"""
impact_sante: float
Chaque terrain modifie, en positif ou négatif, la santé de l'animal
qui se trouve dessus suivant la règle suivante:
'sante_animal += impact_sante''
"""
return self.__impact_sante
@impact_sante.setter
def impact_sante(self, impact_sante):
self.__impact_sante = impact_sante
@property
def coords(self):
"""
coords: tuple
les coordonnées de la case dans la simulation en cours.
Notes
-----
Cet attribut est en lecture seule, les coordonnées d'un terrain
n'ont pas vocation à être modifiées en cours de simulation. Si
besoin il faut instancier un nouveau terrain pour remplacer
l'ancien.
"""
return self.__coords
@abstractmethod
def action(self,Vehicule):
"""
Lorsqu'un véhicule se positionne sur un terrain ce dernier peut avoir
une influence sur le circuit en question.
Paramètres
----------
véhicule: Vehicule
le véhicule qui viste la case courante
Renvoie
-------
Rien
"""
pass
def getCaractere(self):
return 'T'
class Herbe(Terrain):
"""
Une case ''Nourriture'' permet à chaque véhicule qui la visite de
retrouver trois points de carburant,
"""
Impact_sante_defaut = -1.5
def __init__(self, circuit, coords,numeroWayPoint):
super().__init__(circuit, coords,numeroWayPoint)
self.__stock = rnd.randint(1,10)
def action(self,vehicule):
vehicule.reservoir += self.impact_sante
def getCaractere(self):
return 'H'
class Mur(Terrain):
"""
Une case ''Mur '' qui es infranchissable,
"""
def __init__(self,circuit, coords,numeroWayPoint):
super().__init__(circuit,coords,numeroWayPoint)
def action(self,vehicule):
vehicule.reservoir += self.impact_sante
def getCaractere(self):
return 'M'
class Carburant(Terrain):
"""
Une case ''Carburant'' permet à chaque véhicule qui la visite de
retrouver trois points de carburant,
"""
Impact_sante_defaut = +50
def __init__(self,circuit, coords,numeroWayPoint):
super().__init__(circuit, coords,numeroWayPoint)
self.__stock =100# rnd.randint(1,10)
def getCaractere(self):
return 'C'
def action(self, vehicule):
if self.__stock:
self.__stock -= 1
vehicule.reservoir+= self.impact_sante
else:
#self._ecosysteme.cases_besoin_maj.append(self.coords)
dprint("une case de carburant vidée par " + str(vehicule))
class Goudron(Terrain):
"""
Une case ''Goudron qui peut être un élément du chemin''
"""
Impact_sante_defaut = -1.25
def __init__(self,circuit,coords,numeroWayPoint):
super().__init__(circuit, coords,numeroWayPoint)
self.__stock = rnd.randint(1,10)
def action(self,vehicule):
vehicule.reservoir += self.impact_sante
def getCaractere(self):
return 'G'
class Moule(Terrain):
"""
Une case ''Goudron qui peut être un élément du chemin''
"""
Impact_sante_defaut = -1
def __init__(self,circuit,coords,numeroWayPoint):
super().__init__(circuit, coords,numeroWayPoint)
def action(self,vehicule):
vehicule.sante += self.impact_sante
def getCaractere(self):
return 'O'