How to Create a Hangman Game With Svelte

Trending 6 days ago

Svelte is simply a extremist caller JavaScript model that is winning nan hearts of developers. Its elemental syntax makes it a awesome campaigner for beginners who are looking to dive into nan world of JavaScript frameworks. One of nan champion ways to learn, is by building, truthful successful this guide, you will study really to usage nan features Svelte offers to create a elemental hangman game.

How Hangman Works

Hangman is simply a word-guessing crippled typically played betwixt 2 people, wherever 1 subordinate thinks of a connection and nan different subordinate tries to conjecture that connection missive by letter. The nonsubjective for nan guessing subordinate is to fig retired nan concealed connection earlier they tally retired of incorrect guesses.

When nan crippled starts, nan big selects a concealed word. The magnitude of nan connection is usually indicated to nan different subordinate (guesser) utilizing dashes. As nan guesser makes incorrect guesses, further parts of nan hangman are drawn, progressing from head, body, arms, and legs.

The guesser wins nan crippled if they negociate to conjecture each nan letters successful nan connection earlier nan stickman fig drafting is complete. Hangman is simply a awesome measurement to trial vocabulary, reasoning, and conclusion skills.

Setting Up nan Development Environment

The codification utilized successful this task is disposable successful a GitHub repository and is free for you to usage nether nan MIT license. If you want to person a look astatine a unrecorded type of this project, you tin cheque retired this demo.

To get Svelte up and moving connected your machine, it is advisable to scaffold nan task pinch Vite.js. To usage Vite, make judge you person Node Package Manager (NPM) and Node.js installed connected your machine. You tin besides usage an replacement package head for illustration Yarn. Now, unfastened your terminal and tally nan pursuing command:

npm create vite

This will commencement a caller task pinch nan Vite Command Line Interface (CLI). Name your project, prime Svelte arsenic nan framework, and group nan version to JavaScript. Now cd into nan task directory and tally nan pursuing bid to instal nan dependencies:

npm install

Now, unfastened nan project, and successful nan src folder, create a hangmanArt.js record and delete nan assets and lib folder. Then clear nan contents of nan App.svelte and App.css files. In nan App.css file, adhd nan following;

  background-color: rgb(0, 0, 0);
  font-family: monospace;

Copy nan contents of nan hangmanArt.js file from this project's GitHub repository, and past paste it into your ain hangmanArt.js file. You tin commencement nan improvement server pinch nan pursuing command:

npm tally dev

Defining nan Logic of nan Application

Open nan App.svelte record and create a script tag that will clasp astir of nan logic of nan application. Create a words array to clasp a database of words.

let words = [

Next, import nan hangmanArt array from nan hangmanArt.js file. Then, create a adaptable userInput, a adaptable randomNumber, and different adaptable to clasp a randomly selected connection from nan words array.

Assign nan selectedWord to different adaptable initial. In summation to nan different variables, create nan pursuing variables: match, message, hangmanStages, and output. Initialize nan output adaptable pinch a drawstring of dashes, depending connected nan magnitude of nan selectedWord. Assign nan hangmanArt array to nan hangmanStages variable.

import { hangmanArt } from "./hangmanArt";
let userInput;
let randomNum = Math.floor(Math.random() * (words.length - 1));
let selectedWord = words[randomNum].toUpperCase();
let first = selectedWord;
let match;
let message;
let hangmanStages = hangmanArt;
let output = "";
[...selectedWord].forEach(() => (output += "-"));
match = output;

Adding nan Necessary Functionalities

As nan subordinate makes a guess, you want to show nan output to nan player. This output will thief nan subordinate cognize if they person made nan correct aliases incorrect guess. Create a usability generateOutput to grip nan task of generating an output.

function generateOutput(input1, input2) {
  output = "";
  for (let one = 0; one < input1.length; i++) {
    if (input2[i] === "-") {
      output += input1[i];
    } else {
      output += "-";

For each conjecture nan subordinate submits, nan programme will person to find if it is nan correct guess. Create an evaluate usability that will move nan hangman drafting to nan adjacent shape if nan subordinate guesses wrong, aliases telephone nan generateOutput usability if nan subordinate makes a correct guess.

function evaluate() {
  let conjecture = userInput.toUpperCase().trim();
  if (!guess) {
  if (selectedWord.includes(guess)) {
    selectedWord = selectedWord.replaceAll(guess, "-");
    generateOutput(initial, selectedWord);
  } else {
    hangmanStages = hangmanStages;
  userInput = "";

And pinch that, you person completed nan logic of nan application. You tin now move connected to defining nan markup.

Defining nan Markup of nan Project

Create a main constituent that will location each different constituent successful nan game. In nan main element, specify an h1 constituent pinch nan matter Hangman.

<h1 class="title">

Create a tagline and render nan hangman fig astatine nan first shape only if nan number of elements successful nan hangmanStages array is greater than 0.

<div class="tagline">
  I'm reasoning of a word. Could you conjecture nan letters successful that word?
{#if hangmanStages.length > 0}
  <pre class="hangman">

Afterward, instrumentality nan logic to show a connection indicating whether nan subordinate has won aliases lost:

{#if hangmanStages.length === 1}
  <div class="message" bind:this={message}>You Lose...</div>
{#if selectedWord === match}
  <div class="message" bind:this={message}>You Win...</div>

Next, render nan output and a shape to judge input from nan user. The output and nan shape should only beryllium displayed if nan constituent pinch nan people "message" is not connected nan screen.

{#if !message}
  <div class="output">
    {#each output as letter}
      {#if missive !== "-"}
        <span class="complete box">{letter}</span>
        <span class="incomplete box" />
  <form on:submit|preventDefault={() => evaluate()}>
      placeholder="Enter a letter"
    <button type="submit">Submit</button>

Now, you tin adhd nan due styling to nan application. Create a style tag and successful it, adhd nan following:

  * {
    color: green;
    text-align: center;

  main {
    display: flex;
    width: 100%;
    flex-direction: column;
    justify-content: center;
    align-items: center;

  button {
    text-transform: uppercase;
    background-color: transparent;
    border: solid 1.2px green;
    font-size: 15px;

  .box {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 45px;
    height: inherit;
    border: dotted 1.2px green;

  .output {
    display: flex;
    font-size: 23px;
    font-weight: 600;
    height: 45px;
    gap: 10px;
    justify-content: center;

  .hangman {
    font-size: 32px;

  form {
    margin-top: 50px;

  .message {
    font-size: 20px;

You person created a hangman crippled pinch Svelte. Great job!

Screenshot of nan vanished Hangman game

What Makes Svelte Amazing?

Svelte is simply a model that is comparatively easy to prime up and learn. Because Svelte's logic syntax is akin to Vanilla JavaScript, this makes it nan cleanable prime if you want a model that tin clasp analyzable things for illustration reactivity, while giving you nan opportunity to activity pinch Vanilla JavaScript. For much analyzable projects, you tin usage SvelteKit—a meta model that was developed arsenic Svelte's reply to Next.js.

Source Tutorials