-
Notifications
You must be signed in to change notification settings - Fork 2
/
Player.py
243 lines (209 loc) · 11.7 KB
/
Player.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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#################################################################################
##
## Import
import pygame
import copy
from copy import deepcopy
#################################################################################
# Class Player from Bomberman #
# Created by Vincent : 24/01/2020 #
# #
# Cette classe permet de definir toutes les proprietes d'un Joueur #
# #
#################################################################################
class Player:
def __init__(self,startX, startY, color, hauteur, zoom):
self.x = 0 # Positions initiales
self.y = 0
self.caseX = startX
self.caseY = startY
self.color = color # Couleur du personnage
self.cartedist = [] # Carte des distance au joueur courant
self.carteAcces = []
self.sprite = [] # Tableau de sprites en 2D
self.spriteDir = 0 # Selectionne le tableau de sprite (en 1D) correspondant a la direction du joueur
self.spriteCount = 0 # Selectionne le sprite du tableau correspondant au mouvement actuel
self.spriteOffset = 0 # Permet de changer de sprite en fonction du decalage et non a chaque mouvement
self.lives = 1 # Nombre de vie du personnage dans une partie de jeu
self.nbBombe = 0 # Nombre de bombes déjà posé par le personnage
self.nbBombeMax = 1 # Nombre de bombes maximal que peut poser le personnage en meme temps
self.rayonBombe = 1 # Rayon d'explosion de la bombe
self.invincible = 0 # Rend le player invincible quand il rencontre une bombe et qu'il lui reste encore une vie ou plus
self.invincibleOffset = 0
self.getSprite(hauteur, zoom) # Avoir le spoite du personnage de la bonne taille
self.dir = (0,0)
self.vitesse = 1
## getSprite(self, hauteur, zoom):
# Decoupe l'image Color en sprite
# Met les sprite a l'echelle de la carte
# Les rajoute dans un tableau en 2D tel que :
# Tab = [[SpriteAvant_1, SpriteAvant_2, ...],[SpriteDroit_1, SpriteDroit_2, ...]]
def getSprite(self, hauteur, zoom):
Tab = []
for j in range(4):
tabTemp = []
for i in range(4):
imTemp = self.color.subsurface((i*29) + (3*i) + 3,0 + (j*48),29,46)
imTemp = pygame.transform.scale(imTemp,(zoom,hauteur))
tabTemp.append(imTemp)
Tab.append(tabTemp)
self.sprite = Tab
## dessine(self, surface, largeurPerso, hauteurPerso):
# Permet de dessiner le personnage dont les coordonnees sont au milieu de ses pieds
# tandis que le jeu dessine les images depuis leur coin superieur gauche:
# (largeurPerso / 2 = 32 et hauteurPerso = 102)
def dessine(self, surface, largeurPerso, hauteurPerso, zoom):
if(self.invincible == 0 or self.invincibleOffset == 0):
surface.blit(self.sprite[self.spriteDir][self.spriteCount], ((self.caseY * zoom) + self.x - largeurPerso + zoom//2,(self.caseX * zoom) + self.y - hauteurPerso + zoom//2))
self.invincibleOffset = (self.invincibleOffset + 1) % 2
## move(self, posX, posY):
# On change les coordonnees du joueur selon son deplacement
# On regarde la retenu de sprite est complete ou non:
# * Si oui on change de sprite (+1 %Nombre de sprite pour ne pas sortir du tableau) et et on reset la retenu de sprite
# * Si non on augmente la retenu
# (permet d'eviter un changement de sprite trop rapide par rapport a sa vitesse)
def move(self, posX, posY, zoom):
self.y += posY
self.x += posX
if(self.x > zoom//2):
self.x = - zoom//2
self.caseY += 1
if(self.x < -zoom//2):
self.x = zoom//2
self.caseY -= 1
if(self.y > zoom//2):
self.y = - zoom//2
self.caseX += 1
if(self.y < -zoom//2):
self.y = zoom//2
self.caseX -= 1
if(self.spriteOffset == 2):
self.spriteCount = (self.spriteCount + 1) % 4
self.spriteOffset = 0
else:
self.spriteOffset += 1
## generateDist(self, tab):
# Permet de creer la carte de distance pour chaque joueur
def generateDist(self, tab):
self.cartedist = [ [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]
done = True
hauteur = len(tab)
largeur = len(tab[0])
for x in range(largeur):
for y in range(hauteur):
if (tab[y][x] == 1 or tab[y][x] == 2):
self.cartedist[y][x] = 1000
continue
if (tab[y][x] == 0 or tab[y][x] == 3 or tab[y][x] == 4 or tab[y][x] == 5 or tab[y][x] == 6):
self.cartedist[y][x] = 100
continue
while done:
done = False
for y in range(hauteur):
for x in range(largeur):
self.cartedist[self.caseX][self.caseY] = 0
if (self.cartedist[y][x] == 1000): continue
if (self.cartedist[y][x] >= 0):
mini = min(self.cartedist[y+1][x], self.cartedist[y-1][x], self.cartedist[y][x+1], self.cartedist[y][x-1])
if (mini +1 < self.cartedist[y][x]):
self.cartedist[y][x] = mini +1
done = True
def generateAcces(self, tab):
self.carteAcces = [ [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]
done = True
hauteur = len(tab)
largeur = len(tab[0])
for x in range(largeur):
for y in range(hauteur):
if (tab[y][x] == 1 or tab[y][x] == 2 or tab[y][x] == 3):
self.carteAcces[y][x] = 1000
continue
if (tab[y][x] == 0 or tab[y][x] == 4 or tab[y][x] == 5 or tab[y][x] == 6):
self.carteAcces[y][x] = 100
continue
while done:
done = False
for y in range(hauteur):
for x in range(largeur):
self.carteAcces[self.caseX][self.caseY] = 0
if (self.carteAcces[y][x] == 1000): continue
if (self.carteAcces[y][x] >= 0):
mini = min(self.carteAcces[y+1][x], self.carteAcces[y-1][x], self.carteAcces[y][x+1], self.carteAcces[y][x-1])
if (mini +1 < self.carteAcces[y][x]):
self.carteAcces[y][x] = mini +1
done = True
## setRightDir(self):
# Permet de determiner le bon sprite
# en fonction de la direction de deplacement de l'IA
def setRightDir(self):
if(self.dir == (0,1)): self.spriteDir = 0
if(self.dir == (0,-1)): self.spriteDir = 3
if(self.dir == (1,0)): self.spriteDir = 2
if(self.dir == (-1,0)): self.spriteDir = 1
#################################################################################
# Class Player from Bomberman #
# Created by Manon : 27/01/2020 #
# #
# Cette classe permet de definir toutes les propriete d'une IA #
# Cette classe herite de la classe player #
# #
#################################################################################
class IA(Player):
## Variable globale
GRILLE_BOMBE = None
def __init__(self,startX, startY, color, hauteur, zoom, direction):
super(IA,self).__init__(startX, startY, color, hauteur, zoom) # Reutilisation de l'instanciation de Player()
self.dir = direction
self.needToGoCenter = False # Initiation d'un direction par defaut de l'IA
self.bloque = False
## move(self, posX, posY,, zoom):
# Permet de faire bouger l'ia
def move(self, posX, posY, zoom):
self.y += posY
self.x += posX
if(self.x > zoom//2):
self.x = - zoom//2
self.caseY += 1
if(self.x < -zoom//2):
self.x = zoom//2
self.caseY -= 1
if(self.y > zoom//2):
self.y = - zoom//2
self.caseX += 1
if(self.y < -zoom//2):
self.y = zoom//2
self.caseX -= 1
if(self.spriteOffset == 2):
if(self.dir != (0,0)): self.spriteCount = (self.spriteCount + 1) % 4
self.spriteOffset = 0
else:
self.spriteOffset += 1
self.setRightDir()