« Are you telling me I can dodge bullets ? » Neo, The matrix. Cette citation représente la base de notre projet dans lequel est présenté le personnage Neo au visage hélicoïdal stoppant les balles sur un fond de chiffres binaires aléatoirement positionnés.
Sommaire
I – Le fond
Premièrement, le fond nous semblait être la partie la plus importante du projet. Nous avons donc commencé par poser un fond noir avec les lignes de code suivantes
color('black') pensize(2000) #peu conventionnel 😅 goto(-635, 350) forward(700)
Après cela, nous y avons superposé les caractères 1 et 0 que nous avons définis avec le code suivant.
def un(): pensize(2) color('green') setheading(60) forward(12) setheading(270) forward(20) def zero(): setheading(90) circle(8)
Nous avons ensuite créé une suite de boucle pour placer aléatoirement des 1 et des 0 en colonnes. Pour cela, nous avons utilisé le module « random » avec la fonction « random.choice » pour sélectionner aléatoirement un nombre dans une liste prédéfinie, ensuite, une condition nous a permis de placer les chiffres. Pour ordonner ces derniers, une incrémentation aux coordonnées déjà inscrites (définissant la position du premier caractère posé) à la fin de chaque boucle a été nécessaire. Voici le code
y = 330 x = -620 for i in range(50): penup() goto(x, y) pendown() for i in range(20): list1 = [1,2] if random.choice(list1) == 1: un() else: zero() penup() goto(x, y - 40 * (i + 1)) pendown() x += 25 #incrémentation de la distance entre chaque colonnes (horizontalement)
Voici le résultat du fond finalisé :
II – Le personnage, Neo
1 – La main
La main était aussi une partie importante de l’image : elle constitue le point de fuite centrale de l’image, où se dirige toutes les balles. Voici la main, constituée de lignes plus ou moins courtes (doigts) et d’un cercle (paume).
2 – Le corps
Nous avons donc créé le corps d’un homme bâton, avec de simples lignes et un cercle pour la tête. Voici le code :
def corps(): pensize(5) color('white') penup() goto(0,-70) pendown() setheading(90) left(110) forward(180) left(25) forward(80) left(180) forward(80) setheading(90) forward(40) right(180) forward(150) setheading(90) right(150) forward(90) left(180) forward(90) setheading(90) left(150) forward(90) right(180) forward(90) setheading(90) forward(150) right(90) circle(50) penup() setheading(90) forward(50) pendown() corp()
Voici le rendu :
3 – La spirale
Pour créer cette spirale, il n’a suffit que de 2 lignes, avec une boucle for :
for i in range(48): circle(i,20) # i est donc augmenté a chaque répétition
Le rendu fut le suivant :
III – Les balles
Pour créer les balles, nous avons créé une fonction, en utilisant les méthodes « begin_fill » et « end_fill » permettant de remplir tout ce que l’on dessine en trait. Voici le code :
def balle(): pensize(3) color('#A9A9A9') begin_fill() forward(30) left(143) forward(27) left(110) forward(15) end_fill() left(180) forward(7) color("grey") begin_fill() circle(10) end_fill()
← Voici le résultat
Pour créer plus de dynamisme, nous avons opté pour des tirets, encore avec une fonction, appelées (comme les balles) plusieurs fois. Nous avons donc créé une boucle for, se répétant 18 fois :
def tiret(): for i in range(18): pensize(7) color("white") forward(5) penup() forward(15) pendown()
Pour une balle, nous avons combiné les deux fonctions en les appelant de la sorte :
penup() left(50) goto(300,-150) pendown() balle() penup() left(90) forward(30) pendown() tiret() right(90)
Nous avons répété ce pattern sept fois, en changeant leurs positions (goto).
IV – L’image finale
V – Les problèmes rencontrés
Le seul ‘problème’ qu’on a rencontré fut pour le fond, pour utiliser le module random dans une liste, mais nous avons relu nos exercices sur ce thème et avons facilement trouvé la solution.
VII – Télécharger le .py
Nous vous mettons au défi d’optimiser ce code au maximum, sans changer le rendu.