diff --git a/index.html b/index.html index 302e8e5..74dc691 100644 --- a/index.html +++ b/index.html @@ -1,27 +1,25 @@ - - - - - - Hangman - - -
- -
-
- -
-
- -
- - - + + + + + + Hangman + + + + + + +
+ + + + + + diff --git a/javascript/canvas.js b/javascript/canvas.js index ad78760..d312ecb 100644 --- a/javascript/canvas.js +++ b/javascript/canvas.js @@ -1,34 +1,81 @@ class HangmanCanvas { constructor(secretWord) { - this.context = document.getElementById('hangman').getContext('2d'); - // ... your code goes here + this.secretWord = secretWord; + this.canvas = document.getElementById('hangman'); + this.context = this.canvas.getContext('2d'); } createBoard() { - // ... your code goes here + this.context.clearRect(0, 0, this.canvas.width, this.canvas.height); + this.drawLines(); } drawLines() { - // ... your code goes here + const ctx = this.context; + const startX = 200; + const startY = 500; + const lineWidth = 50; + const gap = 15; + ctx.lineWidth = 3; + + for (let i = 0; i < this.secretWord.length; i++) { + const x = startX + i * (lineWidth + gap); + ctx.beginPath(); + ctx.moveTo(x, startY); + ctx.lineTo(x + lineWidth, startY); + ctx.stroke(); + ctx.closePath(); + } } writeCorrectLetter(index) { - // ... your code goes here + const ctx = this.context; + const letter = this.secretWord[index].toUpperCase(); + const startX = 200; + const startY = 495; + const lineWidth = 50; + const gap = 15; + ctx.font = "40px Arial"; + ctx.fillStyle = "black"; + const x = startX + index * (lineWidth + gap) + 12; + ctx.fillText(letter, x, startY - 20); } writeWrongLetter(letter, errorsLeft) { - // ... your code goes here + const ctx = this.context; + ctx.font = "40px Arial"; + ctx.fillStyle = "red"; + const x = 700; + const y = 100 + (10 - errorsLeft) * 45; + ctx.fillText(letter.toUpperCase(), x, y); } drawHangman(errorsLeft) { - // ... your code goes here + const ctx = this.context; + ctx.lineWidth = 4; + switch (errorsLeft) { + case 9: ctx.beginPath(); ctx.moveTo(100, 500); ctx.lineTo(300, 500); ctx.stroke(); break; + case 8: ctx.beginPath(); ctx.moveTo(150, 500); ctx.lineTo(150, 100); ctx.stroke(); break; + case 7: ctx.beginPath(); ctx.moveTo(150, 100); ctx.lineTo(350, 100); ctx.stroke(); break; + case 6: ctx.beginPath(); ctx.moveTo(350, 100); ctx.lineTo(350, 150); ctx.stroke(); break; + case 5: ctx.beginPath(); ctx.arc(350, 190, 40, 0, Math.PI * 2); ctx.stroke(); break; + case 4: ctx.beginPath(); ctx.moveTo(350, 230); ctx.lineTo(350, 350); ctx.stroke(); break; + case 3: ctx.beginPath(); ctx.moveTo(350, 260); ctx.lineTo(300, 310); ctx.stroke(); break; + case 2: ctx.beginPath(); ctx.moveTo(350, 260); ctx.lineTo(400, 310); ctx.stroke(); break; + case 1: ctx.beginPath(); ctx.moveTo(350, 350); ctx.lineTo(300, 430); ctx.stroke(); break; + case 0: ctx.beginPath(); ctx.moveTo(350, 350); ctx.lineTo(400, 430); ctx.stroke(); break; + } } gameOver() { - // ... your code goes here + const img = new Image(); + img.src = './images/gameover.png'; + img.onload = () => this.context.drawImage(img, 100, 50, 400, 400); } winner() { - // ... your code goes here + const img = new Image(); + img.src = './images/awesome.png'; + img.onload = () => this.context.drawImage(img, 100, 50, 400, 400); } } diff --git a/javascript/hangman.js b/javascript/hangman.js index ee01d18..87ca781 100644 --- a/javascript/hangman.js +++ b/javascript/hangman.js @@ -1,55 +1,80 @@ +let hangman; +let hangmanCanvas; + +const startGameButton = document.getElementById('start-game-button'); + class Hangman { constructor(words) { this.words = words; - // ... your code goes here + this.secretWord = this.pickWord(); + this.letters = []; + this.guessedLetters = ""; + this.errorsLeft = 10; } pickWord() { - // ... your code goes here + return this.words[Math.floor(Math.random() * this.words.length)]; } checkIfLetter(keyCode) { - // ... your code goes here + return keyCode >= 65 && keyCode <= 90; } checkClickedLetters(letter) { - // ... your code goes here + return !this.letters.includes(letter); } addCorrectLetter(letter) { - // ... your code goes here + if (!this.letters.includes(letter)) this.letters.push(letter); + this.guessedLetters += letter; + return this.checkWinner(); } addWrongLetter(letter) { - // ... your code goes here + if (!this.letters.includes(letter)) this.letters.push(letter); + this.errorsLeft -= 1; } checkGameOver() { - // ... your code goes here + return this.errorsLeft <= 0; } checkWinner() { - // ... your code goes here + return [...this.secretWord].every(char => this.guessedLetters.includes(char)); } } -let hangman; - -const startGameButton = document.getElementById('start-game-button'); - +// START BUTTON if (startGameButton) { - startGameButton.addEventListener('click', event => { - hangman = new Hangman(['node', 'javascript', 'react', 'miami', 'paris', 'amsterdam', 'lisboa']); - - // HINT (uncomment when start working on the canvas portion of the lab) - // hangman.secretWord = hangman.pickWord(); - // hangmanCanvas = new HangmanCanvas(hangman.secretWord); - - // ... your code goes here + startGameButton.addEventListener('click', () => { + hangman = new Hangman([ + 'node','javascript','react','miami','paris','amsterdam','lisboa' + ]); + hangman.secretWord = hangman.pickWord(); + hangmanCanvas = new HangmanCanvas(hangman.secretWord); + hangmanCanvas.createBoard(); }); } -document.addEventListener('keydown', event => { - // React to user pressing a key - // ... your code goes here +// KEYDOWN HANDLER +document.addEventListener('keydown', (event) => { + if (!hangman) return; + + const letter = event.key.toLowerCase(); + + if (!hangman.checkIfLetter(event.keyCode)) return; + if (!hangman.checkClickedLetters(letter)) return; + + if (hangman.secretWord.includes(letter)) { + hangman.addCorrectLetter(letter); + [...hangman.secretWord].forEach((char, idx) => { + if (char === letter) hangmanCanvas.writeCorrectLetter(idx); + }); + if (hangman.checkWinner()) hangmanCanvas.winner(); + } else { + hangman.addWrongLetter(letter); + hangmanCanvas.writeWrongLetter(letter, hangman.errorsLeft); + hangmanCanvas.drawHangman(hangman.errorsLeft); + if (hangman.checkGameOver()) hangmanCanvas.gameOver(); + } }); diff --git a/styles/styles.css b/styles/styles.css index 414e79c..f987e84 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -1,5 +1,5 @@ .game-logo { - + text-align: center; } #start-game-button { @@ -10,6 +10,8 @@ padding: 20px 40px; font-size: 30px; border-radius: 5px; + display: block; + margin: auto; } #hangman {