CSS: Styling the Game
The CSS styles enhance the visual appeal and responsiveness of the game:

* {        box-sizing: border-box;        margin: 0;        padding: 0;}body {        font-family: Arial, sans-serif;        line-height: 1.6;        text-align: center;        justify-content: center;        display: flex;        color: #333;        background: linear-gradient(to bottom, #a8edea, #fed6e3);        align-items: center;        margin: 0;        height: 100vh;        /* background-color: #f9f9f9; */}#game-container {        display: flex;        flex-direction: column;        width: 80%;        margin: 50px auto;        padding: 20px;        border: 1px solid #ccc;        border-radius: 10px;        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);        /* justify-content: center; */        align-items: center;        background: rgba(255, 255, 255, 0.8);        text-align: center;}h1 {        font-family: \\\"Pacifico\\\", cursive;        color: #ff6f61;}#word-container {        display: flex;        align-items: center;        justify-content: center;        font-size: 24px;        font-weight: bold;        margin-bottom: 20px;}.logo {        height: 80px;        width: 83px;}.letter-btn {        margin: 10px;        padding: 10px 20px;        border: none;        border-radius: 8px;        color: #fff;        background: #ff6f61;        cursor: pointer;        transition: background 0.3s ease;}.letter-btn:hover {        background-color: #ff402e;}.letter-btn.disabled {        background-color: #ccc;        cursor: not-allowed;}#message {        font-size: 18px;        font-weight: bold;        color: #666;        margin-bottom: 20px;}#restart-btn {        font-weight: bold;        padding: 10px 20px;        border: none;        border-radius: 10px;        background-color: #ff6f61;        color: #fff;        cursor: pointer;        margin-bottom: 20px;}#restart-btn:hover {        background-color: #ff402e;}#hangman-img {        width: 180px;        height: 180px;        margin: 0 20px;        transition: transform 0.3s ease-in-out;}.hangman-image:hover {        transform: scale(1.05);}#clue {        font-size: 18px;        font-weight: bold;        margin-bottom: 20px;        color: darkblue;}#tries {        position: relative;        left: 30%;        margin: 10px;        /* margin-left: 900px; */        padding: 10px 20px;        border: none;        border-radius: 10px;        background-color: #4fd8d8;        color: #fff;        cursor: pointer;}/* Media Queries *//* Small screens (max-width: 768px) */@media (max-width: 768px) {        #game-container {                display: flex;                flex-direction: column;                width: 90%;                margin: 20px auto;                height: 100vh;                padding: 10px;                align-items: center;        }        #word-container {                font-size: 18px;        }        .letter-btn {                margin: 5px;                padding: 5px 10px;        }        #letters-container {                width: 350px;        }        #message {                font-size: 14px;                font-weight: bold;        }        #restart-btn {                height: 30px;                padding: 5px 10px;        }        #hangman-img {                width: 120px;                height: 120px;        }        #clue {                font-size: 14px;        }        #tries {                /* margin: 5px; */                left: 30%;                padding: 13px 5px 10px 5px;        }}/* Extra small screens (max-width: 480px) */@media (max-width: 480px) {        #game-container {                display: flex;                flex-direction: column;                width: 100%;                height: 100vh;                margin: 10px auto;                padding: 5px;                align-items: center;                background:#ebfcfc;        }        #letters-container {                /* width: 280px; */                flex-wrap: wrap;                margin-bottom: 30px;        }        #word-container {                font-size: 20px;        }        .letter-btn {                height: 30px;                width: 30px;                border-radius: 100%;                margin: 2px;                padding: 2px 5px;        }        #message {                font-weight: bold;                font-size: 30px;                margin: 10px 0 10px 0;        }        #restart-btn {                margin-top: 30px;                height: 40px;                font-size: 20px;                padding: 2px 5px;        }        #hangman-img {                width: 170px;                height: 170px;                margin: 30px 0 0px 0;        }        #clue {                margin-top: 40px;                font-size: 21px;        }        #tries {                left: 9%;                width: 150px;                flex-wrap: wrap;                margin: 20px 0 40px 0;                padding: 15px;                margin-left: 170px;        }}@media (max-width: 320px) {        #game-container {                display: flex;                flex-direction: column;                width: 100%;                height: 100vh;                margin: 10px auto;                padding: 5px;                align-items: center;                background:#ebfcfc;        }        #letters-container {                width: 270px;                flex-wrap: wrap;                margin-bottom: 20px;        }        #word-container {                font-size: 20px;        }        .letter-btn {                margin: 2px;                padding: 2px 5px;        }        #message {                font-weight: bold;                font-size: 15px;        }        #restart-btn {                font-size: medium;                padding: 2px 5px;        }        #hangman-img {                width: 120px;                height: 120px;                margin: 15px 0 0px 0;        }        #clue {                margin-top: 10px;                font-size: 18px;        }        #tries {                left: 20%;                margin: 2px;                padding: 15px 0 0 0;        }}* {        box-sizing: border-box;        margin: 0;        padding: 0;}body {        font-family: Arial, sans-serif;        line-height: 1.6;        text-align: center;        justify-content: center;        display: flex;        color: #333;        background: linear-gradient(to bottom, #a8edea, #fed6e3);        align-items: center;        margin: 0;        height: 100vh;        /* background-color: #f9f9f9; */}#game-container {        display: flex;        flex-direction: column;        width: 80%;        margin: 50px auto;        padding: 20px;        border: 1px solid #ccc;        border-radius: 10px;        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);        /* justify-content: center; */        align-items: center;        background: rgba(255, 255, 255, 0.8);        text-align: center;}h1 {        font-family: \\\"Pacifico\\\", cursive;        color: #ff6f61;}#word-container {        display: flex;        align-items: center;        justify-content: center;        font-size: 24px;        font-weight: bold;        margin-bottom: 20px;}.logo {        height: 80px;        width: 83px;}.letter-btn {        margin: 10px;        padding: 10px 20px;        border: none;        border-radius: 8px;        color: #fff;        background: #ff6f61;        cursor: pointer;        transition: background 0.3s ease;}.letter-btn:hover {        background-color: #ff402e;}.letter-btn.disabled {        background-color: #ccc;        cursor: not-allowed;}#message {        font-size: 18px;        font-weight: bold;        color: #666;        margin-bottom: 20px;}#restart-btn {        font-weight: bold;        padding: 10px 20px;        border: none;        border-radius: 10px;        background-color: #ff6f61;        color: #fff;        cursor: pointer;        margin-bottom: 20px;}#restart-btn:hover {        background-color: #ff402e;}#hangman-img {        width: 180px;        height: 180px;        margin: 0 20px;        transition: transform 0.3s ease-in-out;}.hangman-image:hover {        transform: scale(1.05);}#clue {        font-size: 18px;        font-weight: bold;        margin-bottom: 20px;        color: darkblue;}#tries {        position: relative;        left: 30%;        margin: 10px;        /* margin-left: 900px; */        padding: 10px 20px;        border: none;        border-radius: 10px;        background-color: #4fd8d8;        color: #fff;        cursor: pointer;}/* Media Queries *//* Small screens (max-width: 768px) */@media (max-width: 768px) {        #game-container {                display: flex;                flex-direction: column;                width: 90%;                margin: 20px auto;                height: 100vh;                padding: 10px;                align-items: center;        }        #word-container {                font-size: 18px;        }        .letter-btn {                margin: 5px;                padding: 5px 10px;        }        #letters-container {                width: 350px;        }        #message {                font-size: 14px;                font-weight: bold;        }        #restart-btn {                height: 30px;                padding: 5px 10px;        }        #hangman-img {                width: 120px;                height: 120px;        }        #clue {                font-size: 14px;        }        #tries {                /* margin: 5px; */                left: 30%;                padding: 13px 5px 10px 5px;        }}/* Extra small screens (max-width: 480px) */@media (max-width: 480px) {        #game-container {                display: flex;                flex-direction: column;                width: 100%;                height: 100vh;                margin: 10px auto;                padding: 5px;                align-items: center;                background:#ebfcfc;        }        #letters-container {                /* width: 280px; */                flex-wrap: wrap;                margin-bottom: 30px;        }        #word-container {                font-size: 20px;        }        .letter-btn {                height: 30px;                width: 30px;                border-radius: 100%;                margin: 2px;                padding: 2px 5px;        }        #message {                font-weight: bold;                font-size: 30px;                margin: 10px 0 10px 0;        }        #restart-btn {                margin-top: 30px;                height: 40px;                font-size: 20px;                padding: 2px 5px;        }        #hangman-img {                width: 170px;                height: 170px;                margin: 30px 0 0px 0;        }        #clue {                margin-top: 40px;                font-size: 21px;        }        #tries {                left: 9%;                width: 150px;                flex-wrap: wrap;                margin: 20px 0 40px 0;                padding: 15px;                margin-left: 170px;        }}@media (max-width: 320px) {        #game-container {                display: flex;                flex-direction: column;                width: 100%;                height: 100vh;                margin: 10px auto;                padding: 5px;                align-items: center;                background:#ebfcfc;        }        #letters-container {                width: 270px;                flex-wrap: wrap;                margin-bottom: 20px;        }        #word-container {                font-size: 20px;        }        .letter-btn {                margin: 2px;                padding: 2px 5px;        }        #message {                font-weight: bold;                font-size: 15px;        }        #restart-btn {                font-size: medium;                padding: 2px 5px;        }        #hangman-img {                width: 120px;                height: 120px;                margin: 15px 0 0px 0;        }        #clue {                margin-top: 10px;                font-size: 18px;        }        #tries {                left: 20%;                margin: 2px;                padding: 15px 0 0 0;        }}

JavaScript
was used majorly for the conditionals and interactivity of the game.

const languages = [\\\"javascript\\\", \\\"python\\\", \\\"java\\\", \\\"ruby\\\"];const frameworks = [\\\"react\\\", \\\"angular\\\", \\\"vue\\\", \\\"django\\\", \\\"flask\\\"];const tools = [\\\"git\\\", \\\"webpack\\\", \\\"babel\\\", \\\"eslint\\\", \\\"prettier\\\"];const concept = [\\\"closure\\\", \\\"callback\\\", \\\"promises\\\", \\\"async\\\", \\\"hosting\\\"];const databases = [\\\"mongodb\\\", \\\"sqlite\\\", \\\"mysql\\\"];const allObjects = {languages, frameworks, tools, concept, databases};let chosenWord = \\\"\\\";let guessedLetters = [];let wrongGuesses;const wordContainer = document.getElementById(\\\"word-container\\\");const lettersContainer = document.getElementById(\\\"letters-container\\\");const message = document.getElementById(\\\"message\\\");const restartBtn = document.getElementById(\\\"restart-btn\\\");const hangmanImg = document.getElementById(\\\"hangman-img\\\");const hangmanAud = document.getElementById(\\\"hangman-aud\\\");const trials = document.getElementById(\\\"tries\\\");const clue = document.getElementById(\\\"clue\\\");function init() {        const randomArray =                Object.values(allObjects)[                        Math.floor(Math.random() * Object.keys(allObjects).length)                ];        const randomValue =                randomArray[Math.floor(Math.random() * randomArray.length)];        console.log(randomValue);        const getClue = () => {                for (const [key, value] of Object.entries(allObjects)) {                        if (value.includes(randomValue)) {                                return key;                        }                }        };        clue.textContent = `Clue: \\\"${getClue().toUpperCase()}\\\" in Programming`;        chosenWord = randomValue;        // words[Math.floor(Math.random() * words.length)];        guessedLetters = [];        remainingGuesses = 5;        message.textContent = \\\"\\\";        wordContainer.innerHTML = \\\"_ \\\".repeat(chosenWord.length).trim();        lettersContainer.innerHTML = \\\"\\\";        hangmanImg.src = \\\"hangmanSteady.png\\\";        trials.innerText = \\\"YOU HAVE 5 TRIALS!\\\";        wrongGuesses = 0;        for (let i = 65; i <= 90; i  ) {                const letterBtn = document.createElement(\\\"button\\\");                letterBtn.classList.add(\\\"letter-btn\\\");                letterBtn.textContent = String.fromCharCode(i);                letterBtn.addEventListener(\\\"click\\\", handleGuess);                lettersContainer.appendChild(letterBtn);        }}//after  click this disables all buttons function disableAllButtons() {        const buttons = document.querySelectorAll(\\\".letter-btn\\\");        buttons.forEach((button) => {                button.classList.add(\\\"disabled\\\");                button.disabled = true;        });}restartBtn.addEventListener(\\\"click\\\", init);init();//this handles guesses function handleGuess(event) {        const letter = event.target.innerText.toLowerCase();        event.target.classList.add(\\\"disabled\\\");        event.target.disabled = true;        if (chosenWord.includes(letter)) {                guessedLetters.push(letter);                const displayWord = chosenWord                        .split(\\\"\\\")                        .map((letter) => (guessedLetters.includes(letter) ? letter : \\\"_\\\"))                        .join(\\\" \\\");                wordContainer.textContent = displayWord;        } else {                wrongGuesses  ;                if (wrongGuesses === 1) {                        trials.innerText = \\\"4 trials left\\\";                        hangmanImg.src = \\\"hangman1.png\\\";                        hangmanAud.src = \\\"failed.mp3\\\";                        hangmanAud.play();                } else if (wrongGuesses === 2) {                        hangmanImg.src = \\\"hangman2.png\\\";                        trials.innerText = \\\"3 trials left\\\";                        hangmanAud.src = \\\"failed.mp3\\\";                        hangmanAud.play();                } else if (wrongGuesses === 3) {                        hangmanImg.src = \\\"hangman3.png\\\";                        trials.innerText = \\\"2 trials left\\\";                        hangmanAud.src = \\\"failed.mp3\\\";                        hangmanAud.play();                } else if (wrongGuesses === 4) {                        hangmanImg.src = \\\"hangman4.png\\\";                        trials.innerText = \\\"1 trials left\\\";                        hangmanAud.src = \\\"failed.mp3\\\";                        hangmanAud.play();                }        }        handleGameOver();}const handleGameOver = () => {        if (wrongGuesses === 5) {                message.textContent = `Game Over! ❌ The word was  \\\"${chosenWord}\\\".`;                disableAllButtons();                hangmanImg.src = \\\"hangmanFailed.png\\\";                trials.innerText = \\\"0 TRIAL!\\\";                hangmanAud.src = \\\"gameover.mp3\\\";                hangmanAud.play();                document.querySelector(\\\"#message\\\").style.color = \\\"red\\\";        }        if (chosenWord.split(\\\"\\\").every((letter) => guessedLetters.includes(letter))) {                message.textContent = \\\"Congratulations! You guessed the word!\\\";                hangmanImg.src = \\\"hangmanSuccess.png\\\";                trials.innerText = \\\"Congrats!\\\";                hangmanAud.src = \\\"success.mp3\\\";                hangmanAud.play();                document.querySelector(\\\"#message\\\").style.color = \\\"green\\\";                disableAllButtons();        }};

Code Explanation;
I created an object of arrays. The array names serve as the clue to the word. The game is such that it randomly loops into the objects then gets a single array, for example if after it loops and finally gets the languages array. It then randomly loops over the language array and hides the guess. Hence the player only has a clue of what is to be guessed . So if the guessed word is “python”. The player gets to attempt to guess the word. If after 5 failed attempts of guesses, you failed the game and will have to restart. But if you get the word without 5 failed attempts you get a congratulation message.
The addition of images and audio makes the game intriguing making it much more interactive.

Conclusion
Developing this Hangman game was a rewarding experience that allowed me to apply and enhance my skills in JavaScript. The game’s features, including trial tracking, clues, dynamic images, and feedback messages, create an engaging and interactive experience for players. Deploying the game on Vercel ensures it is accessible and shareable, showcasing the capabilities of modern web development tools and practices.

Future Advancement.
I would be looking forward to adding new characteristics to the game in the future to implement.

Future implementation
The MTnD Hangman game can be used in different niches, only left for me to tailor the objects to your niche, the only things I’ll be needing are keywords that align with your specific niche. The MTnD hangman could be applied in the following;

  1. Educational Hangman: Tailor the game for specific subjects like math, science, or history, where players guess terms related to these topics.
  2. Themed Hangman: Create themes such as movies, books, or famous personalities for each game session.
  3. Multilingual Hangman: Offer versions in different languages to help with language learning.
  4. Custom Word Lists: Allow users to upload or create their own word lists for a personalized experience.
  5. Difficulty Levels: Include options for easy, medium, and hard difficulty levels based on word length or complexity.
  6. Story Mode: Incorporate a storyline or progress system where players unlock new levels or challenges as they succeed.

Each niche could provide a unique twist to the MTnD Hangman game and attract different audiences.
I would be open to suggestions on this project.

","image":"http://www.luping.net/uploads/20240816/172380240566bf23259ef14.jpg","datePublished":"2024-08-16T18:00:05+08:00","dateModified":"2024-08-16T18:00:05+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 JavaScript 建立動態絞刑吏遊戲:技術概述

使用 JavaScript 建立動態絞刑吏遊戲:技術概述

發佈於2024-08-16
瀏覽:620

Creating a Dynamic Hangman Game with JavaScript: A Technical Overview

Introduction
MTnD Hangman game, a classic word-guessing game, serves as an excellent project to practice and showcase various web development skills. In this project, I developed a Hangman game with enhanced features, including tracking the number of trials, providing clues, displaying trial counts, updating images after failed attempts, and displaying a congratulatory message for correct guesses. The game was deployed on Vercel, allowing for easy sharing and access.
This game demo can be assessed here
Features

  1. Number of Trials: The game tracks the number of incorrect guesses a player has made. Each incorrect guess reduces the number of remaining trials, adding to the challenge.
  2. Clues: Players can receive clues to help them guess the word. This feature adds a layer of strategy and assistance, making the game more engaging, enhancing the user experience by offering hints when needed. Visual feedback, including changing images and congratulatory messages, was integrated to make the game more engaging and visually appealing.
  3. Displaying the Number of Trials: The number of trials left is displayed prominently, keeping the player informed and adding to the suspense.
  4. Changing Images After Failed Attempts: For each incorrect guess, the game updates an image, typically depicting the progression of the hangman drawing. This visual feedback enhances the player experience by visually representing the consequences of incorrect guesses. 5.Congratulatory Message for Correct Guesses: When the player successfully guesses the word, a congratulatory message is displayed, providing positive reinforcement and a satisfying conclusion to the game.
  5. Game Logic: The core game logic was implemented in JavaScript functions, handling tasks such as validating guesses, updating the state, and determining win/loss conditions.
  6. Deployment: Once the game was complete and thoroughly tested, it was deployed on Vercel. The deployment process involved pushing the code to a Git repository and connecting it to Vercel, which handled the rest of the deployment seamlessly. 8.Audios were added to indicate wrong guesses which makes the game more intriguing, after 5 failed attempts it also returns at sound. After a successful attempt to get the word you get a sound also for success

Technologies Used

  1. HTML: Structure of the game.
  2. CSS: Styling the game interface.
  3. JavaScript used for web interactivity and conditionals. 4.Vercel: The game is deployed on Vercel, a popular platform for deploying front-end projects.Vercel provides a seamless deployment process and ensures the game is accessible from anywhere.

HTML: Structure of the Game
The HTML structure is straightforward, with a few divs and elements to display the game’s components like empty image tags , heading tags and audio tags to be accessible for toggling different game states.


        
                
                
                Hangman
                
        
        
                

MTnD Hangman

Hangman Image

CSS: Styling the Game
The CSS styles enhance the visual appeal and responsiveness of the game:

* {
        box-sizing: border-box;
        margin: 0;
        padding: 0;
}
body {
        font-family: Arial, sans-serif;
        line-height: 1.6;
        text-align: center;
        justify-content: center;
        display: flex;
        color: #333;
        background: linear-gradient(to bottom, #a8edea, #fed6e3);
        align-items: center;
        margin: 0;
        height: 100vh;
        /* background-color: #f9f9f9; */
}

#game-container {
        display: flex;
        flex-direction: column;
        width: 80%;
        margin: 50px auto;
        padding: 20px;
        border: 1px solid #ccc;
        border-radius: 10px;
        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        /* justify-content: center; */
        align-items: center;
        background: rgba(255, 255, 255, 0.8);
        text-align: center;
}
h1 {
        font-family: "Pacifico", cursive;
        color: #ff6f61;
}
#word-container {
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 24px;
        font-weight: bold;
        margin-bottom: 20px;
}

.logo {
        height: 80px;
        width: 83px;
}
.letter-btn {
        margin: 10px;
        padding: 10px 20px;
        border: none;
        border-radius: 8px;
        color: #fff;
        background: #ff6f61;
        cursor: pointer;
        transition: background 0.3s ease;
}
.letter-btn:hover {
        background-color: #ff402e;
}
.letter-btn.disabled {
        background-color: #ccc;
        cursor: not-allowed;
}

#message {
        font-size: 18px;
        font-weight: bold;
        color: #666;
        margin-bottom: 20px;
}

#restart-btn {
        font-weight: bold;
        padding: 10px 20px;
        border: none;
        border-radius: 10px;
        background-color: #ff6f61;
        color: #fff;
        cursor: pointer;
        margin-bottom: 20px;
}
#restart-btn:hover {
        background-color: #ff402e;
}
#hangman-img {
        width: 180px;
        height: 180px;
        margin: 0 20px;
        transition: transform 0.3s ease-in-out;
}
.hangman-image:hover {
        transform: scale(1.05);
}


#clue {
        font-size: 18px;
        font-weight: bold;
        margin-bottom: 20px;
        color: darkblue;

}

#tries {
        position: relative;
        left: 30%;
        margin: 10px;

        /* margin-left: 900px; */
        padding: 10px 20px;
        border: none;
        border-radius: 10px;
        background-color: #4fd8d8;
        color: #fff;
        cursor: pointer;
}
/* Media Queries */

/* Small screens (max-width: 768px) */
@media (max-width: 768px) {
        #game-container {
                display: flex;
                flex-direction: column;
                width: 90%;
                margin: 20px auto;
                height: 100vh;
                padding: 10px;
                align-items: center;
        }
        #word-container {
                font-size: 18px;
        }
        .letter-btn {
                margin: 5px;
                padding: 5px 10px;
        }
        #letters-container {
                width: 350px;
        }
        #message {
                font-size: 14px;
                font-weight: bold;
        }
        #restart-btn {
                height: 30px;
                padding: 5px 10px;
        }
        #hangman-img {
                width: 120px;
                height: 120px;
        }
        #clue {
                font-size: 14px;
        }

        #tries {
                /* margin: 5px; */
                left: 30%;
                padding: 13px 5px 10px 5px;
        }
}

/* Extra small screens (max-width: 480px) */
@media (max-width: 480px) {
        #game-container {
                display: flex;
                flex-direction: column;
                width: 100%;
                height: 100vh;
                margin: 10px auto;
                padding: 5px;
                align-items: center;
                background:#ebfcfc;

        }

        #letters-container {
                /* width: 280px; */
                flex-wrap: wrap;
                margin-bottom: 30px;
        }
        #word-container {
                font-size: 20px;

        }
        .letter-btn {
                height: 30px;
                width: 30px;
                border-radius: 100%;
                margin: 2px;
                padding: 2px 5px;
        }
        #message {
                font-weight: bold;
                font-size: 30px;
                margin: 10px 0 10px 0;
        }
        #restart-btn {
                margin-top: 30px;
                height: 40px;
                font-size: 20px;
                padding: 2px 5px;
        }
        #hangman-img {
                width: 170px;
                height: 170px;
                margin: 30px 0 0px 0;
        }
        #clue {
                margin-top: 40px;
                font-size: 21px;
        }

        #tries {
                left: 9%;
                width: 150px;
                flex-wrap: wrap;
                margin: 20px 0 40px 0;

                padding: 15px;
                margin-left: 170px;
        }
}

@media (max-width: 320px) {
        #game-container {
                display: flex;
                flex-direction: column;
                width: 100%;
                height: 100vh;
                margin: 10px auto;
                padding: 5px;
                align-items: center;
                background:#ebfcfc;


        }

        #letters-container {
                width: 270px;
                flex-wrap: wrap;
                margin-bottom: 20px;
        }
        #word-container {
                font-size: 20px;
        }
        .letter-btn {
                margin: 2px;
                padding: 2px 5px;
        }
        #message {
                font-weight: bold;
                font-size: 15px;
        }
        #restart-btn {
                font-size: medium;
                padding: 2px 5px;
        }
        #hangman-img {
                width: 120px;
                height: 120px;
                margin: 15px 0 0px 0;
        }
        #clue {
                margin-top: 10px;
                font-size: 18px;
        }

        #tries {
                left: 20%;
                margin: 2px;
                padding: 15px 0 0 0;

        }
}* {
        box-sizing: border-box;
        margin: 0;
        padding: 0;
}
body {
        font-family: Arial, sans-serif;
        line-height: 1.6;
        text-align: center;
        justify-content: center;
        display: flex;
        color: #333;
        background: linear-gradient(to bottom, #a8edea, #fed6e3);
        align-items: center;
        margin: 0;
        height: 100vh;
        /* background-color: #f9f9f9; */
}

#game-container {
        display: flex;
        flex-direction: column;
        width: 80%;
        margin: 50px auto;
        padding: 20px;
        border: 1px solid #ccc;
        border-radius: 10px;
        box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        /* justify-content: center; */
        align-items: center;
        background: rgba(255, 255, 255, 0.8);
        text-align: center;
}
h1 {
        font-family: "Pacifico", cursive;
        color: #ff6f61;
}
#word-container {
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 24px;
        font-weight: bold;
        margin-bottom: 20px;
}

.logo {
        height: 80px;
        width: 83px;
}
.letter-btn {
        margin: 10px;
        padding: 10px 20px;
        border: none;
        border-radius: 8px;
        color: #fff;
        background: #ff6f61;
        cursor: pointer;
        transition: background 0.3s ease;
}
.letter-btn:hover {
        background-color: #ff402e;
}
.letter-btn.disabled {
        background-color: #ccc;
        cursor: not-allowed;
}

#message {
        font-size: 18px;
        font-weight: bold;
        color: #666;
        margin-bottom: 20px;
}

#restart-btn {
        font-weight: bold;
        padding: 10px 20px;
        border: none;
        border-radius: 10px;
        background-color: #ff6f61;
        color: #fff;
        cursor: pointer;
        margin-bottom: 20px;
}
#restart-btn:hover {
        background-color: #ff402e;
}
#hangman-img {
        width: 180px;
        height: 180px;
        margin: 0 20px;
        transition: transform 0.3s ease-in-out;
}
.hangman-image:hover {
        transform: scale(1.05);
}


#clue {
        font-size: 18px;
        font-weight: bold;
        margin-bottom: 20px;
        color: darkblue;

}

#tries {
        position: relative;
        left: 30%;
        margin: 10px;

        /* margin-left: 900px; */
        padding: 10px 20px;
        border: none;
        border-radius: 10px;
        background-color: #4fd8d8;
        color: #fff;
        cursor: pointer;
}
/* Media Queries */

/* Small screens (max-width: 768px) */
@media (max-width: 768px) {
        #game-container {
                display: flex;
                flex-direction: column;
                width: 90%;
                margin: 20px auto;
                height: 100vh;
                padding: 10px;
                align-items: center;
        }
        #word-container {
                font-size: 18px;
        }
        .letter-btn {
                margin: 5px;
                padding: 5px 10px;
        }
        #letters-container {
                width: 350px;
        }
        #message {
                font-size: 14px;
                font-weight: bold;
        }
        #restart-btn {
                height: 30px;
                padding: 5px 10px;
        }
        #hangman-img {
                width: 120px;
                height: 120px;
        }
        #clue {
                font-size: 14px;
        }

        #tries {
                /* margin: 5px; */
                left: 30%;
                padding: 13px 5px 10px 5px;
        }
}

/* Extra small screens (max-width: 480px) */
@media (max-width: 480px) {
        #game-container {
                display: flex;
                flex-direction: column;
                width: 100%;
                height: 100vh;
                margin: 10px auto;
                padding: 5px;
                align-items: center;
                background:#ebfcfc;

        }

        #letters-container {
                /* width: 280px; */
                flex-wrap: wrap;
                margin-bottom: 30px;
        }
        #word-container {
                font-size: 20px;

        }
        .letter-btn {
                height: 30px;
                width: 30px;
                border-radius: 100%;
                margin: 2px;
                padding: 2px 5px;
        }
        #message {
                font-weight: bold;
                font-size: 30px;
                margin: 10px 0 10px 0;
        }
        #restart-btn {
                margin-top: 30px;
                height: 40px;
                font-size: 20px;
                padding: 2px 5px;
        }
        #hangman-img {
                width: 170px;
                height: 170px;
                margin: 30px 0 0px 0;
        }
        #clue {
                margin-top: 40px;
                font-size: 21px;
        }

        #tries {
                left: 9%;
                width: 150px;
                flex-wrap: wrap;
                margin: 20px 0 40px 0;

                padding: 15px;
                margin-left: 170px;
        }
}

@media (max-width: 320px) {
        #game-container {
                display: flex;
                flex-direction: column;
                width: 100%;
                height: 100vh;
                margin: 10px auto;
                padding: 5px;
                align-items: center;
                background:#ebfcfc;


        }

        #letters-container {
                width: 270px;
                flex-wrap: wrap;
                margin-bottom: 20px;
        }
        #word-container {
                font-size: 20px;
        }
        .letter-btn {
                margin: 2px;
                padding: 2px 5px;
        }
        #message {
                font-weight: bold;
                font-size: 15px;
        }
        #restart-btn {
                font-size: medium;
                padding: 2px 5px;
        }
        #hangman-img {
                width: 120px;
                height: 120px;
                margin: 15px 0 0px 0;
        }
        #clue {
                margin-top: 10px;
                font-size: 18px;
        }

        #tries {
                left: 20%;
                margin: 2px;
                padding: 15px 0 0 0;

        }
}

JavaScript
was used majorly for the conditionals and interactivity of the game.

const languages = ["javascript", "python", "java", "ruby"];
const frameworks = ["react", "angular", "vue", "django", "flask"];
const tools = ["git", "webpack", "babel", "eslint", "prettier"];
const concept = ["closure", "callback", "promises", "async", "hosting"];
const databases = ["mongodb", "sqlite", "mysql"];

const allObjects = {languages, frameworks, tools, concept, databases};

let chosenWord = "";
let guessedLetters = [];
let wrongGuesses;

const wordContainer = document.getElementById("word-container");
const lettersContainer = document.getElementById("letters-container");
const message = document.getElementById("message");
const restartBtn = document.getElementById("restart-btn");
const hangmanImg = document.getElementById("hangman-img");
const hangmanAud = document.getElementById("hangman-aud");
const trials = document.getElementById("tries");
const clue = document.getElementById("clue");
function init() {
        const randomArray =
                Object.values(allObjects)[
                        Math.floor(Math.random() * Object.keys(allObjects).length)
                ];

        const randomValue =
                randomArray[Math.floor(Math.random() * randomArray.length)];
        console.log(randomValue);
        const getClue = () => {
                for (const [key, value] of Object.entries(allObjects)) {
                        if (value.includes(randomValue)) {
                                return key;
                        }
                }
        };
        clue.textContent = `Clue: "${getClue().toUpperCase()}" in Programming`;
        chosenWord = randomValue;
        // words[Math.floor(Math.random() * words.length)];
        guessedLetters = [];
        remainingGuesses = 5;
        message.textContent = "";
        wordContainer.innerHTML = "_ ".repeat(chosenWord.length).trim();
        lettersContainer.innerHTML = "";
        hangmanImg.src = "hangmanSteady.png";
        trials.innerText = "YOU HAVE 5 TRIALS!";
        wrongGuesses = 0;
        for (let i = 65; i  {
                button.classList.add("disabled");
                button.disabled = true;
        });
}

restartBtn.addEventListener("click", init);

init();
//this handles guesses 

function handleGuess(event) {
        const letter = event.target.innerText.toLowerCase();
        event.target.classList.add("disabled");
        event.target.disabled = true;

        if (chosenWord.includes(letter)) {
                guessedLetters.push(letter);
                const displayWord = chosenWord
                        .split("")
                        .map((letter) => (guessedLetters.includes(letter) ? letter : "_"))
                        .join(" ");
                wordContainer.textContent = displayWord;
        } else {
                wrongGuesses  ;
                if (wrongGuesses === 1) {
                        trials.innerText = "4 trials left";
                        hangmanImg.src = "hangman1.png";
                        hangmanAud.src = "failed.mp3";
                        hangmanAud.play();
                } else if (wrongGuesses === 2) {
                        hangmanImg.src = "hangman2.png";
                        trials.innerText = "3 trials left";
                        hangmanAud.src = "failed.mp3";
                        hangmanAud.play();
                } else if (wrongGuesses === 3) {
                        hangmanImg.src = "hangman3.png";
                        trials.innerText = "2 trials left";
                        hangmanAud.src = "failed.mp3";
                        hangmanAud.play();
                } else if (wrongGuesses === 4) {
                        hangmanImg.src = "hangman4.png";
                        trials.innerText = "1 trials left";
                        hangmanAud.src = "failed.mp3";
                        hangmanAud.play();
                }
        }

        handleGameOver();
}

const handleGameOver = () => {
        if (wrongGuesses === 5) {
                message.textContent = `Game Over! ❌ The word was  "${chosenWord}".`;
                disableAllButtons();
                hangmanImg.src = "hangmanFailed.png";
                trials.innerText = "0 TRIAL!";
                hangmanAud.src = "gameover.mp3";
                hangmanAud.play();
                document.querySelector("#message").style.color = "red";
        }
        if (chosenWord.split("").every((letter) => guessedLetters.includes(letter))) {
                message.textContent = "Congratulations! You guessed the word!";
                hangmanImg.src = "hangmanSuccess.png";
                trials.innerText = "Congrats!";
                hangmanAud.src = "success.mp3";
                hangmanAud.play();
                document.querySelector("#message").style.color = "green";

                disableAllButtons();
        }
};

Code Explanation;
I created an object of arrays. The array names serve as the clue to the word. The game is such that it randomly loops into the objects then gets a single array, for example if after it loops and finally gets the languages array. It then randomly loops over the language array and hides the guess. Hence the player only has a clue of what is to be guessed . So if the guessed word is “python”. The player gets to attempt to guess the word. If after 5 failed attempts of guesses, you failed the game and will have to restart. But if you get the word without 5 failed attempts you get a congratulation message.
The addition of images and audio makes the game intriguing making it much more interactive.

Conclusion
Developing this Hangman game was a rewarding experience that allowed me to apply and enhance my skills in JavaScript. The game’s features, including trial tracking, clues, dynamic images, and feedback messages, create an engaging and interactive experience for players. Deploying the game on Vercel ensures it is accessible and shareable, showcasing the capabilities of modern web development tools and practices.

Future Advancement.
I would be looking forward to adding new characteristics to the game in the future to implement.

  • A score keeper section: it basically stores the amount of success and failures and it returns the total score over 10. For example if you get 6 wrong attempts you get 4/10.

  • Timer ⌛: I implement a timer, for example for each guess you get 15 seconds if after 5 second you fail to input a word, you automatically get a failed attempt. To improve the difficulty of the game.

Future implementation
The MTnD Hangman game can be used in different niches, only left for me to tailor the objects to your niche, the only things I’ll be needing are keywords that align with your specific niche. The MTnD hangman could be applied in the following;

  1. Educational Hangman: Tailor the game for specific subjects like math, science, or history, where players guess terms related to these topics.
  2. Themed Hangman: Create themes such as movies, books, or famous personalities for each game session.
  3. Multilingual Hangman: Offer versions in different languages to help with language learning.
  4. Custom Word Lists: Allow users to upload or create their own word lists for a personalized experience.
  5. Difficulty Levels: Include options for easy, medium, and hard difficulty levels based on word length or complexity.
  6. Story Mode: Incorporate a storyline or progress system where players unlock new levels or challenges as they succeed.

Each niche could provide a unique twist to the MTnD Hangman game and attract different audiences.
I would be open to suggestions on this project.

版本聲明 本文轉載於:https://dev.to/miller4tech/creating-a-dynamic-hangman-game-with-javascript-a-technical-overview-15i5?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html &lt;/main&gt; &lt;section&gt; { display:grid; grid-template-...
    程式設計 發佈於2025-06-05
  • PHP未來:適應與創新
    PHP未來:適應與創新
    PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。 引言在編程世界中,PHP一直是網頁開發的中流砥柱。作為一個從1994年就開始發展...
    程式設計 發佈於2025-06-05
  • 左連接為何在右表WHERE子句過濾時像內連接?
    左連接為何在右表WHERE子句過濾時像內連接?
    左JOIN CONUNDRUM:WITCHING小時在數據庫Wizard的領域中變成內在的加入很有趣,當將c.foobar條件放置在上面的Where子句中時,據說左聯接似乎會轉換為內部連接。僅當滿足A.Foo和C.Foobar標準時,才會返回結果。 為什麼要變形?關鍵在於其中的子句。當左聯接的右側...
    程式設計 發佈於2025-06-05
  • Java中假喚醒真的會發生嗎?
    Java中假喚醒真的會發生嗎?
    在Java中的浪費喚醒:真實性或神話? 在Java同步中偽裝喚醒的概念已經是討論的主題。儘管存在這種行為的潛力,但問題仍然存在:它們實際上是在實踐中發生的嗎? Linux的喚醒機制根據Wikipedia關於偽造喚醒的文章,linux實現了pthread_cond_wait()功能的Linux實現,...
    程式設計 發佈於2025-06-05
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-06-05
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    程式設計 發佈於2025-06-05
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-06-05
  • 為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    網格超過身體,用100%grid-template-columns 為什麼在grid-template-colms中具有100%的顯示器,當位置設置為設置的位置時,grid-template-colly修復了? 問題: 考慮以下CSS和html: class =“ snippet-code”> ...
    程式設計 發佈於2025-06-05
  • 如何在Chrome中居中選擇框文本?
    如何在Chrome中居中選擇框文本?
    選擇框的文本對齊:局部chrome-inly-ly-ly-lyly solument 您可能希望將文本中心集中在選擇框中,以獲取優化的原因或提高可訪問性。但是,在CSS中的選擇元素中手動添加一個文本 - 對屬性可能無法正常工作。 初始嘗試 state)</option> < o...
    程式設計 發佈於2025-06-05
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mySQL組使用mySQL組進行查詢結果,在關係數據庫中使用MySQL組,轉移數據的數據是指重新排列的行和列的重排以增強數據可視化。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的轉換為基於列。 Let's consider the following ...
    程式設計 發佈於2025-06-05
  • 您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    在javascript console 中顯示顏色是可以使用chrome的控制台顯示彩色文本,例如紅色的redors,for for for for錯誤消息? 回答是的,可以使用CSS將顏色添加到Chrome和Firefox中的控制台顯示的消息(版本31或更高版本)中。要實現這一目標,請使用以下...
    程式設計 發佈於2025-06-05
  • Java中Lambda表達式為何需要“final”或“有效final”變量?
    Java中Lambda表達式為何需要“final”或“有效final”變量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    程式設計 發佈於2025-06-05
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    在Go Slices中的垃圾收集:詳細的分析在GO中,Slice是一個動態數組,引用了基礎陣列。使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩漏。 考慮使用slice使用slice的以下實現:字符串{ R:=(*Q)[0] *q =(*q)[1:len(*q)] 返...
    程式設計 發佈於2025-06-05
  • 如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    使用http request 上傳文件上傳到http server,同時也提交其他參數,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    程式設計 發佈於2025-06-05

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3