<repo_name>tanoshiibot/the-hangman<file_sep>/README.md
# The Hangman
Exercice BeCode : réalisation d'un pendu en js.
*<NAME>* 

## Comment jouer ?

Vous pouvez jouer à la version HTML du jeu [ici](https://tanoshiibot.github.io/the-hangman/). Cependant, cette version ne servait que de débug avant de me lancer sur la version pour bot Discord. Pour le lancer, intégrez le code à votre bot (vous aurez besoin de discord.js).

**index.html**/**script.js**/**style.css** et le dossier **img** concernent la version HTML.
**main.js**/**hangman.js** concernent la version pour bot Discord.

### Jouer au pendu sur Discord :

* Pour démarrer le pendu, écrivez `>pendu start`. Le bot va générer un pendu. Utilisez également cette commande pour redémarrer une partie.

![Screenshot: >pendu start](https://raw.githubusercontent.com/tanoshiibot/the-hangman/main/screenshots/start.PNG)

* Écrivez ensuite `>pendu [votre proposition de lettre]` pour proposer une lettre. Le dessin du pendu va se continuer si le mot ne contient pas la lettre, et placera la lettre dans les cases correspondantes si elle s'y trouve.

![Screenshot: >pendu [proposition de lettre]](https://github.com/tanoshiibot/the-hangman/blob/main/screenshots/pendu.PNG)

*(Si vous écrivez un nombre, une suite de lettre ou un caractère spécial, vous gâchez une vie. Les mots sont normalisés et ne contiennent pas d'accent ou d'espace.)*

* La partie se termine si le dessin du pendu se complète (perdu) ou si vous avez trouvé toutes les lettres (gagné). Vous devez refaire `>pendu start` pour relancer une partie.

![Screenshot: gagné](https://github.com/tanoshiibot/the-hangman/blob/main/screenshots/perdu.PNG)
![Screenshot: perdu](https://github.com/tanoshiibot/the-hangman/blob/main/screenshots/won.PNG)


## Difficultés rencontrées

J'ai pu utiliser ce projet pour apprendre les Regex. Il s'agit d'un outil très puissant, et je me rends compte qu'il résoud beaucoup de problèmes que j'ai déjà rencontré auparavant. 

J'ai essayé de mettre la liste de mots sur mon serveur et de la récupérer depuis mon serveur, mais je n'ai pas réussi à temps... 

## Améliorations possibles

* Le pendu est "prêt" à recevoir et trier une liste de mots bien plus complète que la lsite actuelle. Cependant, il faut que j'apprenne à accder à cette liste de mot autrement qu'en local ou sur la RAM, car cette liste est gigantesque. 

* J'aurais également aimé qu'on puisse choisir l'émoji pendu, mais ce n'était pas ma priorité. Je le rajouterai peut-être car c'est assez simple à rajouter.

* Je devrais afficher le mot lorsque la partie est perdue.
<file_sep>/script.js

    let words = ["moka", "tiramisu", "panna cotta", "caramel", "capucinno", "crêpe", "latte machiatto", "mille-feuille", "merveilleux", "cupcake", "chocolat", "cheesecake", "meringue", "gâteau", "cookie", "madelaine", "sablé", "palmier", "brownie", "vanille", "crème", "spéculoos", "flan", "pudding", "donut", "beignet", "sucre", "café", "stretto", "lungo", "doppio", "expresso", "crème brûlée", "moelleux", "cannolis", "matcha", "sencha", "genmaicha", "gyokuro"]
    words = words.filter(element => ((!/[ 0-9]/.test(element)) && (element.length > 4)));

    let word = [];
    let spaces = [];
    let keysPressed = [];
    let lives = 9;
    let missChara = 0;


    function accentsTidy(s) {
        let r = s.toLowerCase();
        r = r.replace(new RegExp(/\s/g),"");
        r = r.replace(new RegExp(/[àáâãäå]/g),"a");
        r = r.replace(new RegExp(/æ/g),"ae");
        r = r.replace(new RegExp(/ç/g),"c");
        r = r.replace(new RegExp(/[èéêë]/g),"e");
        r = r.replace(new RegExp(/[ìíîï]/g),"i");
        r = r.replace(new RegExp(/ñ/g),"n");                
        r = r.replace(new RegExp(/[òóôõö]/g),"o");
        r = r.replace(new RegExp(/œ/g),"oe");
        r = r.replace(new RegExp(/[ùúûü]/g),"u");
        r = r.replace(new RegExp(/[ýÿ]/g),"y");
        r = r.replace(new RegExp(/\W/g),"");
        return r;
    };

    lives = 9;
    word = [...words[Math.floor(words.length * Math.random())]];
    word.forEach((x, i) => {
        word[i] = accentsTidy(x);
    })
    spaces = [...word].map(x => x == "-" ? " - " : " _ ");
    missChara = word.length;
    spaces.forEach((x) => {
        let a = document.createElement("LI");
        a.innerText = x;
        a.setAttribute("class", "character");
        document.getElementById("word").appendChild(a);
        if (x == " - ") {
            missChara--;
        } 
    })

    document.getElementById("debug").innerText = `${lives} left before death !`;
    
    document.addEventListener("keydown", event => {
        if ((lives > 0) && (missChara > 0)) {
            if ((event.keyCode >= 65) && (event.keyCode <= 90)) {
                document.getElementById("output").innerText = event.key;
                if (keysPressed.includes(event.key)){
                    document.getElementById("output2").innerText = "déjà dedans !!!";
                } else {
                    keysPressed.push(event.key);
                    if (word.includes(event.key)) {
                        word.forEach((x, i) => {
                            if (x == event.key) {
                                document.getElementsByClassName("character")[i].innerText = ` ${event.key} `;
                                missChara--;
                                document.getElementById("output2").innerText = missChara;
                                if (missChara == 0) {
                                    document.getElementById("output").innerText = "your won :)";
                                } 
                            }
                        })
                    } else {
                        lives--;
                        document.getElementById("hangman").setAttribute("src", `./img/${-lives + 9}.png`);
                    }
                }
            }
            document.getElementById("debug").innerText = `${lives} left before death !`
        } else if (lives == 0) {
            document.getElementById("output").innerText = "your ded :(";
        }
    })
    <file_sep>/hangman.js
module.exports = function generateHangman() {

    let words = ["moka", "tiramisu", "panna cotta", "caramel", "capucinno", "crêpe", "latte machiatto", "mille-feuille", "merveilleux", "cupcake", "chocolat", "cheesecake", "meringue", "gâteau", "cookie", "madelaine", "sablé", "palmier", "brownie", "vanille", "crème", "spéculoos", "flan", "pudding", "donut", "beignet", "sucre", "café", "stretto", "lungo", "doppio", "expresso", "crème brûlée", "moelleux", "cannolis", "matcha", "sencha", "genmaicha", "gyokuro"]
    words = words.filter(element => ((!/[ 0-9]/.test(element)) && (element.length > 4)));

    let word = [];
    let spaces = [];
    let lives = 9;
    let missChara = 0;

    function accentsTidy(s) {
        let r = s.toLowerCase();
        r = r.replace(new RegExp(/[àáâãäå]/g),"a");
        r = r.replace(new RegExp(/æ/g),"ae");
        r = r.replace(new RegExp(/ç/g),"c");
        r = r.replace(new RegExp(/[èéêë]/g),"e");
        r = r.replace(new RegExp(/[ìíîï]/g),"i");
        r = r.replace(new RegExp(/ñ/g),"n");                
        r = r.replace(new RegExp(/[òóôõö]/g),"o");
        r = r.replace(new RegExp(/œ/g),"oe");
        r = r.replace(new RegExp(/[ùúûü]/g),"u");
        r = r.replace(new RegExp(/[ýÿ]/g),"y");
        return r;
    };

    lives = 9;
    word = [...words[Math.floor(words.length * Math.random())]];
    word.forEach((x, i) => {
        word[i] = accentsTidy(x);
    })
    spaces = [...word].map(x => x == "-" ? " - " : " ? ");
    missChara = word.length;
    spaces.forEach((x) => {
        if (x == " - ") {
            missChara--;
        } 
    })

    let hangman = [word, spaces, missChara];
    return hangman;
}