1+ const { getRandomWord } = require ( './words.js' ) ;
2+
3+ let chosenWord = "" ;
4+ let displayWord = [ ] ;
5+ let attempts = 10 ;
6+ let errors = 0 ;
7+ let attemptedLetters = [ ] ;
8+
9+ // Références DOM
10+ let wordDisplay , message , attemptedLettersDisplay , canvas , ctx , restartButton ;
11+
12+ // Fonction pour obtenir un mot aléatoire
13+ async function initGame ( ) {
14+ await restartGame ( ) ; // Initialiser le jeu
15+ }
16+
17+ // Fonction de redémarrage
18+ async function restartGame ( ) {
19+ // Réinitialisez toutes les variables nécessaires
20+ chosenWord = await getRandomWord ( ) ;
21+ displayWord = "_" . repeat ( chosenWord . length ) . split ( "" ) ;
22+ attemptedLetters = [ ] ;
23+ attempts = 10 ;
24+ errors = 0 ; // Réinitialiser le nombre d'erreurs
25+
26+ // Récupération des éléments DOM
27+ wordDisplay = document . getElementById ( 'word-display' ) ;
28+ message = document . getElementById ( 'message' ) ;
29+ attemptedLettersDisplay = document . getElementById ( 'attempted-letters' ) ;
30+ canvas = document . getElementById ( 'hangman-canvas' ) ;
31+ ctx = canvas . getContext ( "2d" ) ;
32+ restartButton = document . getElementById ( 'restart-button' ) ;
33+
34+ // Effacement complet de l'affichage
35+ wordDisplay . textContent = displayWord . join ( " " ) ;
36+ attemptedLettersDisplay . textContent = "" ;
37+ message . textContent = `Essais restants : ${ attempts } ` ;
38+ restartButton . style . display = "none" ; // Masquer le bouton de redémarrage
39+ ctx . clearRect ( 0 , 0 , canvas . width , canvas . height ) ; // Effacer le canvas
40+
41+ // Écouteur pour les événements de clavier
42+ document . removeEventListener ( "keydown" , guessLetter ) ; // Retirer l'écouteur précédent
43+ document . addEventListener ( "keydown" , guessLetter ) ; // Ajouter un nouvel écouteur
44+ }
45+
46+ function guessLetter ( event ) {
47+ const letter = event . key . toLowerCase ( ) ;
48+ if ( ! / ^ [ a - z ] $ / . test ( letter ) || attemptedLetters . includes ( letter ) || ! chosenWord ) return ;
49+
50+ attemptedLetters . push ( letter ) ;
51+ attemptedLettersDisplay . textContent = attemptedLetters . join ( ", " ) ;
52+
53+ if ( chosenWord . includes ( letter ) ) {
54+ chosenWord . split ( "" ) . forEach ( ( char , index ) => {
55+ if ( char === letter ) displayWord [ index ] = letter ;
56+ } ) ;
57+ wordDisplay . textContent = displayWord . join ( " " ) ;
58+ if ( ! displayWord . includes ( "_" ) ) {
59+ message . textContent = "Vous avez gagné !" ;
60+ document . removeEventListener ( "keydown" , guessLetter ) ;
61+ restartButton . style . display = "block" ; // Afficher le bouton de redémarrage
62+ displayFireworks ( ) ; // Afficher les feux d'artifice
63+ }
64+ } else {
65+ errors ++ ;
66+ drawHangman ( errors ) ; // Dessine la prochaine partie du pendu
67+ attempts -- ;
68+ message . textContent = `Essais restants : ${ attempts } ` ;
69+ if ( attempts === 0 ) {
70+ message . textContent = "Vous avez perdu ! Le mot était : " + chosenWord ;
71+ document . removeEventListener ( "keydown" , guessLetter ) ;
72+ restartButton . style . display = "block" ; // Afficher le bouton de redémarrage
73+ displayBlood ( ) ; // Afficher le sang qui coule
74+ }
75+ }
76+ }
77+
78+ // Fonction pour afficher les feux d'artifice
79+ function displayFireworks ( ) {
80+ const fireworkContainer = document . createElement ( 'div' ) ;
81+ fireworkContainer . classList . add ( 'firework-container' ) ;
82+ document . body . appendChild ( fireworkContainer ) ;
83+
84+ for ( let i = 0 ; i < 10 ; i ++ ) {
85+ const firework = document . createElement ( 'div' ) ;
86+ firework . classList . add ( 'firework' ) ;
87+ firework . style . top = `${ Math . random ( ) * 100 } %` ;
88+ firework . style . left = `${ Math . random ( ) * 100 } %` ;
89+ fireworkContainer . appendChild ( firework ) ;
90+ }
91+
92+ setTimeout ( ( ) => fireworkContainer . remove ( ) , 3000 ) ; // Retirer les feux d'artifice après 3 secondes
93+ }
94+
95+ // Fonction pour afficher le sang qui coule
96+ function displayBlood ( ) {
97+ const blood = document . createElement ( 'div' ) ;
98+ blood . classList . add ( 'blood' ) ;
99+ document . body . appendChild ( blood ) ;
100+
101+ setTimeout ( ( ) => blood . remove ( ) , 5000 ) ; // Retirer le sang après 5 secondes
102+ }
103+ // Fonction pour dessiner le pendu
104+ function drawHangman ( stage ) {
105+ ctx . clearRect ( 0 , 0 , canvas . width , canvas . height ) ; // Efface le canvas avant de redessiner
106+ ctx . lineWidth = 2 ;
107+ ctx . strokeStyle = "#ff1a1a" ;
108+ switch ( stage ) {
109+ case 1 : ctx . moveTo ( 20 , 230 ) ; ctx . lineTo ( 180 , 230 ) ; ctx . stroke ( ) ; break ; // Base
110+ case 2 : ctx . moveTo ( 50 , 230 ) ; ctx . lineTo ( 50 , 20 ) ; ctx . stroke ( ) ; break ; // Poteau
111+ case 3 : ctx . moveTo ( 50 , 20 ) ; ctx . lineTo ( 150 , 20 ) ; ctx . stroke ( ) ; break ; // Bras
112+ case 4 : ctx . moveTo ( 150 , 20 ) ; ctx . lineTo ( 150 , 50 ) ; ctx . stroke ( ) ; break ; // Corde
113+ case 5 : ctx . arc ( 150 , 70 , 20 , 0 , Math . PI * 2 , true ) ; ctx . stroke ( ) ; break ; // Tête
114+ case 6 : ctx . moveTo ( 150 , 90 ) ; ctx . lineTo ( 150 , 150 ) ; ctx . stroke ( ) ; break ; // Corps
115+ case 7 : ctx . moveTo ( 150 , 110 ) ; ctx . lineTo ( 120 , 130 ) ; ctx . stroke ( ) ; break ; // Bras gauche
116+ case 8 : ctx . moveTo ( 150 , 110 ) ; ctx . lineTo ( 180 , 130 ) ; ctx . stroke ( ) ; break ; // Bras droit
117+ case 9 : ctx . moveTo ( 150 , 150 ) ; ctx . lineTo ( 120 , 190 ) ; ctx . stroke ( ) ; break ; // Jambe gauche
118+ case 10 : ctx . moveTo ( 150 , 150 ) ; ctx . lineTo ( 180 , 190 ) ; ctx . stroke ( ) ; break ; // Jambe droite
119+ }
120+ }
121+
122+ // Sélectionnez le bouton et ajoutez l'événement click
123+ document . getElementById ( 'restart-button' ) . addEventListener ( 'click' , ( ) => {
124+ location . reload ( ) ; // Recharger la page
125+ } ) ;
126+
127+ // Initialisation du jeu
128+ document . addEventListener ( 'DOMContentLoaded' , initGame ) ;
0 commit comments