from turtle import *
from random import *
from math import *
screen = Screen()
# on utilise différentes fonctions rectangle afin de les faire dans deux sens d'écriture différents
def rectangle1(x, y):
i = 0
while i <= 1:
forward(x)
left(90)
forward(y)
left(90)
i += 1
def rectangle2(x, y):
i = 0
while i <= 1:
forward(x)
right(90)
forward(y)
right(90)
i += 1
# Cette fonction trace des triangles isocèles bien précis, en fonction de la taille de sa base qui est z et des angles qui nous intéresse
def triangle(z):
begin_fill()
forward(z)
left(110)
forward(sqrt(2) * z)
left(180 - 40)
forward(sqrt(2) * z)
end_fill()
# le rectangle vert qui sert de pelouse est tracé avec cette procédure en se basant sur la taille en largeur et en hauteur de la fenêtre ainsi que d'un valeur arbitraire que l'on a définie à partir de notre croquis.
def pelouse():
setheading(0)
penup()
goto(-(window_width() / 2), 160)
pendown()
fillcolor("#22B14C")
begin_fill()
right(90)
forward(window_height() / 2 + 160)
left(90)
forward(window_width())
left(90)
forward(window_height() / 2 + 160)
left(90)
forward(window_width())
end_fill()
left(180)
# Cette fonctione qui prend en entrée x,y qui sont les point en bas à gauche de la flamme rouge et z qui est la taille de la basse de se triangle
def brasero(x, y, z):
setheading(0)
pu()
goto(x, y)
pd()
color('red')
triangle(z)
setheading(0)
forward(0.15 * z)
color('orange')
triangle(0.70 * z)
setheading(0)
forward(0.15 * z)
color('yellow')
triangle(0.4 * z)
pu()
goto(x, y)
pd()
color('black')
setheading(0)
begin_fill()
rectangle2(z, 0.25 * z)
end_fill()
setheading(0)
pu()
goto(x + z, y - 0.25 * z)
pd()
color('brown')
setheading(180)
triangle(z)
end_fill()
left(110 + 70)
forward(0.75 * z)
right(70)
begin_fill()
rectangle1(3/4/sqrt(2) * z-2.9, 4 * z)
end_fill()
left(180)
# création d'une fonction pour dessiner le modèle de sapin d'arrière-plan
def sapin(x, a, b):
setheading(0)
up()
goto(a, b)
down()
# on va commencer à faire le tronc du sapin en marron avec un carré
pencolor("black")
fillcolor("brown")
begin_fill()
for i in range(4):
forward(x / 2)
right(90)
end_fill()
# on finit de remplir la couleur du tronc
up()
goto(a - x / 4, b)
down()
pencolor("black")
fillcolor("green")
# on va ajouter le triangle pour faire le sapin en vert
begin_fill()
forward(x)
left(180 - 75.5)
# les angles ont été calculé grâce à une équation sur le cosinus entre les rapport de taille
forward(x * 2)
left(180 - 29)
forward(x * 2)
setheading(0)
end_fill()
# on finit de remplir le vert du sapin
# l'appel répété du motif en fond avec quelques valeurs arbitraires pour le placement du premier arbre de chaque rangée
def foret(debutx, debuty, tailleBaseTriangle):
for i in range(0, 6):
sapin(tailleBaseTriangle, debutx, debuty)
debutx += tailleBaseTriangle
debutx = debutx - 6 * tailleBaseTriangle + tailleBaseTriangle / 2
debuty -= tailleBaseTriangle / 2
for i in range(0, 5):
sapin(tailleBaseTriangle, debutx, debuty)
debutx += tailleBaseTriangle
# Trace une étoile à partir de la coordonnée du point de la branche la plus à gauche et de la
def etoile(x, y, longueur):
penup()
goto(x, y)
pendown()
color("yellow")
right(36)
begin_fill()
for i in range(5):
forward(longueur)
left(144)
end_fill()
setheading(0)
#génère des coordonnées aléatoire dans une zone définie pour ensuite appeler la fonction étoile et les trcar aux sites coordonnées.
def generationEtoile(widthMin, widthMax, heightMin, heightMax, nbEtoile, tailleEtoile):
coordEtoile = []
temporaire = []
while len(coordEtoile) != nbEtoile+1:
temporaire.append([randint(widthMin, widthMax), randint(heightMin, heightMax)])
if len(coordEtoile) != 0:
verification = 1
i=0
while i < len(coordEtoile)-1:
if abs(coordEtoile[i][0] - temporaire[0][0]) <= tailleEtoile or abs(
coordEtoile[i][1] - temporaire[0][1]) <= tailleEtoile:
verification = 0
i+=1
if verification == 1:
coordEtoile.append(temporaire[0])
del temporaire[0]
else:
del temporaire[0]
else:
coordEtoile.append(temporaire[0])
del coordEtoile[0]
i=0
while i<len(coordEtoile)-1:
etoile(coordEtoile[i][0],coordEtoile[i][1],tailleEtoile)
i+=1
# la fonction qui sert à écrire le fusil qui sert au décor
def fusil(x, y, z):
up()
goto(x, y)
left(50)
# couleur grise du corps du fusil
color("#666666")
begin_fill()
# on dessine d'abord la poignée
rectangle1(z, z * 0.7)
end_fill()
# vu qu'on est dirigé à 50 degré on utilise les fonctions sin et cos pour se déplacer
goto(x + z * 0.8 * cos(radians(50)), y + z * 0.8 * sin(radians(50)))
begin_fill()
# cette portion de code sert à faire la crosse de l'arme pour qu'elle soit stylisé (pas droite et carré)
right(90)
forward(z)
left(90)
forward(z * 0.6)
left(100)
forward(z * 1.2)
left(260)
end_fill()
goto(x + z * 0.8 * cos(radians(50)), y + z * 0.8 * sin(radians(50)))
begin_fill()
# le premier sert à faire le haut de l'arme puis le deuxième repasse dessus afin de faire le canon qui est plus long
rectangle1(z * 0.7, z * 3.5)
rectangle1(z * 0.4, z * 3.7)
end_fill()
goto(x + z * 0.8 * cos(radians(50)) + z * 0.7 * cos(radians(140)),
y + z * 0.8 * sin(radians(50)) + z * 0.7 * sin(radians(140)))
left(180)
pd()
# on dessine la gachette avec un arc de cercle
circle(-(z * 0.2), 90)
pu()
left(180 + 90)
goto(x + z * 0.8 * cos(radians(50)) + z * 0.7 * cos(radians(140)) + z * 0.3 * cos(radians(140)),
y + z * 0.8 * sin(radians(50)) + z * 0.7 * sin(radians(140)) + z * 0.3 * sin(radians(140)))
left(180)
pd()
# on dessine le socle qui contient la gachette
circle(z * 0.3, 95)
pu()
left(85)
goto(x + z * 0.7 * cos(radians(50)) + z * 3.3 * cos(radians(140)),
y + z * 0.7 * sin(radians(50)) + z * 3.3 * sin(radians(140)))
# on met une couleur bois pour le rechargement de l'arme
color("#E47833")
begin_fill()
# on dessine le rechargelent de l'arme
rectangle2(z * 0.3, z * 2.2)
end_fill()
right(50)
#cette fonction sert à faire une croix pleine pour les yeux du cadavre zombie
def croix(x):
begin_fill()
left(45)
for i in range (1,5):
fd(x*0.1)
left(90)
fd(x*0.1)
right(90)
fd(x*0.1)
right(90)
end_fill()
right(45)
#cette fonction écrit le cadavre du zombie dans le décor
def cadavre(x,y,z):
pu()
goto(x,y)
pd()
color("#CDCDCD")
#on dessine d'abord les chaussures
begin_fill()
rectangle2(z*2,z)
end_fill()
fd(z*2)
color("#9F9F5F")
begin_fill()
#puis le pantalon
rectangle2(z*5,z)
end_fill()
fd(z*5)
color("#FFFF00")
begin_fill()
#puis le corps
rectangle2(z*7,z)
end_fill()
fd(z*6)
color("#8FBC8F")
#puis le bras visible
begin_fill()
rectangle2(z,z*2.5)
end_fill()
#les trois lignes de codes suivantes servent à se replacer pour dessiner la tête
fd(z)
left(90)
fd(z*0.3)
right(90)
begin_fill()
rectangle2(z*3,z*1.6)
end_fill()
#puis on se place pour dessiner la bouche du zombie
fd(z*0.7)
right(90)
fd(z*0.3)
color("#000000")
pensize(z*0.1)
pd()
left(90)
fd(z*0.1)
right(90)
fd(z)
pu()
left(90)
#et enfin on dessine les yeux en forme de croix du zombie
fd(z*1.1)
croix(z)
left(90)
fd(z*0.9)
right(90)
croix(z)
#Trace les cratères de la lune qui sont formé d'un cercle contenant un cerle de couleur différente.
def cratere(x1,y1,taille):
pu()
goto(x1,y1)
pd()
color('#cccccc')
begin_fill()
circle(taille)
end_fill()
pu()
goto(xcor(), ycor()+2)
pd()
color('#d8d8d8')
begin_fill()
circle(taille - 2)
end_fill()
#Trace la lune avec ses cratères et un drapeau américain
def lune(x,y,rayon):
pu()
goto(x,y)
pd()
color('#e5e5e5')
begin_fill()
circle(rayon)
end_fill()
cratere(x-rayon/4,y+rayon-2*rayon/8,rayon/8)
cratere(x-2*rayon/3,y+rayon,rayon/6)
cratere(x-rayon/5,y+rayon/10,rayon/6)
cratere(x+rayon-2*rayon/4,y+rayon/2,rayon/7)
cratere(x+rayon/2,y+rayon+rayon/4,rayon/4)
drapeau(x-rayon/4,y+3*rayon/2)
#Trace un drapeau minitature d'une taille déjà définie car dur à proportionner aux coordonnées x,y
def drapeau(x,y):
pu()
goto(x,y)
pd()
color('black')
pensize(1)
setheading(90)
forward(14)
right(90)
forward(14.6)
right(90)
fd(6.5)
right(90)
fd(14.6)
pu()
goto(xcor()+0.9,ycor()+40/50)
pd()
pensize(1)
color('red')
setheading(0)
fd(13+1)
pu()
goto(xcor()-13-1,ycor()+40/50)
pd()
color('white')
fd(13+1)
pu()
goto(xcor()-13-1,ycor()+40/50)
pd()
color('red')
fd(13+1)
pu()
goto(xcor()-13-1,ycor()+40/50)
pd()
color('white')
fd(13+1)
pu()
goto(xcor()-13-1,ycor()+40/50)
pd()
for i in range(0,3):
color('yellow')
fd(13/12)
color('blue')
fd(13/ 12)
color('red')
fd(6*13/12+1)
pu()
goto(xcor()-13-1,ycor()+40/50)
pd()
for i in range(0,3):
color('blue')
fd(13/12)
color('yellow')
fd(13/ 12)
color('white')
fd(6*13/12+1)
pu()
goto(xcor()-13-1,ycor()+40/50)
pd()
for i in range(0,3):
color('yellow')
fd(13/12)
color('blue')
fd(13/12)
color('red')
fd(6*13/12+1)
# fonction qui appelle les fonctions qui trace tous le décors
def arrierePlan():
pelouse()
foret(200, 160, 80)
fusil(window_width() / 2 - 270, 140 - window_height() / 2, 30)
brasero(window_width() / 2 - 80, 250 - window_height() / 2, 40)
brasero(-window_width() / 2 + 80, 250 - window_height() / 2, 40)
lune(-window_width()/2+100, window_height()/2-150, 70)
cadavre(-window_width()/10,-180,window_width()/100)
generationEtoile(-window_width()/2+100+70,200-80/2,160,window_height()/2,9,40)
def corps(x):
# On utilise une fonction du module random pour choisir une couleur au hasard parmis la liste spécifiée
color(choices(["#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#FF00FF", "#00FFFF"], weights=none, cum_weights=none,k=1))
begin_fill()
# On fait un rectangle pour le corps du zombie
for i in range(1, 3):
forward(x)
left(90)
forward(x * 1.15)
left(90)
end_fill()
def pantalon(x):
# On dessine la forme des jambes du zombie
color("#9F9F5F")
begin_fill()
forward(x)
right(90)
forward(x * 2)
right(90)
forward(x * 0.45)
right(90)
forward(x * 1.7)
left(90)
forward(x * 0.1)
left(90)
forward(x * 1.7)
right(90)
forward(x * 0.45)
right(90)
forward(x * 2)
right(90)
end_fill()
def chaussure(x):
# On dessine des rectangles pour les chaussures
color("#CDCDCD")
begin_fill()
for i in range(1, 3):
forward(x * 0.45)
right(90)
forward(x * 0.3)
right(90)
end_fill()
def bras(x):
# On dessine des carrés pour les bras du zombie comme si ils étaient tendus vers l'avant
color("#8FBC8F")
begin_fill()
for i in range(1, 5):
forward(x * 0.5)
right(90)
end_fill()
def tete(x):
# On dessine un carré pour la tête
color("#8FBC8F")
begin_fill()
for i in range(1, 5):
forward(x)
left(90)
end_fill()
def teteMort(x):
# On remplace la tête du zombie tué par la couleur du fond
color("#22B14C")
begin_fill()
for i in range(1, 5):
forward(x)
left(90)
end_fill()
def visage(x, y, z):
# On dessine les traits du visage, c'est-à-dire yeux, sourcils, et bouches
goto(x + z * 0.3, y + z * 1.15 + z * 0.3)
color("#000000")
down()
goto(xcor()+0.4*z,ycor()) # bouche
up()
goto(x + z * 0.2, y + z * 1.15 + z * 0.6)
dot(size=z * 0.1)
goto(x + z * 0.15, y + z * 1.15 + z * 0.7)
down()
goto(xcor() + 0.1 * z, ycor()) #sourcil gauche
up()
goto(x + z * 0.8, y + z * 1.15 + z * 0.6)
dot(size=z * 0.1)
goto(x + z * 0.75, y + z * 1.15 + z * 0.7)
down()
goto(xcor() + 0.1 * z, ycor()) #sourcil droit
up()
def os(x):
#On dessine un os à la place de la tête du zombie (influence du jeu Among Us)
color("#FFFFFF")
pd()
begin_fill()
left(90)
forward(x*0.4)
left(90)
circle(-(x*0.15),270)
left(180)
circle(-(x*0.15),270)
left(90)
forward(x*0.4)
end_fill()
setheading(0)
def zombie(x, y, z):
# On met en forme le zombie en utilisant les fonctions créées au préalable et en les plaçant où il doivent être
up()
goto(x, y)
corps(z)
pantalon(z)
goto(x, y - z * 2)
chaussure(z)
goto(x + z * 0.55, y - z * 2)
chaussure(z)
goto(x - z * 0.25, y + z * 1.15)
bras(z)
goto(x + z * 0.75, y + z * 1.15)
bras(z)
goto(x, y + z * 1.15)
tete(z)
visage(x, y, z)
def zombieMort(x,y,z) :
#On remplace la tête du zombie mort par le fond puis l'os pour montrer qu'il a été éliminé
goto(x,y+z*1.15)
teteMort(z)
goto(x+z*0.35,y+z*1.15)
os(z)
def testQuille(x, y, nbZombies):
for i in range(0, nbZombies):
zombie(x, y, window_width()/40)
zombieMort(x,y,window_width()/40)
x += window_width()/20
# pour supprimer les animations de turtle
tracer(0)
# setup taille et nom de la fenêtre turtle on a voulu approximer un fullscreen mais pas moyen mais le carré en haut à droite fonctionne quand même
screen.title("projet Axel Delille et Joachim Véran")
screen.setup(1.0, 1.0)
# couleur de fond pour ne pas faire un tracé de plus
bgcolor("black")
# appel de la fonction qui appelle les fonctions qui trace tous le décors
arrierePlan()
testQuille(-window_width() / 2 + 200, -30, 15)
pu()
goto(-20, -window_height()/2+100)
pd()
color('#850606')
write("Ceci est un texte qui sera remplacé par les messages du jeu", move=false, align='center', font=('Algerian', 15))
hideturtle()
update()
done()