Como criar um jogo da forca com Svelte

Svelte é uma nova estrutura JavaScript radical que está conquistando os corações dos desenvolvedores. Sua sintaxe simples o torna um ótimo candidato para iniciantes que desejam mergulhar no mundo dos frameworks JavaScript. Uma das melhores maneiras de aprender é construindo, portanto, neste guia, você aprenderá como usar os recursos que Svelte oferece para criar um jogo da forca simples.

Como funciona o carrasco

Hangman é um jogo de adivinhação de palavras normalmente jogado entre duas pessoas, onde um jogador pensa em uma palavra e o outro tenta adivinhar a palavra letra por letra. O objetivo do jogador que adivinha é descobrir a palavra secreta antes que acabem as suposições incorretas.

Quando o jogo começa, o anfitrião seleciona uma palavra secreta. O comprimento da palavra geralmente é indicado ao outro jogador (adivinhador) por meio de travessões. À medida que o adivinhador faz suposições incorretas, partes adicionais do carrasco são desenhadas, progredindo da cabeça, corpo, braços e pernas.

O adivinhador ganha o jogo se conseguir adivinhar todas as letras da palavra antes que o desenho da figura stickman seja concluído. Hangman é uma ótima maneira de testar habilidades de vocabulário, raciocínio e dedução.

Configurando o Ambiente de Desenvolvimento

O código utilizado neste projeto está disponível em um Repositório GitHub e é gratuito para você usar sob a licença do MIT. Se você quiser dar uma olhada em uma versão ao vivo deste projeto, você pode conferir esta demonstração.

Para colocar o Svelte em funcionamento em sua máquina, é aconselhável estruturar o projeto com Vite.js. Para usar o Vite, certifique-se de ter o Node Package Manager (NPM) e o Node.js instalados em sua máquina. Você também pode usar um gerenciador de pacotes alternativo como o Yarn. Agora, abra seu terminal e execute o seguinte comando:

 npm create vite

Isso iniciará um novo projeto com a interface de linha de comando Vite (CLI). Dê um nome ao seu projeto, selecione Svelte como estrutura e defina a variante como JavaScript. Agora entre no diretório do projeto e execute o seguinte comando para instalar as dependências:

 npm install

Agora, abra o projeto e na pasta src, crie um arquivo hangmanArt.js e exclua os ativos e a pasta lib. Em seguida, limpe o conteúdo dos arquivos App.svelte e App.css. No arquivo App.css, adicione o seguinte;

 :root{
  background-color: rgb(0, 0, 0);
  color:green;
  font-family: monospace;
}

Copie o conteúdo do arquivo hangmanArt.js do arquivo deste projeto Repositório GitHube cole-o em seu próprio arquivo hangmanArt.js. Você pode iniciar o servidor de desenvolvimento com o seguinte comando:

 npm run dev

Definindo a Lógica da Aplicação

Abra o arquivo App.svelte e crie uma tag de script que conterá a maior parte da lógica do aplicativo. Crie uma matriz de palavras para armazenar uma lista de palavras.

 let words = [
  "appetizer",
  "roommates",
  "shrinking",
  "freedom",
  "happiness",
  "development",
];

Em seguida, importe o array hangmanArt do arquivo hangmanArt.js. Em seguida, crie uma variável userInput, uma variável randomNumber e outra variável para armazenar uma palavra selecionada aleatoriamente na matriz de palavras.

  6 Melhor Hospedagem de Servidor GMod para Todos

Atribua o selectedWord a outra variável inicial. Além das outras variáveis, crie as seguintes variáveis: match, message, hangmanStages e output. Inicialize a variável de saída com uma sequência de travessões, dependendo do comprimento da palavra selecionada. Atribua a matriz hangmanArt à variável hangmanStages.

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

Adicionando as funcionalidades necessárias

À medida que o jogador adivinha, você deseja mostrar a saída ao jogador. Esta saída ajudará o jogador a saber se acertou ou errou. Crie uma função generateOutput para lidar com a tarefa de gerar uma saída.

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

Para cada palpite que o jogador enviar, o programa terá que determinar se é o palpite certo. Crie uma função de avaliação que moverá o desenho da forca para o próximo estágio se o jogador adivinhar errado, ou chame a função generateOutput se o jogador acertar.

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

E com isso você completou a lógica do aplicativo. Agora você pode prosseguir para definir a marcação.

  Gerente de Projetos x Gerente de Recursos: Entendendo as Diferenças

Definindo a marcação do projeto

Crie um elemento principal que abrigará todos os outros elementos do jogo. No elemento principal, defina um elemento h1 com o texto Hangman.

 <h1 class="title">
    Hangman
</h1>

Crie um slogan e renderize a figura do carrasco no primeiro estágio somente se o número de elementos na matriz hangmanStages for maior que 0.

 <div class="tagline">
  I'm thinking of a word. Could you guess the letters in that word?
</div>
{#if hangmanStages.length > 0}
  <pre class="hangman">
  {hangmanStages[0]}</pre>
{/if}

Depois, implemente a lógica para mostrar uma mensagem indicando se o jogador ganhou ou perdeu:

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

Em seguida, renderize a saída e um formulário para aceitar a entrada do usuário. A saída e o formulário só deverão ser exibidos se o elemento com a classe “mensagem” não estiver na tela.

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

Agora você pode adicionar o estilo apropriado ao aplicativo. Crie uma tag de estilo e nela adicione o seguinte:

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

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

  input,
  button {
    text-transform: uppercase;
    background-color: transparent;
    border: solid 1.2px green;
    height:40px;
    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;
  }

  .tagline,
  .message {
    font-size: 20px;
  }

Você criou um jogo da forca com Svelte. Bom trabalho!

  6 Melhor Hospedagem de Servidor GMod para Todos

O que torna Svelte incrível?

Svelte é uma estrutura relativamente fácil de aprender e aprender. Como a sintaxe lógica do Svelte é semelhante ao Vanilla JavaScript, isso o torna a escolha perfeita se você deseja uma estrutura que possa conter coisas complexas como reatividade, ao mesmo tempo que oferece a oportunidade de trabalhar com Vanilla JavaScript. Para projetos mais complexos, você pode usar o SvelteKit — uma metaestrutura que foi desenvolvida como a resposta do Svelte ao Next.js.