commit 342ac4f44ebeea26cd40e38a69c945736a6771e1 Author: Laura <> Date: Mon Jan 13 11:41:51 2025 +0100 ajout des fichier finaux diff --git a/bataille.pdf b/bataille.pdf new file mode 100644 index 0000000..332a97e Binary files /dev/null and b/bataille.pdf differ diff --git a/bataille/Carte.py b/bataille/Carte.py new file mode 100644 index 0000000..e74fc9d --- /dev/null +++ b/bataille/Carte.py @@ -0,0 +1,19 @@ +class Carte: + """Classe""" + def __init__(self, valeur, couleur): + '''Constructeur de la classe Carte''' + self.valeur = valeur + self.couleur = couleur + + def compare(self, other): + '''Comparaison de deux cartes''' + if self.valeur > other.valeur: + return 1 + if self.valeur < other.valeur: + return -1 + else: + return 0 + + def __str__(self): + '''Renvoie une chaine de caractères représentant la carte''' + return str(self.valeur) + " de " + self.couleur diff --git a/bataille/Jeux.py b/bataille/Jeux.py new file mode 100644 index 0000000..599aa27 --- /dev/null +++ b/bataille/Jeux.py @@ -0,0 +1,23 @@ +from bataille.Carte import Carte +from random import shuffle + +class Jeux: + def __init__(self): + """Constructeur de la classe Jeux""" + couleurs = ["carreau", "coeur", "pique", "trefle"] + valeurs = list(range(2, 15)) # génère une liste de 2 à 14 + self.paquet = [Carte(valeur, couleur) for valeur in valeurs for couleur in couleurs] + + def distribue(self, File): + """Distribution des cartes""" + f1 = File() + f2 = File() + shuffle(self.paquet) + for i, carte in enumerate(self.paquet): + if i % 2 == 0: + f1.enfiler(carte) + else: + f2.enfiler(carte) + return f1, f2 + + diff --git a/gui/gui.py b/gui/gui.py new file mode 100644 index 0000000..7a80118 --- /dev/null +++ b/gui/gui.py @@ -0,0 +1,143 @@ +import tkinter as tk +from tkinter import messagebox +from PIL import Image, ImageTk +from bataille.Jeux import Jeux +from structure.File import File_lst + +class BatailleGUI: + """Interface graphique pour le jeu de bataille""" + + + def __init__(self, root): + """Constructeur de la classe BatailleGUI""" + self.root = root + self.root.title("Jeu de Bataille") + + # Set background image + self.bg_image = Image.open("gui/ressources/tapis.png") + self.bg_image = self.bg_image.resize((1000, 700)) + self.bg_photo = ImageTk.PhotoImage(self.bg_image) + self.bg_label = tk.Label(root, image=self.bg_photo) + self.bg_label.place(relwidth=1, relheight=1) + + self.jeux = Jeux() + self.f1, self.f2 = self.jeux.distribue(File_lst) + + self.total_cartes_label = tk.Label(root, text=f"Total cartes: {len(self.jeux.paquet)}", bg="green", fg="white") + self.total_cartes_label.grid(row=0, column=0, columnspan=3) + + self.canvas_joueur1 = tk.Canvas(root, width=200, height=300, bg="green") + self.canvas_joueur1.grid(row=2, column=0, padx=20, pady=20) + + self.canvas_joueur2 = tk.Canvas(root, width=200, height=300, bg="green") + self.canvas_joueur2.grid(row=2, column=2, padx=20, pady=20) + + self.label_joueur1 = tk.Label(root, text="Joueur 1", bg="green", fg="white") + self.label_joueur1.grid(row=3, column=0) + + self.label_joueur2 = tk.Label(root, text="Joueur 2", bg="green", fg="white") + self.label_joueur2.grid(row=3, column=2) + + self.bouton_tour = tk.Button(root, text="Jouer un tour", command=self.jouer_tour) + self.bouton_tour.grid(row=4, column=1) + + self.bouton_restart = tk.Button(root, text="Redémarrer", command=self.restart_game) + self.bouton_restart.grid(row=5, column=1) + + self.bouton_auto = tk.Button(root, text="Défilement auto", command=self.auto_play) + self.bouton_auto.grid(row=6, column=0) + + self.bouton_quit_auto = tk.Button(root, text="Quitter auto play", command=self.quit_auto_play) + self.bouton_quit_auto.grid(row=6, column=2) + + self.bouton_quit = tk.Button(root, text="Quitter", command=root.quit) + self.bouton_quit.grid(row=7, column=1) + + self.auto_playing = False + + self.update_cartes() + + def update_cartes(self): + """Met à jour les cartes des joueurs""" + self.label_joueur1.config(text=f"Joueur 1: {self.f1.taille()} cartes") + self.label_joueur2.config(text=f"Joueur 2: {self.f2.taille()} cartes") + + if not self.f1.est_vide(): + carte1 = self.f1.tete() + img1 = f"gui/ressources/{carte1.valeur}-{carte1.couleur}.png" + image1 = Image.open(img1) + image1 = image1.resize((200, 300)) + self.photo1 = ImageTk.PhotoImage(image1) + self.canvas_joueur1.create_image(0, 0, anchor=tk.NW, image=self.photo1) + + if not self.f2.est_vide(): + carte2 = self.f2.tete() + img2 = f"gui/ressources/{carte2.valeur}-{carte2.couleur}.png" + image2 = Image.open(img2) + image2 = image2.resize((200, 300)) + self.photo2 = ImageTk.PhotoImage(image2) + self.canvas_joueur2.create_image(0, 0, anchor=tk.NW, image=self.photo2) + + def jouer_tour(self): + """Joue un tour de jeu""" + if self.f1.est_vide() or self.f2.est_vide(): + if self.f1.taille() > self.f2.taille(): + messagebox.showinfo("Fin de la partie", "Le joueur 1 a gagné!") + else: + messagebox.showinfo("Fin de la partie", "Le joueur 2 a gagné!") + self.restart_game() + self.auto_playing = False + return + + + cartes_jouees = [] + + while True: + if self.f1.est_vide() or self.f2.est_vide(): + if self.f1.taille() > self.f2.taille(): + messagebox.showinfo("Fin de la partie", "Le joueur 1 a gagné!") + else: + messagebox.showinfo("Fin de la partie", "Le joueur 2 a gagné!") + self.restart_game() + self.auto_playing = False + return + + carte1 = self.f1.defiler() + carte2 = self.f2.defiler() + cartes_jouees.extend([carte1, carte2]) + + if carte1.valeur > carte2.valeur: + # Ajoutez chaque carte une par une + for carte in cartes_jouees: + self.f1.enfiler(carte) + break + elif carte2.valeur > carte1.valeur: + # Ajoutez chaque carte une par une + for carte in cartes_jouees: + self.f2.enfiler(carte) + break + else: + if self.f1.taille() < 1 or self.f2.taille() < 1: + messagebox.showinfo("Fin de la partie", "Un joueur n'a pas assez de cartes pour continuer!") + return + cartes_jouees.extend([self.f1.defiler(), self.f2.defiler()]) + + self.update_cartes() + + def restart_game(self): + """Redémarre le jeu""" + self.jeux = Jeux() + self.f1, self.f2 = self.jeux.distribue(File_lst) + self.update_cartes() + + def auto_play(self): + """Défilement automatique""" + self.auto_playing = True + while not self.f1.est_vide() and not self.f2.est_vide() and self.auto_playing: + self.jouer_tour() + self.root.update() + self.root.after(300) + + def quit_auto_play(self): + """Quitter le défilement automatique""" + self.auto_playing = False \ No newline at end of file diff --git a/gui/ressources/10-carreau.png b/gui/ressources/10-carreau.png new file mode 100644 index 0000000..f1b4ec5 Binary files /dev/null and b/gui/ressources/10-carreau.png differ diff --git a/gui/ressources/10-coeur.png b/gui/ressources/10-coeur.png new file mode 100644 index 0000000..d3708ab Binary files /dev/null and b/gui/ressources/10-coeur.png differ diff --git a/gui/ressources/10-pique.png b/gui/ressources/10-pique.png new file mode 100644 index 0000000..99d5311 Binary files /dev/null and b/gui/ressources/10-pique.png differ diff --git a/gui/ressources/10-trefle.png b/gui/ressources/10-trefle.png new file mode 100644 index 0000000..75822d5 Binary files /dev/null and b/gui/ressources/10-trefle.png differ diff --git a/gui/ressources/11-carreau.png b/gui/ressources/11-carreau.png new file mode 100644 index 0000000..6b53dbf Binary files /dev/null and b/gui/ressources/11-carreau.png differ diff --git a/gui/ressources/11-coeur.png b/gui/ressources/11-coeur.png new file mode 100644 index 0000000..d995b38 Binary files /dev/null and b/gui/ressources/11-coeur.png differ diff --git a/gui/ressources/11-pique.png b/gui/ressources/11-pique.png new file mode 100644 index 0000000..d9127bd Binary files /dev/null and b/gui/ressources/11-pique.png differ diff --git a/gui/ressources/11-trefle.png b/gui/ressources/11-trefle.png new file mode 100644 index 0000000..439f124 Binary files /dev/null and b/gui/ressources/11-trefle.png differ diff --git a/gui/ressources/12-carreau.png b/gui/ressources/12-carreau.png new file mode 100644 index 0000000..de13853 Binary files /dev/null and b/gui/ressources/12-carreau.png differ diff --git a/gui/ressources/12-coeur.png b/gui/ressources/12-coeur.png new file mode 100644 index 0000000..b3bac22 Binary files /dev/null and b/gui/ressources/12-coeur.png differ diff --git a/gui/ressources/12-pique.png b/gui/ressources/12-pique.png new file mode 100644 index 0000000..df0c8c3 Binary files /dev/null and b/gui/ressources/12-pique.png differ diff --git a/gui/ressources/12-trefle.png b/gui/ressources/12-trefle.png new file mode 100644 index 0000000..5036896 Binary files /dev/null and b/gui/ressources/12-trefle.png differ diff --git a/gui/ressources/13-carreau.png b/gui/ressources/13-carreau.png new file mode 100644 index 0000000..4fd5f51 Binary files /dev/null and b/gui/ressources/13-carreau.png differ diff --git a/gui/ressources/13-coeur.png b/gui/ressources/13-coeur.png new file mode 100644 index 0000000..3f667ee Binary files /dev/null and b/gui/ressources/13-coeur.png differ diff --git a/gui/ressources/13-pique.png b/gui/ressources/13-pique.png new file mode 100644 index 0000000..2acf460 Binary files /dev/null and b/gui/ressources/13-pique.png differ diff --git a/gui/ressources/13-trefle.png b/gui/ressources/13-trefle.png new file mode 100644 index 0000000..9c12503 Binary files /dev/null and b/gui/ressources/13-trefle.png differ diff --git a/gui/ressources/14-carreau.png b/gui/ressources/14-carreau.png new file mode 100644 index 0000000..44c014a Binary files /dev/null and b/gui/ressources/14-carreau.png differ diff --git a/gui/ressources/14-coeur.png b/gui/ressources/14-coeur.png new file mode 100644 index 0000000..aa763b4 Binary files /dev/null and b/gui/ressources/14-coeur.png differ diff --git a/gui/ressources/14-pique.png b/gui/ressources/14-pique.png new file mode 100644 index 0000000..04f807e Binary files /dev/null and b/gui/ressources/14-pique.png differ diff --git a/gui/ressources/14-trefle.png b/gui/ressources/14-trefle.png new file mode 100644 index 0000000..0298b01 Binary files /dev/null and b/gui/ressources/14-trefle.png differ diff --git a/gui/ressources/2-carreau.png b/gui/ressources/2-carreau.png new file mode 100644 index 0000000..df03ca2 Binary files /dev/null and b/gui/ressources/2-carreau.png differ diff --git a/gui/ressources/2-coeur.png b/gui/ressources/2-coeur.png new file mode 100644 index 0000000..7cd7062 Binary files /dev/null and b/gui/ressources/2-coeur.png differ diff --git a/gui/ressources/2-pique.png b/gui/ressources/2-pique.png new file mode 100644 index 0000000..f194169 Binary files /dev/null and b/gui/ressources/2-pique.png differ diff --git a/gui/ressources/2-trefle.png b/gui/ressources/2-trefle.png new file mode 100644 index 0000000..b0a5b7d Binary files /dev/null and b/gui/ressources/2-trefle.png differ diff --git a/gui/ressources/3-carreau.png b/gui/ressources/3-carreau.png new file mode 100644 index 0000000..9e569e0 Binary files /dev/null and b/gui/ressources/3-carreau.png differ diff --git a/gui/ressources/3-coeur.png b/gui/ressources/3-coeur.png new file mode 100644 index 0000000..c2cbced Binary files /dev/null and b/gui/ressources/3-coeur.png differ diff --git a/gui/ressources/3-pique.png b/gui/ressources/3-pique.png new file mode 100644 index 0000000..37d7fc8 Binary files /dev/null and b/gui/ressources/3-pique.png differ diff --git a/gui/ressources/3-trefle.png b/gui/ressources/3-trefle.png new file mode 100644 index 0000000..10f3d24 Binary files /dev/null and b/gui/ressources/3-trefle.png differ diff --git a/gui/ressources/4-carreau.png b/gui/ressources/4-carreau.png new file mode 100644 index 0000000..c7f9402 Binary files /dev/null and b/gui/ressources/4-carreau.png differ diff --git a/gui/ressources/4-coeur.png b/gui/ressources/4-coeur.png new file mode 100644 index 0000000..f8aea3d Binary files /dev/null and b/gui/ressources/4-coeur.png differ diff --git a/gui/ressources/4-pique.png b/gui/ressources/4-pique.png new file mode 100644 index 0000000..88021e8 Binary files /dev/null and b/gui/ressources/4-pique.png differ diff --git a/gui/ressources/4-trefle.png b/gui/ressources/4-trefle.png new file mode 100644 index 0000000..de987a9 Binary files /dev/null and b/gui/ressources/4-trefle.png differ diff --git a/gui/ressources/5-carreau.png b/gui/ressources/5-carreau.png new file mode 100644 index 0000000..b323201 Binary files /dev/null and b/gui/ressources/5-carreau.png differ diff --git a/gui/ressources/5-coeur.png b/gui/ressources/5-coeur.png new file mode 100644 index 0000000..1244326 Binary files /dev/null and b/gui/ressources/5-coeur.png differ diff --git a/gui/ressources/5-pique.png b/gui/ressources/5-pique.png new file mode 100644 index 0000000..bfdca6c Binary files /dev/null and b/gui/ressources/5-pique.png differ diff --git a/gui/ressources/5-trefle.png b/gui/ressources/5-trefle.png new file mode 100644 index 0000000..0126508 Binary files /dev/null and b/gui/ressources/5-trefle.png differ diff --git a/gui/ressources/6-carreau.png b/gui/ressources/6-carreau.png new file mode 100644 index 0000000..62b507b Binary files /dev/null and b/gui/ressources/6-carreau.png differ diff --git a/gui/ressources/6-coeur.png b/gui/ressources/6-coeur.png new file mode 100644 index 0000000..c82b07f Binary files /dev/null and b/gui/ressources/6-coeur.png differ diff --git a/gui/ressources/6-pique.png b/gui/ressources/6-pique.png new file mode 100644 index 0000000..7a1acb3 Binary files /dev/null and b/gui/ressources/6-pique.png differ diff --git a/gui/ressources/6-trefle.png b/gui/ressources/6-trefle.png new file mode 100644 index 0000000..7fc1ae1 Binary files /dev/null and b/gui/ressources/6-trefle.png differ diff --git a/gui/ressources/7-carreau.png b/gui/ressources/7-carreau.png new file mode 100644 index 0000000..8f9abd5 Binary files /dev/null and b/gui/ressources/7-carreau.png differ diff --git a/gui/ressources/7-coeur.png b/gui/ressources/7-coeur.png new file mode 100644 index 0000000..2ef75db Binary files /dev/null and b/gui/ressources/7-coeur.png differ diff --git a/gui/ressources/7-pique.png b/gui/ressources/7-pique.png new file mode 100644 index 0000000..de92ddf Binary files /dev/null and b/gui/ressources/7-pique.png differ diff --git a/gui/ressources/7-trefle.png b/gui/ressources/7-trefle.png new file mode 100644 index 0000000..2229155 Binary files /dev/null and b/gui/ressources/7-trefle.png differ diff --git a/gui/ressources/8-carreau.png b/gui/ressources/8-carreau.png new file mode 100644 index 0000000..26b94bb Binary files /dev/null and b/gui/ressources/8-carreau.png differ diff --git a/gui/ressources/8-coeur.png b/gui/ressources/8-coeur.png new file mode 100644 index 0000000..d4640c4 Binary files /dev/null and b/gui/ressources/8-coeur.png differ diff --git a/gui/ressources/8-pique.png b/gui/ressources/8-pique.png new file mode 100644 index 0000000..e2075eb Binary files /dev/null and b/gui/ressources/8-pique.png differ diff --git a/gui/ressources/8-trefle.png b/gui/ressources/8-trefle.png new file mode 100644 index 0000000..5c6384b Binary files /dev/null and b/gui/ressources/8-trefle.png differ diff --git a/gui/ressources/9-carreau.png b/gui/ressources/9-carreau.png new file mode 100644 index 0000000..1038d46 Binary files /dev/null and b/gui/ressources/9-carreau.png differ diff --git a/gui/ressources/9-coeur.png b/gui/ressources/9-coeur.png new file mode 100644 index 0000000..0176cc1 Binary files /dev/null and b/gui/ressources/9-coeur.png differ diff --git a/gui/ressources/9-pique.png b/gui/ressources/9-pique.png new file mode 100644 index 0000000..723743d Binary files /dev/null and b/gui/ressources/9-pique.png differ diff --git a/gui/ressources/9-trefle.png b/gui/ressources/9-trefle.png new file mode 100644 index 0000000..88c7125 Binary files /dev/null and b/gui/ressources/9-trefle.png differ diff --git a/gui/ressources/dos-bleu.png b/gui/ressources/dos-bleu.png new file mode 100644 index 0000000..c7748e6 Binary files /dev/null and b/gui/ressources/dos-bleu.png differ diff --git a/gui/ressources/joker-noir.png b/gui/ressources/joker-noir.png new file mode 100644 index 0000000..77bf6c0 Binary files /dev/null and b/gui/ressources/joker-noir.png differ diff --git a/gui/ressources/joker-rouge.png b/gui/ressources/joker-rouge.png new file mode 100644 index 0000000..a436117 Binary files /dev/null and b/gui/ressources/joker-rouge.png differ diff --git a/gui/ressources/tapis.png b/gui/ressources/tapis.png new file mode 100644 index 0000000..98cdfbd Binary files /dev/null and b/gui/ressources/tapis.png differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..27f9b9e --- /dev/null +++ b/main.py @@ -0,0 +1,7 @@ +import tkinter as tk +from gui.gui import BatailleGUI + +if __name__ == "__main__": + root = tk.Tk() + app = BatailleGUI(root) + root.mainloop() \ No newline at end of file diff --git a/structure/File.py b/structure/File.py new file mode 100644 index 0000000..64919e6 --- /dev/null +++ b/structure/File.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +class File_lst: + """Implémentation d'une file par une liste.""" + def __init__(self): + """Crée une file vide.""" + self.__file = [] + + def est_vide(self): + """Indique si la file est vide.""" + return self.__file == [] + + def enfiler(self, valeur): + """Enfile l'élément valeur.""" + self.__file.append(valeur) + + def defiler(self): + """Défile la tête de la file et la renvoie.""" + return self.__file.pop(0) + + def taille(self): + """Renvoie la taille de la file.""" + return len(self.__file) + + def tete(self): + """Renvoie la tête de la file (sans la défiler).""" + return self.__file[0] + + def __str__(self): + s = "tete->" + for val in self.__file: + s += str(val) + "->" + return s + "queue" + + +class Maillon: + """Un maillon d'une liste doublement chaînée.""" + def __init__(self, precedent, valeur, suivant): + self.valeur = valeur + self.precedent = precedent + self.suivant = suivant + + def __str__(self): + return str(self.valeur) + + +class File_chaine: + """Implémentation d'une file par une liste doublement chaînée.""" + def __init__(self): + """Crée une file vide.""" + self.__debut = self.__fin = None + self.__taille = 0 + + def est_vide(self): + """Indique si la file est vide.""" + return self.__taille == 0 + + def enfiler(self, valeur): + """Enfile l'élément valeur.""" + maillon = Maillon(self.__fin, valeur, None) + if self.est_vide(): + self.__debut = self.__fin = maillon + else: + self.__fin.suivant = maillon + self.__fin = maillon + self.__taille += 1 + + def defiler(self): + """Défile la tête de la file et la renvoie.""" + if self.est_vide(): + raise IndexError("Impossible de défiler une file vide.") + valeur = self.__debut.valeur + self.__taille -= 1 + if self.est_vide(): + self.__debut = self.__fin = None + else: + self.__debut = self.__debut.suivant + self.__debut.precedent = None + return valeur + + def taille(self): + """Renvoie la taille de la file.""" + return self.__taille + + def tete(self): + """Renvoie la tête de la file (sans la défiler).""" + if self.est_vide(): + raise IndexError("Une file vide n'a pas de tête.") + return self.__debut.valeur + + def __str__(self): + s = "tete->" + maillon = self.__debut + while maillon is not None: + s += str(maillon) + "->" + maillon = maillon.suivant + return s + "queue" + + +if __name__ == "__main__": + f = File_lst() + print(f.est_vide()) + f.enfiler('A') + f.enfiler('B') + f.enfiler('C') + print(f.est_vide()) + print(f.tete()) + print(f) + print(f.taille()) + print(f.defiler()) + print(f.defiler()) + print(f.defiler()) + print(f.est_vide()) diff --git a/structure/Pile.py b/structure/Pile.py new file mode 100644 index 0000000..99f95b2 --- /dev/null +++ b/structure/Pile.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from listeChaine import ListeChaine + +class Pile_lst: + """Implémentation d'une pile par une liste.""" + def __init__(self): + """Crée une pile vide.""" + self.__pile = [] + + def est_vide(self): + """Indique si la pile est vide.""" + return self.__pile == [] + + def empiler(self, valeur): + """Empile la valeur.""" + self.__pile.append(valeur) + + def depiler(self): + """Dépile le sommet de la pile et le renvoie.""" + return self.__pile.pop() + + def taille(self): + """Renvoie la taille de la pile.""" + return len(self.__pile) + + def sommet(self): + """Renvoie le sommet de la pile (sans le dépiler).""" + return self.__pile[-1] + + def __str__(self): + s = "|" + for val in self.__pile: + s = str(val) + "->" + s + return s + + +class Pile_chaine: + """Implémentation d'une pile par une liste chaînée.""" + def __init__(self): + """Crée une pile vide.""" + self.__pile = ListeChaine() + self.__taille = 0 + + def est_vide(self): + """Indique si la pile est vide.""" + return self.__taille == 0 + + def empiler(self, valeur): + """Empile la valeur.""" + self.__pile.ajoute(valeur) + self.__taille += 1 + + def depiler(self): + """Dépile le sommet de la pile et le renvoie.""" + if self.est_vide(): + raise IndexError("Impossible de dépiler une pile vide.") + valeur = self.__pile.tete() + self.__pile = self.__pile.queue() + self.__taille -= 1 + return valeur + + def taille(self): + """Renvoie la taille de la pile.""" + return self.__taille + + def sommet(self): + """Renvoie le sommet de la pile (sans le dépiler).""" + if self.est_vide(): + raise IndexError("Une pile vide n'a pas de sommet.") + return self.__pile.tete() + + def __str__(self): + return str(self.__pile) + "->|" + + +if __name__ == "__main__": + p = Pile_lst() + print(p.est_vide()) + p.empiler('A') + p.empiler('B') + p.empiler('C') + print(p.est_vide()) + print(p.sommet()) + print(p) + print(p.taille()) + print(p.depiler()) + print(p.depiler()) + print(p.depiler()) + print(p.est_vide()) diff --git a/structure/listeChaine.py b/structure/listeChaine.py new file mode 100644 index 0000000..f2e153e --- /dev/null +++ b/structure/listeChaine.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue Sep 22 20:44:35 2020 + +@author: manu +""" + + +class Maillon: + """Un maillon d'une liste chaînée.""" + def __init__(self, valeur, suivant): + self.valeur = valeur + self.suivant = suivant + + def __str__(self): + """Renvoie une chane de caractères représentant le maillon.""" + return str(self.valeur) + + +class ListeChaine: + """Une liste chaînée.""" + def __init__(self, tete=None): + """Crée une liste vide, ou une liste dont la tete (un maillon) + est donnée.""" + self.__tete = tete + + def est_vide(self): + """Indique si la liste est vide.""" + return self.__tete is None + + def tete(self): + """Renvoie la valeur du premier élément de la liste.""" + if self.est_vide(): + raise IndexError("La liste vide n'a pas de tête") + return self.__tete.valeur + + def queue(self): + """Renvoie la queue de la liste.""" + if self.est_vide(): + raise IndexError("La liste vide n'a pas de queue") + return ListeChaine(self.__tete.suivant) + + def ajoute(self, valeur): + """ajoute `valeur` en tête de la liste.""" + self.__tete = Maillon(valeur, self.__tete) + + def __str__(self): + """Renvoie une chaîne de caractères représentant la liste.""" + maillon = self.__tete + s = '' + while maillon is not None: + s = s + str(maillon.valeur) + maillon = maillon.suivant + if maillon is not None: + s += '->' + return s + + def __len__(self): + """Renvoie la longueur de la liste.""" + maillon = self.__tete + long = 0 + while maillon is not None: + long = long + 1 + maillon = maillon.suivant + return long + + def __getitem__(self, n): + """Renvoie l'élément d'indice n de la liste.""" + maillon = self.__tete + i = 0 + while i < n and maillon is not None: + i = i + 1 + maillon = maillon.suivant + if maillon is None or n < 0: + raise IndexError("Indice non valide") + return maillon.valeur + + def __add__(self, other): + """Renvoie la liste correspondant à la concaténation des 2 listes.""" + if self.est_vide(): + return other + v = self.tete() + q = self.queue() + return ListeChaine(Maillon(v, (q + other).__tete)) + + def reverse(self): + """Renvoie une liste correspondant à la liste renversée.""" + res = ListeChaine() + maillon = self.__tete + while maillon is not None: + res.ajoute(maillon.valeur) + maillon = maillon.suivant + return res + + +if __name__ == "__main__": + lst = ListeChaine() + print(lst.est_vide()) + lst.ajoute(306) + lst.ajoute(42) + lst.ajoute(205) + print(lst) + print(lst.est_vide()) + print(lst[0]) + print(lst[1]) + print(len(lst)) + lst2 = ListeChaine() + lst2.ajoute(18) + lst2.ajoute(45) + print(lst + lst2)