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
| # 1 - Importations ============================================================
import pyxel
import random
# 2 - CONSTANTES et variables globales ========================================
vaisseau = {'x': 100, # la clé 'x' correspond à l'abscisse du vaisseau
'y': 100} # la clé 'y' correspond à l'ordonnée du vaisseau
points = {'score':0} # +1 par ennemi détruit, -5 par ennemi qui passe
tirs = {} # dict des tirs contenant des tableaux [x, y]
explosions = {} # dict des explosions contenant des tableaux [x, y, rayon]
ennemis = {} # dict des ennemis contenant des tableaux [x, y, couleur]
# 3 - FONCTIONS ===============================================================
def controle():
"""[C] Fonction qui récupère l'action, modifie les données en conséquence"""
if pyxel.btn(pyxel.KEY_LEFT): # Si on maintient appuyé la flèche GAUCHE
deplacer_vaisseau(-1, 0) # --> Mettre à jour les coordonnées du vaisseau
if pyxel.btn(pyxel.KEY_RIGHT): # Si on maintient appuyé la flèche DROITE
deplacer_vaisseau(1, 0) # --> Mettre à jour les coordonnées du vaisseau
if pyxel.btnp(pyxel.KEY_SPACE): # Si on a appuyé sur la touche ESPACE
x = vaisseau['x'] # --> récupère x
y = vaisseau['y'] # --> récupère y
creer_tir(x, y) # --> Rajoute un tir dans le dictionnaire tirs
if pyxel.frame_count % 30 == 0: # S'il s'est écoulé 30 secondes
creer_ennemi() # insère un nouvel ennemi
gerer_explosions() # Mettre les explosions ç jour en les amplifiant/supprimant
gerer_tirs() # Mettre les tirs à jour (déplacement et collision)
gerer_ennemis() # Mettre les ennemis à jour
def deplacer_vaisseau(dx, dy):
"""[M] Modifie les données du vaisseau pour intégrer le déplacement dx et dy voulu"""
vaisseau['x'] = vaisseau['x'] + dx # modifie l'abscisse du vaisseau
if vaisseau['x'] > 120: # Si on va trop loin à droite
vaisseau['x'] = 120 # --> bloque l'abscisse à 120
if vaisseau['x'] < 0: # Si on va trop loin à gauche
vaisseau['x'] = 0 # --> bloque l'abscisse à 0
def creer_tir(x, y):
"""[M] Rajoute ce tir tiré depuis un vaisseau en (x, y) dans le tableau des tirs"""
tir = [x + 4, y - 4] # crée le tableau contenant les coordonnées du tir
tirs[pyxel.frame_count] = tir # stocke le tir dans tirs avec cle = pyxel.frame_count
def gerer_explosions():
"""[M] Modifie ou supprime les données liées aux explosions"""
for cle in tuple(explosions.keys()): # Pour chaque clé du dictionnaire explosions
explosion = explosions[cle] # récupère l'une des explosions (un tableau)
explosion[2] = explosion[2] + 2 # augmente le rayon de 2 pixels
if explosion[2] > 8: # Si le rayon est supérieur à 8
del explosions[cle] # --> supprime cette explosion du dictionnaire
def gerer_tirs():
"""[M] Modifie les coordonnées des tirs, en les supprimant au besoin"""
for cle in tuple(tirs.keys()): # Pour chaque cle du dictionnaire tirs
tir = tirs[cle] # récupère l'adresse d'un tableau contenant un tir
tir[1] = tir[1] - 1 # fait "monter" le tir
x = tir[0] # --> récupère son abscisse
y = tir[1] # --> récupère son ordonnée
if tir[1] < 0: # Si le tir percute le bord du haut
explosions[cle] = [x, y, 1] # --> génère une explosion dans le dico explosions
del tirs[cle] # --> supprime ce tir du dico tirs
else: # Sinon
for cle2 in tuple(ennemis.keys()): # --> pour chaque cle du dictionnaire ennemis
ennemi = ennemis[cle2] # ----> récupère cet ennemi
if tir_touche(x, y, ennemi): # si cet ennemi est touché par ce tir
explosions[cle] = [x, y, 1] # --> ajoute l'explosion dans le dico explosions
del ennemis[cle2] # --> supprime cet ennemi du dico ennemis
del tirs[cle] # --> supprime ce tir du dico tirs
points["score"] = points["score"] + 1 # Augmente le score car ennemi abattu
def tir_touche(x, y, ennemi):
"""Prédicat qui renvoie True si le tir (x, y) touche l'ennemi"""
xg = ennemi[0] # récupère son abscisse à gauche
xd = ennemi[0] + 8 # récupère son abscisse à droite
yh = ennemi[1] # récupère son abscisse en haut
yb = ennemi[1] + 8 # récupère son abscisse en bas
if x >= xg: # si l'abscisse du tir dépasse le côté gauche de l'ennemi
if x <= xd: # si l'abscisse du tir précède le côté droite de l'ennemi
if y <= yb: # si le tir est (à l'écran) au dessus du côté bas (Oy vers le bas)
if y >= yh: # si le tir est (à l'écran) en dessous du côté haut
return True # --> si on arrive ici, c'est que cet ennemi est touché
return False # --> si on arrive ici, c'est qu'on a pas rencontré le True !
def creer_ennemi():
"""[M] Création et ajout d'un ennemi dans le dictionnaire ennemis"""
x = random.randint(0, 120) # génère une abscisse aléatoire entre 0 et 120
couleur = random.randint(2, 15) # génère une couleur aléatoire entre 2 et 15
ennemi = [x, 0, couleur] # génère le tableau [x, y, couleur]
ennemis[pyxel.frame_count] = ennemi # rajoute cet ennemi dans le dictionnaire
def gerer_ennemis():
"""[M] Modifie les coordonnées des ennemis en les suprimmant au besoin"""
for cle in tuple(ennemis.keys()): # Pour chaque cle du dictionnaire ennemis
ennemi = ennemis[cle] # récupère l'adresse d'un tableau contenant un ennemi
ennemi[1] = ennemi[1] + 1 # fait "descendre" l'ennemi
if ennemi[1] > 120: # Si l'ennemi percute le bord du bas
del ennemis[cle] # --> supprime cet ennemi du dictionnaire
points["score"] = points["score"] - 5 # -5 car l'ennemi a parvenu à passer
def vue():
"""[V] création de l'affichage (30 fois par seconde)"""
pyxel.cls(0) # vide la fenetre
afficher_vaisseau() # vaisseau (carre 8x8)
afficher_tirs() # tous les tirs (rectangle 1x4)
afficher_ennemis() # tous les ennemis (carré)
afficher_explosions() # toutes les explosions (cercle)
afficher_informations() # les textes
def afficher_vaisseau():
"""[V] Dessine le vaisseau"""
x = vaisseau['x'] # récupère l'abscisse
y = vaisseau['y'] # récupère l'ordonnée
pyxel.rect(x, y, 8, 8, 1) # trace un carré 8*8 de couleur 1
def afficher_tirs():
"""[V] Dessine les tirs"""
for cle in tirs.keys(): # pour chaque indice possible dans le tableau tirs
tir = tirs[cle] # récupère dans tir le tir n°i
x = tir[0] # récupère l'abscisse
y = tir[1] # récupère l'ordonnée
pyxel.rect(x, y, 1, 3, 10) # trace un rectangle 1*3 de couleur 10
def afficher_explosions():
"""[V] Dessine les explosions"""
for cle in explosions.keys(): # pour chaque indice posible dans le tableau explosions
explosion = explosions[cle] # récupère l'une des explosions (un tableau)
x = explosion[0] # récupère son abscisse
y = explosion[1] # récupère son ordonnée
r = explosion[2] # récupère son rayon
pyxel.circ(x, y, r, 10) # trace un cercle de couleur 10
pyxel.circ(x, y, r-3, 0) # trace un cercle plus petit de couleur 0
def afficher_ennemis():
"""[V] Dessine les ennemis"""
for cle in ennemis.keys(): # pour chaque cle du dictionnaire ennemis
ennemi = ennemis[cle] # récupère l'un des ennemis (un tableau)
x = ennemi[0] # récupère sa abscisse
y = ennemi[1] # récupère son ordonnée
c = ennemi[2] # récupère sa couleur
pyxel.rect(x, y, 8, 8, c) # trace un carré 8*8
def afficher_informations():
"""[V] Affiche les informations voulues à l'écran"""
texte = str(points["score"]) # génère un string à partir du nombre de frames
pyxel.text(1, 1, texte, 7) # affiche le texte
def lancer_jeu():
"""[C] Cette fonction lance la surveillance des événements"""
pyxel.init(128, 128, title="Mon premier jeu") # Initialisation de la fenêtre
pyxel.run(controle, vue) # Lancement de l'alternance controle / vue
# 4 - PROGRAMME PRINCIPAL ====================================================
lancer_jeu()
|