LANGAGE PYTHON
Mini-projet1: créer un jeu "trouver un mot"
Aide avec les extraits de code ci-dessous:
On appelle le_mot_décoré le mot à trouver avec des espaces entre chaque caractère à trouver:
Définir un nombre de coups maximum et comptabiliser les coups
# compteurs du nombre d'essais et du nombre de caractères trouvés au départ à 0
essai = 0
caractères_trouvés = 0
# nombre d'essais maximum = longueur du mot à deviner + 5
essai_max = len(mot_à_deviner) + 5
# tant qu'il reste des essais et que tous les caractères n'ont pas été trouvés:
while essai <= essai_max and caractères_trouvés < len(mot_à_deviner):
print("essai N°", essai + 1)
# l'utilisateur saisit un caractère
caractere = input("entrez un caractère: \n")
# on ajoute 1 au compteur d'essai
essai += 1
Prendre en compte des saisies et comparaison avec le mot à trouver
# on définit une liste des caractères déjà trouvés au début aucun = tableau vide
liste_caractères_trouvés = []
# on teste si le caractère saisi au clavier n'est pas déjà dans la liste des caractères trouvés
if caractere not in liste_caractères_trouvés:
# on parcours la chaine en tenant compte des espaces pas de 2
for x in range(0, len(le_mot_décoré) , 2):
# si le caractère saisi est dans le mot
if le_mot_décoré[x] == caractere:
# on ajoute ce caractère à la liste
liste_caractères_trouvés.append(caractere)
# on affiche un message
print("le caractère est bien dans le mot")
print("pour l'instant vous avez trouvé", liste_caractères_trouvés )
# on augmente le compteur de caractères trouvés de 1
caractères_trouvés += 1
Afficher gagner ou perdu
# après la boucle while
if caractères_trouvés == len(mot_à_deviner):
print("Bravo! vous avez trouvé:", mot_à_deviner)
else:
print("C'est perdu, il fallait trouver:", mot_à_deviner)
Mini-projet1: réalisation d'un jeu de type pong
Partie 1: ajout d'une raquette qui bouge avec les touches A et Q du clavier.
On part du code "gérer le clavier" de l'exercice précédent que vous adapterez.
Dans un premier temps vous allez être guidé pour créer une raquette qui renvoie une balle
Dans un deuxième temps, vous réaliserez le projet selon les demandes de la partie 2
Méthode à suivre:
1. Les deux variables X, Y qui permettaient dans l'exercice 11 de définir les coordonnées de la balle représenteront maintenant la position de la raquette, la raquette sera positionnée initialement à 60 px du haut et 60 px du bord gauche du canvas, le programme de l'exercice 11 évolue comme montré en rouge ci-dessous( les parties en noirs sont les parties inchangées pour l'instant) :
#Le programme principal
#**************************************************************
fenetre = Tk()
# la zone de dessin
Fond = Canvas(fenetre,width=500,height=500,bg="white")
Fond.grid()
# variables globales X et Y qui positionnent la raquette
# avant: X et Y étaient les coordonnées initiales de la balle
# maintenant: ce sont les coordonnées du point haut gauche du rectangle ( voir le dessin plus bas)
X, Y = 60, 60
2. Ajout de la raquette dans le canvas
On va créer un rectangle de largeur 10px et de longueur 100px sur le canvas.
Un rectangle est défini dans le canvas par 2 points A(X0,Y0) coin haut gauche et B(X1,Y1) coin bas droit ( voir le dessin du rectangle représentant la raquette ci-dessous).
On fixe X0=X et Y0=Y et X1=X+10 et Y1=Y+100, si on fait évoluer X et Y, on change les valeurs de X0, Y0, X1 et Y1 qui définissent où est dessiné le rectangle dans le canvas
On choisit ici un emplacement initial du rectangle à X=X0=60, Y=Y0=60, X1=70 et Y1=160
Si on veut que le rectangle bouge, il suffit de changer les valeurs de X et Y et appliquer les changements au dessin du rectangle.
Voici le code python qui crée le rectangle bleu dessiné ci-dessus, le rectangle est associé à la variable raquette ce qui permettra de le manipuler ( le rectangle est créé sur le canvas appelé Fond)
raquette = Fond.create_rectangle(X,Y,X+10,Y+100,fill='blue')
Evolution du code, on ajoute la création de la raquette en dessous de celle de la balle, code en rouge ci-dessous:
# maintenant coordonnées du point haut gauche du rectangle
X, Y = 60, 60
# Création de la balle
Balle = Fond.create_oval(50,50,70,70,fill='red')
# Création de la raquette
raquette = Fond.create_rectangle(X,Y,X+10,Y+100,fill='blue')
3. gestion du mouvement.
- Il va falloir modifier le code de la fonction touche(evt) qui permettait dans l'exercice 11 le déplacement de la balle géré par le clavier et le remplacer par un code qui déplace la raquette. Il y a plusieurs choses à changer:
3.1 mettre des variables globales de gestion de la vitesse de la balle Vx, Vy afin de régler la vitesse de la balle selon x ( déplacement droite-gauche) et selon y ( déplacement haut-bas). On fixera une vitesse de 10 ( ce qui veut dire que la balle se déplacera de 10 px à chaque rafraîchissement du dessin à l'écran).
Les ajouts sont en rouge ci-dessous.Vous placerez ces variables juste après celles de X, Y.
Mettre aussi les variables globales de gestion de la position du centre de la balle appelées BalleX et
BalleY. Au départ le centre de la balle est placée au centre du canvas, soit une coordonnée selon X:
BalleX = 250 et une coordonnée selon Y: BalleY = 250. En changeant BalleX et BalleY, on déplace la position de la balle à l'écran, c'est la fonction animation() qui sera chargée de gérer la position de la balle.
# variables globales X et Y ( position de la balle)
# avant: les coordonnées initiales qu'aura la balle
# maintenant coordonnées du point haut gauche du rectangle ( de la raquette)
X, Y = 60, 60
# la vitesse initiale est 10 pour Vx et 10 pour Vy
VX, VY = 10, 10
#la position initiale de la balle
BalleX, BalleY = 250, 250
Tester le code à ce stade.
3.2 modifier ensuite le dessin de la balle en fonction des coordonnées des variables globales BalleX et BalleY, modifications en rouge ci-dessous; tester le résultat.
# Création de la balle
# avant : Balle = Fond.create_oval(50,50,70,70,fill='red')
# maintenant:
Balle = Fond.create_oval(BalleX - 10, BalleY - 10, BalleX + 10, BalleY + 10,fill='red')
raquette = Fond.create_rectangle(X,Y,X+10,Y+100,fill='blue')
# liaison de notre fonction "touche" avec les événements clavier
fenetre.bind_all('<Key>', touche)
#appel de la fonction animation
animation()
# abonnement de la fenêtre aux événements détectés par Windows
fenetre.mainloop()
3.3 ajouter la définition de la fonction animation() de l'exercice 10 avant le programme principal en changeant les coordonnées des bords du canvas, le canvas fait 500 x 500 au lieu de 300 x 200 dans l'exercice 10, ça donne les parties vertes ci-dessous:
from tkinter import *
#la fonction animation()qui gère le mouvement
def animation():
global VX, VY, BalleX, BalleY
futurX, futurY = BalleX + VX, BalleY + VY
#détection des bords en tenant compte du rayon de la balle
if futurX > 490 or futurX < 10 :
VX = - VX
futurX = BalleX + VX
if futurY > 490 or futurY < 10 :
VY = - VY
futurY = BalleY + VY
# mise à jour du centre de la balle
BalleX, BalleY = futurX, futurY
# balle redessinée aux nouvelles coordonnées
Fond.coords(Balle, BalleX - 10, BalleY - 10, BalleX + 10, BalleY + 10)
# rappel de la fonction au bout de 40ms
fenetre.after(40,animation)
# le programme principal
fenetre=Tk()
3.4 modifier la définition de la fonction touche(evt) pour gérer la raquette avec le clavier, seul le déplacement selon Y est possible avec les touches A et Q
def touche(evt):
global X,Y
'''la fonction upper() convertit en lettre capitale a => A,
le nom de la touche est stockée dans la variable t '''
t = evt.char.upper()
# déplacement de 5 px selon touche enfoncée
if t == 'A' :
Y = Y - 5
elif t == 'Q' :
Y = Y + 5
# le code redessine la raquette à la nouvelle position
Fond.coords(raquette,X,Y,X+10,Y+100)
3.5 modifier ensuite la définition de la fonction animation() pour faire en sorte que la balle rebondisse dés qu'elle atteint le rectangle, pour ça:
- mettre à jour les variables globales de la fonction animation() en ajoutant X et Y parties rouges ci-dessous:
# la fonction animation()qui gère le mouvement
def animation():
global VX, VY, BalleX, BalleY, X, Y
futurX, futurY = BalleX + VX, BalleY + VY
#détection des bords en tenant compte du rayon de la balle
if futurX > 490 or futurX < 10 :
VX = - VX
futurX = BalleX + VX
if futurY > 490 or futurY < 10 :
VY = - VY
futurY = BalleY + VY
- ajouter un test if qui compare la position de BalleX par rapport à X ( centre balle par rapport à la raquette) et inverse le sens de déplacement comme pour les bords ( modifications rouges ci-dessous)
def animation():
global VX, VY, BalleX, BalleY, X, Y
futurX, futurY = BalleX + VX, BalleY + VY
# détection de la présence de la raquette quand la balle arrive pour rebond
if futurX <= X+20 and futurY > Y and futurY < Y+100:
VX = - VX
futurX = BalleX + VX
# si pas de raquette: détection des bords en tenant compte du rayon de la balle
elif (futurX > 490 or futurX < 10) :
VX = - VX
futurX = BalleX + VX
elif futurY > 490 or futurY < 10 :
VY = - VY
futurY = BalleY + VY
# mise à jour du centre de la balle
BalleX, BalleY = futurX, futurY
# balle redessinée aux nouvelles coordonnées
Fond.coords(Balle, BalleX - 10, BalleY - 10, BalleX + 10, BalleY + 10)
# rappel de la fonction au bout de 40ms
fenetre.after(40,animation)
Partie 2: ajouter la deuxième raquette qui bouge avec les touches de direction UP et DOWN du clavier.
Voici le nom des touches et un exemple de code en dessous
Exemple : association de la touche de direction Down ( vers le bas ) à la fonction touche_b ; chaque fois que l'on appuie sur la touche de direction Down, la fonction touche_b sera appelée:
fen.bind('<Down>', touche_b)
La définition de la fonction touche_b:
# une fonction qui capte les événements doit toujours avoir la variable evt entre ses parenthèses
def touche_b (evt):
# ici la fonction manipulerait la valeur des variables Vx, Vy, BalleX et BalleY du programme principal ce qui dit le mot global
global VX, VY, BalleX, BalleY
etc...
Créé avec HelpNDoc Personal Edition: Créer de la documentation iPhone facilement