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