diff --git a/TD5/correction/code/formes.py b/TD5/correction/code/formes.py new file mode 100644 index 0000000000000000000000000000000000000000..434ce0b406b424947efe4dce44b199117aed5d9a --- /dev/null +++ b/TD5/correction/code/formes.py @@ -0,0 +1,81 @@ +class Forme: + def __init__(self, canevas, x, y): + self.__canevas = canevas + self.__item = None + self.x = x + self.y = y + + def effacer(self): + self.__canevas.delete(self.__item) + + def deplacement(self, dx, dy): + self.__canevas.move(self.__item, dx, dy) + self.x += dx + self.y += dy + + def get_cavenas(self): + return self.__canevas + + def set_item(self,item): + self.__item = item + + def get_item(self): + return self.__item + + def set_state(self, s): + self.__canevas.itemconfig(self.__item, state=s) + +class Rectangle(Forme): + def __init__(self, canevas, x, y, l, h, couleur): + Forme.__init__(self, canevas, x, y) + item = canevas.create_rectangle(x, y, x+l, y+h, fill=couleur, state="hidden") + self.set_item(item) + self.__l = l + self.__h = h + + def __str__(self): + return f"Rectangle d'origine {self.x},{self.y} et de dimensions {self.__l}x{self.__h}" + + def get_dim(self): + return self.__l, self.__h + + def set_dim(self, l, h): + self.__l = l + self.__h = h + + def contient_point(self, x, y): + return self.x <= x <= self.x + self.__l and \ + self.y <= y <= self.y + self.__h + + def redimension_par_points(self, x0, y0, x1, y1): + self.x = min(x0, x1) + self.y = min(y0, y1) + self.__l = abs(x0 - x1) + self.__h = abs(y0 - y1) + +class Ellipse(Forme): + def __init__(self, canevas, x, y, rx, ry, couleur): + Forme.__init__(self, canevas, x, y) + item = canevas.create_oval(x-rx, y-ry, x+rx, y+ry, fill=couleur, state="hidden") + self.set_item(item) + self.__rx = rx + self.__ry = ry + + def __str__(self): + return f"Ellipse de centre {self.x},{self.y} et de rayons {self.__rx}x{self.__ry}" + + def get_dim(self): + return self.__rx, self.__ry + + def set_dim(self, rx, ry): + self.__rx = rx + self.__ry = ry + + def contient_point(self, x, y): + return ((x - self.x) / self.__rx) ** 2 + ((y - self.y) / self.__ry) ** 2 <= 1 + + def redimension_par_points(self, x0, y0, x1, y1): + self.x = (x0 + x1) // 2 + self.y = (y0 + y1) // 2 + self.__rx = abs(x0 - x1) / 2 + self.__ry = abs(y0 - y1) / 2 diff --git a/TD5/correction/code/mots.txt b/TD5/correction/code/mots.txt new file mode 100755 index 0000000000000000000000000000000000000000..d52bfc54f030dd8bd536ddcd25dac998e436aa91 --- /dev/null +++ b/TD5/correction/code/mots.txt @@ -0,0 +1,835 @@ +ABIME +ABSENT +ACCIDENT +ACCROCHER +ACROBATE +ADROIT +AEROPORT +AFFAIRE +AFFICHE +AGITER +AIDER +AIGUILLE +ALBUM +ALLER +ALPHABET +AMENER +AMI +AMPOULE +AMUSANT +AMUSER +ANCIEN +ANGLE +ANORAK +APPAREIL +APPEL +APPORTER +APPUYER +APPUYER +APRES +ARC +ARMOIRE +ARRACHER +ARRET +ARRETER +ARRIERE +ARRIVER +ARROSER +ARROSOIR +ASSIETTE +ASSIS +ATTACHER +ATTENDRE +ATTENTION +ATTERRIR +ATTRAPER +AUTANT +AUTOUR +AVANCER +AVANT +AVION +BAGAGE +BAGARRE +BAGARRER +BAGUETTE +BAIGNER +BAILLER +BAISSER +BALANCER +BALANCOIRE +BALLE +BALLON +BANC +BANDE +BARBE +BARBOTER +BARRE +BARREAU +BAS +BATEAU +BATTRE +BEAUCOUP +BIBLIOTHEQUE +BICYCLETTE +BIEN +BILLE +BLANC +BLEU +BLOND +BOIS +BOITE +BOITE +BONDIR +BONNET +BORD +BOTTE +BOUCHER +BOUCHON +BOUDER +BOUGER +BOUSCULER +BOUT +BOUTEILLE +BOUTON +BRAS +BRETELLE +BRICOLAGE +BRUIT +BRUN +BULLES +BUREAU +CABANE +CABINET +CACHER +CAGE +CAGOULE +CAHIER +CAISSE +CALME +CAMARADE +CAMESCOPE +CAMION +CANARD +CARNET +CARRE +CARREAU +CARTABLE +CARTE +CARTON +CARTON +CASIER +CASQUE +CASQUETTE +CASSE +CASSER +CASSEROLE +CASSETTE +CATALOGUE +CEINTURE +CERCEAU +CERF +CHAINE +CHAISE +CHAISE +CHANGER +CHANSON +CHANTER +CHAPEAU +CHARGER +CHATEAU +CHAUD +CHAUSSER +CHAUSSETTE +CHAUSSON +CHAUSSURE +CHEMISE +CHERCHER +CHEVILLE +CHIFFRE +CHOISIR +CHOSE +CHUCHOTER +CHUTE +CIGARETTE +CINQ +CISEAUX +CLAIR +CLASSE +CLEF +CLOU +COEUR +COGNER +COIN +COL +COLERE +COLLANT +COLLE +COLLE +COLLER +COLORIAGE +COLORIER +COMMENCER +COMPARER +COMPTER +CONDUIRE +CONSTRUIRE +CONTE +CONTINUER +CONTRAIRE +CONTRE +COPAIN +COPIER +COQUIN +CORDE +CORPS +COTE +COU +COUCHER +COUDE +COUDRE +COULER +COULEUR +COULOIR +COUP +COUPER +COUR +COURIR +COURONNE +COURSE +COURT +COUVRIR +CRACHER +CRAIE +CRAVATE +CRAYON +CREUSER +CRIER +CROCHET +CROCODILE +CUBE +CUILLERE +CUISSE +CULOTTE +CURIEUX +CUVETTE +DAME +DANGER +DANGEUREUX +DANS +DANSER +DE +DEBORDER +DEBOUT +DEBOUT +DECHIRER +DECOLLER +DECORER +DECOUPAGE +DECOUPER +DEDANS +DEFENDRE +DEGONFLER +DEGUISER +DEHORS +DEMARRER +DEMOLIR +DEPASSER +DERNIER +DERRIERE +DESCENDRE +DESHABILLER +DESOBEIR +DESSIN +DESSINER +DESSUS +DETRUIRE +DEUX +DEUXIEME +DEVANT +DICTIONNAIRE +DIFFERENCE +DIFFERENT +DIFFICILE +DIRE +DIRECTEUR +DIRECTRICE +DISCUTER +DISPARAITRE +DISPUTE +DISTRIBUER +DIX +DOIGT +DOIGTS +DOMINO +DONNER +DORMIR +DOS +DOSSIER +DOUCHE +DOUCHER +DOUX +DROIT +DROITE +DU +DUR +EAU +EAU +ECARTER +ECHANGER +ECHARPE +ECHASSE +ECHASSES +ECHELLE +ECLABOUSSER +ECLAIRER +ECOLE +ECORCHER +ECOUTER +ECRAN +ECRASER +ECRIRE +ECRITURE +ECUREUIL +EFFACER +EFFORT +ELASTIQUE +ELEVE +EMMENER +EMPECHER +EMPORTER +ENCORE +ENERVER +ENFANT +ENFILER +ENFONCER +ENGIN +ENLEVER +ENSEMBLE +ENTENDRE +ENTONNOIR +ENTOURER +ENTRER +ENTRER +ENVELOPPE +ENVOLER +ENVOYER +ENVOYER +EPAIS +EPAULE +EPEE +EQUILIBRE +EQUIPE +ESCABEAU +ESCALADE +ESCALADER +ESCALIER +ESSUYER +ETAGERE +ETIQUETTE +ETROIT +EXPLIQUER +EXPLIQUER +EXTERIEUR +FABRIQUER +FACE +FACILE +FAIRE +FATIGUE +FAUTE +FEE +FENETRE +FERMER +FESSE +FEU +FEUILLE +FEUTRE +FICELLE +FIL +FILE +FILET +FILLE +FILM +FINIR +FLAQUE +FLECHE +FLOTTER +FOI +FOIS +FONCE +FOND +FORME +FORT +FOU +FOUILLER +FRAPPER +FREIN +FROID +FUSEE +FUSIL +GAGNER +GALOPER +GANT +GARAGE +GARCON +GARDER +GARDIEN +GARE +GARER +GAUCHE +GENER +GENOU +GENTIL +GLISSER +GOMME +GONFLER +GOUTER +GOUTTES +GRAND +GRIMPER +GRIS +GRONDER +GROS +GROUPE +GRUE +GYMNASTIQUE +HABILLER +HABIT +HANCHE +HANDICAPE +HAUT +HELICOPTERE +HISTOIRE +HUIT +HUMIDE +HURLER +ICI +IDEE +IMAGE +IMITER +IMMOBILE +INONDER +INSEPARABLE +INSTALLER +INSTRUMENT +INTERESSANT +INTERIEUR +INTRUS +JALOUX +JAMAIS +JAMBE +JAUNE +JEAN +JEU +JEU +JOLI +JONGLER +JOUER +JOUET +JOUEUR +JUPE +LACER +LACET +LAINE +LAISSER +LANCER +LARGE +LAVABO +LAVER +LETTRE +LEVER +LIGNE +LINGE +LIRE +LISSE +LISTE +LIT +LITRE +LIVRE +LOIN +LONG +LUNETTES +MADAME +MAGAZINE +MAGICIEN +MAGIE +MAGNETOSCOPE +MAILLOT +MAIN +MAINS +MAITRE +MAITRESSE +MAL +MALADROIT +MANCHE +MANQUER +MANTEAU +MARCHE +MARCHER +MARIONNETTE +MARTEAU +MATELAS +MATERNELLE +MECHANT +MELANGER +MEME +MENSONGE +MESURER +METAL +METRE +METTRE +MEUBLE +MICRO +MIEUX +MILIEU +MINE +MODELE +MODELER +MOINS +MOITIE +MONTAGNE +MONTER +MONTRER +MONTRER +MORCEAU +MOT +MOTEUR +MOTO +MOUCHOIR +MOUFLE +MOUILLE +MOUILLER +MOULIN +MOUSSE +MOYEN +MUET +MULTICOLORE +MUR +MUR +MUSCLE +MUSIQUE +NAGER +NEUF +NOEUD +NOIR +NOM +NOMBRE +NOUVEAU +NU +NUMERO +OBEIR +OBJET +OBLIGER +ONGLE +ORCHESTRE +ORDINATEUR +ORDRE +OUTIL +OUVRIR +OUVRIR +PAGE +PAIRE +PAIX +PANNE +PANTALON +PAPIER +PARCOURS +PARDON +PAREIL +PARKING +PARLER +PARTAGER +PARTIE +PARTIR +PARTIR +PAS +PASSERELLE +PATE +PATTES +PEDALE +PEDALER +PEINDRE +PEINTURE +PEINTURE +PELLE +PELUCHE +PENCHER +PENTE +PERCER +PERCHER +PERDRE +PERLE +PERSONNE +PETIT +PEU +PEUR +PHOTO +PIED +PIED +PILOTE +PINCEAU +PINCEAU +PINCER +PION +PIROUETTE +PLACARD +PLAFOND +PLAINDRE +PLANCHE +PLASTIQUE +PLATRE +PLEURER +PLEUVOIR +PLI +PLIAGE +PLIER +PLONGEOIR +PLONGER +PLUIE +PLUS +PNEU +POCHE +POIGNET +POING +POINT +POINTU +POISSON +POLI +POMPE +PONT +PONT +PORTE +PORTER +POSER +POSER +POSTER +POT +POUBELLE +POUCE +POURSUIVRE +POUSSER +POUTRE +POUVOIR +PREAU +PREMIER +PRENDRE +PRENOM +PREPARER +PRES +PRESENT +PRESQUE +PRESSER +PRESSER +PRETER +PRINCE +PRISE +PRIVER +PROGRES +PROGRESSER +PROMETTRE +PROPRE +PROTEGER +PUNIR +PUZZLE +PYJAMA +QUAI +QUATRE +QUESTION +QUITTER +RACONTER +RADIATEUR +RADIO +RAMPE +RAMPER +RANG +RANGER +RAQUETTE +RATER +RAYON +RAYURE +RECEVOIR +RECHAUFFER +RECITER +RECOMMENCER +RECREATION +RECULER +REFUSER +REGARDER +REINE +REMETTRE +REMPLACER +REMPLIR +RENVERSER +REPARER +REPETER +REPONDRE +RESPIRER +RESSEMBLER +RESTER +RETARD +RETOURNER +REUSSIR +REVENIR +RIDEAU +RIVIERE +ROBE +ROBINET +ROI +ROND +ROND +ROUE +ROUGE +ROULADE +ROULER +ROUX +RUBAN +SABLE +SAC +SAGE +SAIGNER +SALADIER +SALE +SALIR +SALLE +SALON +SAUT +SAUTER +SCIE +SEAU +SEC +SECHER +SEMELLE +SENS +SENTIR +SEPARER +SEPT +SERIEUX +SERPENT +SERRE +SERRER +SERRURE +SERVIETTE +SERVIR +SEUL +SIEGE +SIESTE +SIFFLER +SIFFLET +SIGNE +SIGNE +SILENCE +SINGE +SIX +SOCIERE +SOL +SOLDAT +SOLIDE +SOMMEIL +SONNER +SONNETTE +SORTIE +SORTIR +SOUFFLER +SOULEVER +SOULIGNER +SOUPLE +SOURD +SOURIRE +SOUS +SOUVENT +SPORT +STYLO +SUIVANT +SUIVRE +SUR +SURVEILLER +TABLE +TABLEAU +TABLIER +TABOURET +TACHE +TAILLE +TAILLER +TALON +TAMBOUR +TAMPON +TAPER +TAPIS +TARD +TAS +TASSE +TELECOMMANDE +TELEPHONE +TELEVISION +TENDRE +TENIR +TERMINER +TETE +TIRER +TIROIR +TISSU +TITRE +TOBOGGAN +TOILETTE +TOMBER +TORDU +TOT +TOUCHER +TOUJOURS +TOUR +TOURNER +TOURNEVIS +TRAIN +TRAINER +TRAIT +TRAMPOLINE +TRANQUILLE +TRANSPARENT +TRANSPIRER +TRANSPORTER +TRAVAIL +TRAVAILLER +TRAVERSER +TREMPER +TRICOT +TRICYCLE +TRIER +TROIS +TROISIEME +TROMPETTE +TROP +TROUER +TROUS +TROUSSE +TROUVER +TROUVER +TUNNEL +TUYAU +UN +UNIFORME +USE +VALISE +VELO +VENIR +VENTRE +VERRE +VERS +VERSER +VERT +VESTE +VETEMENT +VIDER +VIRAGE +VIS +VITE +VITESSE +VITRE +VOITURE +VOIX +VOLANT +VOLER +VOULOIR +VOYAGE +WAGON +XYLOPHONE +ZERO +ZIGZAG diff --git a/TD5/correction/code/pendu.py b/TD5/correction/code/pendu.py new file mode 100644 index 0000000000000000000000000000000000000000..f7d17932fabe9fb380f6c150513e9b6f52139de7 --- /dev/null +++ b/TD5/correction/code/pendu.py @@ -0,0 +1,156 @@ +#pendu5.py +from tkinter import * +from random import randint +from formes import * + +class ZoneAffichage(Canvas): + def __init__(self, parent, w, h, c): + + Canvas.__init__(self, master=parent, width=w, height=h, bg=c) + + # Listes des formes du pendu, dans l'ordre du dessin + self.__listeShape = [] + + # Base, Poteau, Traverse, Corde + self.__listeShape.append(Rectangle(self, 50, 270, 200, 26, "brown")) + self.__listeShape.append(Rectangle(self, 87, 83, 26, 200, "brown")) + self.__listeShape.append(Rectangle(self, 87, 70, 150, 26, "brown")) + self.__listeShape.append(Rectangle(self, 183, 67, 10, 40, "brown")) + # Tete, Tronc + self.__listeShape.append(Ellipse(self, 188, 120, 20, 20, "black")) + self.__listeShape.append(Rectangle(self, 175, 143, 26, 60, "black")) + # Bras gauche, droit + self.__listeShape.append(Rectangle(self, 133, 150, 40, 10, "black")) + self.__listeShape.append(Rectangle(self, 203, 150, 40, 10, "black")) + # Jambes gauche et droite + self.__listeShape.append(Rectangle(self, 175, 205, 10, 40, "black")) + self.__listeShape.append(Rectangle(self, 191, 205, 10, 40, "black")) + + def cachePendu(self): + for f in self.__listeShape: + f.set_state("hidden") + + def dessinePiecePendu(self, i): + if i<=len(self.__listeShape): + self.__listeShape[i-1].set_state("normal") + +class MonBoutonLettre(Button): + def __init__(self, parent, fen, t): + Button.__init__(self, master=parent, text=t, state=DISABLED) + self.__fen=fen + self.__lettre=t + + def cliquer(self): + self.config(state=DISABLED) + self.__fen.traitement(self.__lettre) + + +class FenPrincipale(Tk): + def __init__(self): + Tk.__init__(self) + self.title('Jeu du pendu') + self.configure(bg="#2687bc") + + # La barre d'outils + barreOutils = Frame(self) + barreOutils.pack(side=TOP, padx=5, pady=5) + newGameButton = Button(barreOutils, text ='Nouvelle partie', width=13) + newGameButton.pack(side=LEFT, padx=5, pady=5) + quitButton = Button(barreOutils, text ='Quitter', width=13) + quitButton.pack(side=LEFT, padx=5, pady=5) + + # Le canvas pour le dessin du pendu + self.__zoneAffichage = ZoneAffichage(self, 320, 320, "#ec4062") + self.__zoneAffichage.pack(side=TOP, padx=5, pady=5) + + # Le mot à deviner + self.__lmot = Label(self, text='Mot :') + self.__lmot.pack(side=TOP) + + # Le clavier + clavier = Frame(self) + clavier.pack(side=TOP, padx=5, pady=5) + self.__boutons = [] + for i in range(26): + t = chr(ord('A')+i) + self.__boutons.append(MonBoutonLettre(clavier, self, t)) + + # Placement des boutons du clavier + for i in range(3): + for j in range(7): + self.__boutons[i*7+j].grid(row=i,column=j) + for j in range(5): + self.__boutons[21+j].grid(row=3,column=j+1) + + # Commandes associées aux boutons + quitButton.config(command=self.destroy) + newGameButton.config(command=self.nouvellePartie) + for i in range(26): + self.__boutons[i].config(command=self.__boutons[i].cliquer) + + # initialisation des attributs + self.__mot = "" + self.__motAffiche= "" + self.__mots= [] + self.__nbManques = 0 + + # Chargement du fichier de mots + self.chargeMots() + + # On commence une nouvelle partie + self.nouvellePartie() + + def chargeMots(self): + f = open('mots.txt', 'r') + s = f.read() + self.__mots = s.split('\n') + f.close() + + def nouvellePartie(self): + + # Boutons-lettres dégrisés + for i in range(26): + self.__boutons[i].config(state=NORMAL) + + # Nouveau mot à devnier et update + self.__mot = self.__mots[randint(0,len(self.__mots)-1)] + self.__motAffiche = len(self.__mot)*'*' + self.__lmot.config(text='Mot : '+self.__motAffiche) + + # on re-init le nbre de coups manqués et on efface le précédent dessin + self.__nbManques = 0 + self.__zoneAffichage.cachePendu() #---> on cache le pendu en utilisant la couleur de fond + + def traitement(self, lettre): + cpt = 0 + lettres = list(self.__motAffiche) + for i in range(len(self.__mot)): + if self.__mot[i]==lettre: + cpt +=1 + lettres[i]=lettre + + self.__motAffiche = ''.join(lettres) + + if cpt ==0: + self.__nbManques += 1 + self.__zoneAffichage.dessinePiecePendu(self.__nbManques) #---> Dessin de l'elt suivant + if self.__nbManques >= 10: + self.finPartie(False) + else: + self.__lmot.config(text='Mot : '+self.__motAffiche) + if self.__mot == self.__motAffiche: + self.finPartie(True) + + def finPartie(self, gagne): + for b in self.__boutons: + b.config(state=DISABLED) + + if gagne : + self.__lmot.config(text=self.__mot+' - Bravo, vous avez gagné') + else : + self.__lmot.config(text='Vous avez perdu, le mot était : '+self.__mot) + + +if __name__ == '__main__': + fen = FenPrincipale() + fen.mainloop() diff --git a/TD5/correction/diagramme_classes_pendu.png b/TD5/correction/diagramme_classes_pendu.png new file mode 100644 index 0000000000000000000000000000000000000000..78a06339ad5447869fa96f0dbdd0d5fbd2c248a9 Binary files /dev/null and b/TD5/correction/diagramme_classes_pendu.png differ