diff --git a/index.html b/index.html index 302e8e5..a0a0aa1 100644 --- a/index.html +++ b/index.html @@ -10,7 +10,7 @@
diff --git a/javascript/canvas.js b/javascript/canvas.js
index ad78760..9e06c84 100644
--- a/javascript/canvas.js
+++ b/javascript/canvas.js
@@ -2,33 +2,88 @@ class HangmanCanvas {
constructor(secretWord) {
this.context = document.getElementById('hangman').getContext('2d');
// ... your code goes here
+ this.secretWord = secretWord;
+
}
createBoard() {
// ... your code goes here
+ this.context.clearRect(0, 0, this.context.canvas.width, this.context.canvas.height);
+ this.drawLines();
}
drawLines() {
// ... your code goes here
+ const numberOfLetters = this.secretWord.length;
+ const startX = 300;
+ const startY = 700;
+ const lineWidth = 50;
+ const lineSpacing = 10;
+
+ for (let i = 0; i < numberOfLetters; i++) {
+ this.context.beginPath();
+ this.context.moveTo(startX + i * (lineWidth + lineSpacing), startY);
+ this.context.lineTo(startX + i * (lineWidth + lineSpacing) + lineWidth, startY);
+ this.context.stroke();
+ }
}
writeCorrectLetter(index) {
// ... your code goes here
+ const letter = this.secretWord[index].toUpperCase();
+ const startX = 305 + index * 60; // Adjusted positions
+ const startY = 690;
+
+ this.context.font = '48px Arial';
+ this.context.fillText(letter, startX, startY);
}
writeWrongLetter(letter, errorsLeft) {
- // ... your code goes here
+ const startX = 600;
+ const startY = 200;
+ const spacing = 50;
+
+ this.context.font = '48px Arial';
+ this.context.fillText(letter.toUpperCase(), startX + (10 - errorsLeft) * spacing, startY);
+ // ... your code goes here
}
drawHangman(errorsLeft) {
// ... your code goes here
+ const ctx = this.context;
+
+ switch (errorsLeft) {
+ case 9:
+ // Draw the base
+ ctx.beginPath();
+ ctx.moveTo(100, 700);
+ ctx.lineTo(200, 700);
+ ctx.lineTo(150, 650);
+ ctx.closePath();
+ ctx.stroke();
+ break;
+ // Continue adding cases for each errorLeft value
+ // ...
+ default:
+ break;
+ }
}
gameOver() {
// ... your code goes here
+ const img = new Image();
+ img.src = './images/gameover.png';
+ img.onload = () => {
+ this.context.drawImage(img, 200, 100, 400, 400);
+ };
}
winner() {
// ... your code goes here
+ const img = new Image();
+ img.src = './images/awesome.png';
+ img.onload = () => {
+ this.context.drawImage(img, 200, 100, 400, 400);
+ };
}
}
diff --git a/javascript/hangman.js b/javascript/hangman.js
index ee01d18..a793bd0 100644
--- a/javascript/hangman.js
+++ b/javascript/hangman.js
@@ -1,55 +1,105 @@
class Hangman {
constructor(words) {
this.words = words;
- // ... your code goes here
+ this.secretWord = this.pickWord(); // The secret word for the current game
+ this.letters = []; // Letters that have been guessed
+ this.guessedLetters = ''; // Correct letters guessed
+ this.errorsLeft = 10;
}
pickWord() {
- // ... your code goes here
+ const randomIndex = Math.floor(Math.random() * this.words.length);
+ return this.words[randomIndex];
}
checkIfLetter(keyCode) {
- // ... your code goes here
+ return (keyCode >= 65 && keyCode <= 90) || (keyCode >= 97 && keyCode <= 122);
}
checkClickedLetters(letter) {
- // ... your code goes here
+ return !this.letters.includes(letter);
}
addCorrectLetter(letter) {
- // ... your code goes here
+ this.guessedLetters += letter;
}
addWrongLetter(letter) {
- // ... your code goes here
+ if (!this.letters.includes(letter)) {
+ this.errorsLeft--;
+ this.letters.push(letter);
+ }
}
checkGameOver() {
- // ... your code goes here
+ return this.errorsLeft <= 0;
}
checkWinner() {
- // ... your code goes here
+ const uniqueLettersInSecretWord = [...new Set(this.secretWord)];
+ const guessedLettersArray = this.guessedLetters.split('');
+
+ return uniqueLettersInSecretWord.every(letter =>
+ guessedLettersArray.includes(letter)
+ );
}
}
let hangman;
-
+let hangmanCanvas; // Global variable for canvas
const startGameButton = document.getElementById('start-game-button');
if (startGameButton) {
- startGameButton.addEventListener('click', event => {
+ startGameButton.onclick=() => {
hangman = new Hangman(['node', 'javascript', 'react', 'miami', 'paris', 'amsterdam', 'lisboa']);
+
+ hangman.secretWord = hangman.pickWord();
+ hangmanCanvas = new HangmanCanvas(hangman.secretWord); // Initialize canvas instance
+
+ hangman.errorsLeft = 5;
+ hangman.letters = [];
+ hangman.guessedLetters = '';
- // HINT (uncomment when start working on the canvas portion of the lab)
- // hangman.secretWord = hangman.pickWord();
- // hangmanCanvas = new HangmanCanvas(hangman.secretWord);
+ hangmanCanvas.createBoard(); // Initialize canvas
+ };
- // ... your code goes here
- });
}
document.addEventListener('keydown', event => {
- // React to user pressing a key
- // ... your code goes here
+ const keyCode = event.keyCode;
+ const letter = event.key.toLowerCase();
+
+ if (hangman.checkIfLetter(keyCode)) {
+ if (hangman.checkClickedLetters(letter)) {
+ hangman.letters.push(letter);
+
+ if (hangman.secretWord.includes(letter)) {
+ hangman.addCorrectLetter(letter);
+
+ for (let i = 0; i < hangman.secretWord.length; i++) {
+ if (hangman.secretWord[i] === letter) {
+ hangmanCanvas.writeCorrectLetter(i); // Update canvas with correct letter
+ }
+ }
+
+ if (hangman.checkWinner()) {
+ console.log('You win!');
+ hangmanCanvas.winner();
+ }
+ } else {
+ hangman.addWrongLetter(letter);
+ hangmanCanvas.writeWrongLetter(letter, hangman.errorsLeft);
+ hangmanCanvas.drawHangman(hangman.errorsLeft);
+
+ if (hangman.checkGameOver()) {
+ console.log('Game over!');
+ hangmanCanvas.gameOver();
+ }
+ }
+ } else {
+ console.log('Letter already guessed.');
+ }
+ } else {
+ console.log('Not a valid letter.');
+ }
});
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..b59d689
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,6 @@
+{
+ "name": "lab-canvas-hangman",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {}
+}