From c635951b33d8fe36a69e7936a9a0c7a2bba770db Mon Sep 17 00:00:00 2001
From: Margaux Haller <margaux.haller2@etu.univ-lorraine.fr>
Date: Mon, 18 Mar 2024 08:25:16 +0100
Subject: [PATCH] ajout des fichiers avant TD Debug

---
 qualdev/TD Exceptions.ts | 141 +++++++++++++++++++++++++++++++++++++
 qualdev/TD_Debug.ts      |   0
 src/.~lock.UML.odt#      |   1 +
 src/TDEncapsulation.ts   | 126 +++++++++++++++++++++++++++++++++
 src/TDUML.ts             | 148 +++++++++++++++++++++++++++++++++++++++
 src/TDclasses.ts         | 119 +++++++++++++++++++++++++++++--
 src/UML.odt              | Bin 0 -> 13243 bytes
 src/snake/app.css        |   5 ++
 src/snake/app.js         |  61 ++++++++++++++++
 src/snake/index.html     |  15 ++++
 10 files changed, 610 insertions(+), 6 deletions(-)
 create mode 100644 qualdev/TD Exceptions.ts
 create mode 100644 qualdev/TD_Debug.ts
 create mode 100644 src/.~lock.UML.odt#
 create mode 100644 src/TDEncapsulation.ts
 create mode 100644 src/TDUML.ts
 create mode 100644 src/UML.odt
 create mode 100644 src/snake/app.css
 create mode 100644 src/snake/app.js
 create mode 100644 src/snake/index.html

diff --git a/qualdev/TD Exceptions.ts b/qualdev/TD Exceptions.ts
new file mode 100644
index 0000000..02fed64
--- /dev/null
+++ b/qualdev/TD Exceptions.ts	
@@ -0,0 +1,141 @@
+class NomVideError extends Error {
+    constructor(message = "La chaine nom est vide") {
+        super(message);
+        this.name = "NomVideError";
+    }
+}
+
+class PrenomVideError extends Error {
+    constructor(message = "La chaine prenom est vide") {
+        super(message);
+        this.name = "PrenomVideError";
+    }
+}
+
+class NomEtPrenomVideError extends Error {
+    constructor(message = "Les chaines nom et prenom sont vides") {
+        super(message);
+        this.name = "NomEtPrenomVideError";
+    }
+}
+
+function creeInitiales1(nom: string, prenom: string): string | Error {
+    if (nom.length === 0 && prenom.length !== 0) return new NomVideError;
+    else if (nom.length !== 0 && prenom.length === 0) return new PrenomVideError;
+    else if (nom.length === 0 && prenom.length === 0) return new NomEtPrenomVideError;
+    return nom[0].toUpperCase() + prenom[0].toUpperCase();
+}
+
+try {
+    creeInitiales1("", "");
+} catch (e) {
+    if (e instanceof NomVideError) {
+        console.log("La chaine nom est vide");
+    }
+    else if (e instanceof PrenomVideError) {
+        console.log("La chaine prenom est vide");
+    }
+    else if (e instanceof NomEtPrenomVideError) {
+        console.log("Les chaines nom et prenom sont vides");
+    }
+    else {
+        console.log(e.message);
+    }
+} finally {
+    console.log("Fin du programme");
+}
+
+// 2. celle des cha^ines vides
+
+// 7. Non, un seul type d'erreur suffi
+
+class ChaineVideError extends Error {
+    constructor(message = "Au moins une chaine est vide") {
+        super(message);
+        this.name = "ChaineVideError";
+    }
+}
+
+function creeInitiales(nom: string, prenom: string): string | Error {
+    if (nom.length === 0 || prenom.length === 0) return new ChaineVideError;
+    return nom[0].toUpperCase() + prenom[0].toUpperCase();
+}
+
+try {
+    creeInitiales("", "");
+} catch (e) {
+    if (e instanceof ChaineVideError) {
+        console.log("Au moins une chaine est vide");
+    }
+    else {
+        console.log(e.message);
+    }
+} finally {
+    console.log("Fin du programme");
+}
+
+
+// ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Exercice 2 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  ~ ~ ~ ~ ~ ~ 
+
+class Etudiant {
+    INE: string;
+    nom: string;
+    prenom: string;
+}
+
+let jean = new Etudiant();
+jean.nom = "jean";
+jean.prenom = "Valjean";
+
+class INEError extends Error {
+    constructor(message = "Format incorrect") {
+        super(message);
+        this.name = "INEError";
+    }
+}
+
+function setINE(ine: string, objet: Etudiant): void {
+    let estCorrect = true;
+    let compteur = 0;
+    while ((compteur != ine.length) && estCorrect) {
+        if (compteur <= 9 && (ine[compteur] !== String(Number))) {
+            estCorrect = false;
+        } else if (compteur > 10 && (isLetter(ine[compteur]) === false)) {
+            estCorrect = false;
+        } else if (compteur === 10 && (ine[compteur] !== String(Number)) && isLetter(ine[compteur]) === false) {
+            estCorrect = false;
+        }
+        compteur++;
+    }
+
+    if (estCorrect === false) {
+        throw INEError;
+    }
+
+    objet.INE = ine;
+    console.log("C'est fait");
+
+}
+
+function isLetter(c: string): boolean {
+    return (c >= "a" && c <= "z") || (c >= "A" && c <= "Z");
+}
+
+
+try {
+    setINE("1010101010r", jean);
+} catch (e) {
+    if (e instanceof INEError) {
+        console.log("Format incorrect");
+    }
+    else {
+        console.log(e.message);
+    }
+} finally {
+    console.log("Fin du programme");
+}
+
+console.log(jean.INE)
+
+
+
diff --git a/qualdev/TD_Debug.ts b/qualdev/TD_Debug.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/.~lock.UML.odt# b/src/.~lock.UML.odt#
new file mode 100644
index 0000000..2788e45
--- /dev/null
+++ b/src/.~lock.UML.odt#
@@ -0,0 +1 @@
+,e0088u,iutm-inf-f33-14,13.03.2024 08:58,file:///home/e0088u/.config/libreoffice/4;
\ No newline at end of file
diff --git a/src/TDEncapsulation.ts b/src/TDEncapsulation.ts
new file mode 100644
index 0000000..d4a2d7f
--- /dev/null
+++ b/src/TDEncapsulation.ts
@@ -0,0 +1,126 @@
+// Les pistes audio
+
+class Piste {
+    private _titre: string;
+    private _duree: number;
+
+    constructor(titre: string, duree: number) {
+        this._titre = titre;
+        this._duree = duree;
+    }
+
+    getTitre(): string {
+        return this._titre;
+    }
+
+    setTitre(titre: string): void {
+        this._titre = titre;
+    }
+
+    getDuree(): number {
+        return this._duree;
+    }
+
+    egale(piste1: Piste, piste2: Piste): boolean {
+        if (piste1._duree === piste2._duree && piste1._titre === piste2._titre) {
+            return true;
+        }
+        return false;
+    }
+
+    toString(): string {
+        return "La chanson " + this._titre + "dure " + this._duree + "."
+    }
+}
+
+class Album {
+    private _titre: string;
+    private _nbPistes: number;
+    private _listePistes: Array<Piste>;
+
+    setTitre(titre: string) {
+        this._titre = titre;
+    }
+
+    getListe() {
+        return this._listePistes;
+    }
+
+    setListe(pisteAAjouter: Piste, album: Album) {
+        album._listePistes.push(pisteAAjouter);
+    }
+
+    estFini(): boolean {
+        if (this._listePistes.length === this._nbPistes) {
+            return true;
+        }
+        return false;
+    }
+
+    contient(titreAChercher: string, pisteDemandee: Album): boolean {
+        for (let element of pisteDemandee.getListe()) {
+            if (element.getTitre() === titreAChercher) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    ajouterPiste(album: Album, titre: Piste): void {
+        if (album._listePistes.length !== album._nbPistes) {
+            album._listePistes.push(titre);
+
+        }
+    }
+
+    dureeTotale(album: Album): number {
+        let temps = 0;
+        for (let element of album._listePistes) {
+            temps += element.getDuree();
+        }
+        return temps;
+    }
+
+    egale(album1: Album, album2: Album): boolean {
+        let existeTitreDifferent = true;
+        for (let element1 of album1._listePistes) {
+            for (let element2 of album2._listePistes) {
+                if (element1 === element2) {
+                    existeTitreDifferent = false;
+                }
+                else {
+                    existeTitreDifferent = true;
+                    break;
+                }
+            }
+        }
+        return existeTitreDifferent;
+    }
+}
+
+/*
+ _________________________________________________________________
+|Album                                                            |
+|_________________________________________________________________|
+|- titre: string                                                  |
+|- nbPistes: int                                                  |
+|- listePistes: Array<Piste>                                      |
+|_________________________________________________________________|
+|+ getListe()                                                     |
+|+ setListe(pisteAAjouter: Piste, album: Album)                   |
+|+ estFini(): boolean                                             |
+|+ contient(titreAChercher: string, pisteDemandee: Album): boolean|
+|+ ajouterPiste(album: Album): void                               |
+|+ dureeTotale(album: Album): float                               |
+|+ egale(album1: Album, album2: Album): boolean                   |
+|_________________________________________________________________|
+*/
+
+let p1 = new Piste("t1", 230);
+let p2 = new Piste("t2", 180);
+
+let d = new Album();
+d.setTitre("td");
+d.ajouterPiste(d, p1);
+d.ajouterPiste(d, p2);
+
diff --git a/src/TDUML.ts b/src/TDUML.ts
new file mode 100644
index 0000000..c33304f
--- /dev/null
+++ b/src/TDUML.ts
@@ -0,0 +1,148 @@
+/*
+ _____________________________________________
+|                                             |
+|_____________________________________________|
+|                                             |
+|_____________________________________________|
+|                                             |
+|_____________________________________________|
+*/
+
+/*
+ ___________________________________________________
+|Ampoule                                            |
+|___________________________________________________|
+|couleur : int                                      |
+|puissance : double                                 |
+|___________________________________________________|
+|Ampoule(couleur: int = 0, puissance: int = 0): void|
+|allumer(): void                                    |
+|eteindre(): void                                   |
+|getCouleur(): int                                  |
+|setCouleur(couleur: int): void                     |
+|getPuissance(): double                             |
+|setPuissance(puissance: double): void              |
+|toString(): string                                 |
+|___________________________________________________|
+*/
+
+class Timer {
+    periode: number;
+    etat: boolean;
+
+    constructor() {
+
+    }
+
+    constructor1(periode: number) {
+
+    }
+
+    getPeriode(): number {
+        /* code */
+        return 1;
+    }
+
+    setPeriode(periode: number) {
+
+    }
+
+    activer(): void {
+
+    }
+
+    desactiver(): void {
+
+    }
+
+    utiliser(): void {
+
+    }
+
+    toString(): string {
+        return "Kartoffel"
+    }
+}
+
+
+/*
+ _____________________________________________
+|Point                                        |
+|_____________________________________________|
+|x:float                                      |
+|y:float                                      |
+|_____________________________________________|
+|                                             |
+|_____________________________________________|
+*/
+
+/*
+ ____________________________________________________________________________________________________
+|Cercle                                                                                              |
+|____________________________________________________________________________________________________|
+|rayon: int = 0                                                                                    |
+|centre: Point                                                                                       |
+|____________________________________________________________________________________________________|
+|pointDansCercle(cercle: Cercle, point: Point): boolean                                              |
+|rectangleDansCercle(coin1: Point, coin2: Point, coin3: Point, coin4: Point, cercle: Cercle): boolean|                                                      |
+|chevauchement(coin1: Point, coin2: Point, coin3: Point, coin4: Point, cercle: Cercle): boolean      |
+|____________________________________________________________________________________________________|
+*/
+
+/*
+ _____________________________________________________
+|Temps                                                |
+|_____________________________________________________|
+|heure:int                                            |
+|minute:int                                           |
+|second:int                                           |
+|_____________________________________________________|
+|temps2Number(objet: Temps): int                      |
+|number2Temps(temps: int): Temps                      |
+|multiplieTemps(temps: Temps, multiplieur: int): Temps|
+|multiplie(t: Temps, nb: int): void                   |
+|vitesseMoyenne(temps: Temps, distance: float)        |
+|_____________________________________________________|
+*/
+
+/*
+ _____________________________________________
+|Caractere                                    |
+|_____________________________________________|
+|carcAConserver:char = " "                    |
+|_____________________________________________|
+|estVoyelle(): boolean                        |
+|nbVoyelles(message: string): int             |
+|_____________________________________________|
+*/
+
+/*
+ _____________________________________________
+|Rectangle                                    |
+|_____________________________________________|
+|longueur:int = 1                             |
+|largeur:int = 1                              |
+|_____________________________________________|
+|perimetre(): int                             |
+|surface(): int                               |
+|agrandir(multiple: int): void                |
+|afficherRectangle(rect: Rectangle)           |
+|_____________________________________________|
+*/
+
+/*
+ _____________________________________________
+|Reservoir                                    |
+|_____________________________________________|
+|capacite: float                              |
+|rempli: float                                |
+|_____________________________________________|
+|verse(quantite: float): float                |
+|puise(quantite: float): float                |
+|jauge():float                                |
+|_____________________________________________|
+*/
+
+
+
+// Ajouter les constructeurs
\ No newline at end of file
diff --git a/src/TDclasses.ts b/src/TDclasses.ts
index 264967c..78feb32 100644
--- a/src/TDclasses.ts
+++ b/src/TDclasses.ts
@@ -47,10 +47,10 @@ function temps2Number(objet: Temps): number {
     return (objet.heure * 3600) + (objet.minute * 60) + objet.second;
 }
 
-test = new Temps()
-test.heure = 1
-test.minute = 30
-test.second = 5
+let test1 = new Temps()
+test1.heure = 1
+test1.minute = 30
+test1.second = 5
 
 //console.log(temps2Number(test));
 
@@ -64,8 +64,115 @@ function number2Temps(temps: number): Temps {
     return objet;
 }
 
-console.log(number2Temps(5405));
+//console.log(number2Temps(6670));
 
 function multiplieTemps(temps: Temps, multiplieur: number): Temps {
     return number2Temps(temps2Number(temps) * multiplieur);
-}
\ No newline at end of file
+}
+
+// non, pointeur
+
+function multiplie(t: Temps, nb: number): void {
+    const t2 = multiplieTemps(t, nb)
+    t.heure = t2.heure;
+    t.minute = t2.minute;
+    t.second = t2.second;
+}
+
+/* let i = 2;
+multiplie(test1, i);
+console.log(test1); */
+
+
+//???
+
+function vitesseMoyenne(temps: Temps, distance: number) {
+    return temps2Number(temps) / distance;
+}
+
+let vitesse = vitesseMoyenne(test1, 10);
+console.log(vitesse);
+
+class Caractere {
+    caracAConserver = " ";
+    estVoyelle(): boolean {
+        if (this.caracAConserver === "a" || this.caracAConserver === "A" || this.caracAConserver === "e" || this.caracAConserver === "E" || this.caracAConserver === "i" || this.caracAConserver === "I" || this.caracAConserver === "o" || this.caracAConserver === "O" || this.caracAConserver === "u" || this.caracAConserver === "U" || this.caracAConserver === "y" || this.caracAConserver === "Y") {
+            return true;
+        }//RegExp
+
+        return false;
+    }
+}
+
+function nbVoyelles(message: string): number {
+    let lettre = new Caractere()
+    let compteur = 0;
+    for (let i = 0; i <= message.length; i++) {
+        lettre.caracAConserver = message[i];
+        if (lettre.estVoyelle()) compteur += 1;
+    }
+    return compteur;
+}
+
+console.log(nbVoyelles("potatoes"))
+
+class Rectangle {
+    longueur = 1;
+    largeur = 1;
+    perimetre(): number {
+        return 2 * this.longueur + 2 * this.largeur
+    }
+    surface(): number {
+        return this.longueur * this.largeur
+    }
+    agrandir(multiple: number): void {
+        this.longueur *= multiple;
+        this.largeur *= multiple;
+    }
+    static afficherRectangle(rect: Rectangle) {
+        console.log("largeur = ", rect.largeur, "longueur = ", rect.longueur)
+    }
+}
+
+let carre = new Rectangle()
+carre.largeur = 5;
+carre.longueur = 5;
+console.log(carre.perimetre(), carre.surface())
+carre.agrandir(3)
+console.log(carre.largeur, carre.longueur)
+
+class Reservoir {
+    capacite: number
+    rempli: number
+    verse(quantite: number): number {
+        let surplus = 0;
+        if (this.rempli + quantite <= this.capacite) {
+            this.rempli += quantite
+            return surplus
+        }
+        surplus = this.rempli + quantite - this.capacite;
+        this.rempli = this.capacite;
+        return surplus;
+    }
+    puise(quantite: number): number {
+        let aEtePuise = 0;
+        if (this.rempli - quantite >= 0) {
+            this.rempli -= quantite;
+            return this.rempli;
+        }
+        let calcul = this.rempli - quantite;
+        while (calcul !== 0) {
+            aEtePuise += 1;
+            calcul += 1;
+        }
+        return quantite - aEtePuise;
+    }
+    jauge(): number {
+        return this.rempli;
+    }
+}
+
+let bouteilleDEau = new Reservoir();
+bouteilleDEau.capacite = 100;
+bouteilleDEau.rempli = 90;
+console.log("Glouglou", bouteilleDEau.puise(4), bouteilleDEau.jauge(), bouteilleDEau.verse(1), bouteilleDEau.verse(20))
\ No newline at end of file
diff --git a/src/UML.odt b/src/UML.odt
new file mode 100644
index 0000000000000000000000000000000000000000..9721646898b16d6059efce6e49d4c492fd191666
GIT binary patch
literal 13243
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
Y5<0+}l?|j!kU@|km4$)9K_A2e0GzK;`v3p{

literal 0
HcmV?d00001

diff --git a/src/snake/app.css b/src/snake/app.css
new file mode 100644
index 0000000..9a956d3
--- /dev/null
+++ b/src/snake/app.css
@@ -0,0 +1,5 @@
+#board {
+    width: 800px;
+    height: 800px;
+    background-color: #000;
+}
\ No newline at end of file
diff --git a/src/snake/app.js b/src/snake/app.js
new file mode 100644
index 0000000..7471c36
--- /dev/null
+++ b/src/snake/app.js
@@ -0,0 +1,61 @@
+const board = document.querySelector("#board");
+
+let direction = {
+  x: 1,
+  y: 0,
+};
+
+let hasWon = false;
+let hasLost = false;
+
+let startDate = new Date();
+let workingDate = new Date();
+
+const snake = [
+    {x: 40, y: 40},
+    {x: 40, y: 41},
+    {x: 40, y: 42},
+    {x: 40, y: 43},
+    {x: 40, y: 44},
+    {x: 41, y: 44},
+    {x: 42, y: 44},
+    {x: 42, y: 45},
+    {x: 42, y: 46},
+  ];
+
+  function gestionTouchesAppuye(event) {
+    switch(event.key) {
+      case 'ArrowLeft':
+        console.log("Touche Gauche pressée");
+        break;
+      case 'ArrowUp':
+        console.log("Touche Haut pressée");
+        break;
+      case 'ArrowRight':
+        console.log("Touche Droite pressée");
+        break;
+      case 'ArrowDown':
+        console.log("Touche Bas pressée");
+        break;
+    }
+  }
+
+  // Ajouter un écouteur d'événements pour détecter les touches pressées
+document.addEventListener('keydown', gestionTouchesAppuye);
+ const context = board.getContext('2d');
+
+setInterval(() => {
+
+    console.log("tick");
+
+    
+
+
+
+//   RESTE A FAIRE :
+//   gestion du snake
+//   gestion des bordures
+//   gestion de la direction
+//   gestion on mange une pomme
+
+}, 400);
\ No newline at end of file
diff --git a/src/snake/index.html b/src/snake/index.html
new file mode 100644
index 0000000..8449f21
--- /dev/null
+++ b/src/snake/index.html
@@ -0,0 +1,15 @@
+<html>
+
+<head>
+    <link rel="stylesheet" href="app.css">
+</head>
+
+<body>
+    <h1>Snake Game</h1>
+    <h2>Arrow to play</h2>
+    <canvas width="800" height="800" id="board"></canvas>
+    <script src="app.js"></script>
+
+</body>
+
+</html>
\ No newline at end of file
-- 
GitLab