image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Article image
Eliabe Silva
Eliabe Silva25/05/2025 15:31
Compartilhe
WEX - End to End EngineeringRecomendados para vocêWEX - End to End Engineering

Desenvolvimento do Jogo Interativo "Detona Ralph" com HTML, CSS e JavaScript Introdução

    Desenvolvimento do Jogo Interativo "Detona Ralph" com HTML, CSS e JavaScript

    Introdução

    Desenvolver jogos interativos utilizando tecnologias web é uma excelente forma de aprender e praticar programação front-end. Neste projeto, apresento o desenvolvimento do jogo "Detona Ralph", inspirado no filme homônimo, utilizando HTML5, CSS3 e JavaScript puro. O objetivo foi aplicar conceitos fundamentais do desenvolvimento web, organização de código e controle de versão via GitHub, em um contexto prático e lúdico.

    Como foi feito o projeto

    Organização dos arquivos

    O projeto foi estruturado na pasta detona-ralph, aberta no Visual Studio Code para facilitar o desenvolvimento. Para controle de versões e compartilhamento, criei um repositório público no GitHub com o nome “Projeto Detona Ralph”.

    Estrutura dos recursos

    O código está organizado em pastas para melhor manutenção e escalabilidade:

    • audios/ — arquivos de áudio usados no jogo, como efeitos sonoros e música de fundo.
    • images/ — imagens e sprites do jogo (exemplo: player.png, ralph.png, wall.png).
    • src/ — pasta principal contendo:
    • scripts/ — arquivo JavaScript (engine.js) que contém a lógica do jogo.
    • styles/ — arquivos CSS, sendo reset.css para padronização dos estilos e main.css para o visual do jogo.

    image

    Figura 01: Estrutura de pastas

    Desenvolvimento do código

    Estrutura HTML (index.html)

    O arquivo HTML define a estrutura básica do jogo, incluindo um painel de nove quadrados, menus para exibir tempo restante e pontuação, e a área de vidas do jogador. Também faz referência aos estilos e scripts necessários, além de carregar uma música de fundo que inicia após o primeiro clique do usuário.

    html
    CopiarEditar
    <!DOCTYPE html>
    <html lang="pt-br">
    <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1" />
      <title>Detona halph</title>
    
      <!-- Fontes Google -->
      <link rel="preconnect" href="https://fonts.googleapis.com" />
      <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
      <link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Press+Start+2P&display=swap" rel="stylesheet" />
    
      <!-- Estilos -->
      <link rel="stylesheet" href="./src/styles/reset.css" />
      <link rel="stylesheet" href="./src/styles/main.css" />
    </head>
    <body>
      <main></main>
      <div class="container">
          <div class="menu">
              <div class="menu-time">
                  <h2 style="color: red">Time left</h2>
                  <h2 id="time-left" class="second">0</h2>
              </div>
              <div class="menu-score">
                  <h2 style="color: red">Your Score</h2>
                  <h2 id="score" class="second">0</h2>
              </div>
              <div class="lives">
                  <img src="./src/images/player.png" alt="foto do jogador" height="60px" />
                  <h2>X3</h2>
              </div>
          </div>
          <div class="panel">
              <div class="panel-row">
                  <div class="square enemy" id="1"></div>
                  <div class="square" id="2"></div>
                  <div class="square" id="3"></div>
              </div>
              <div class="panel-row">
                  <div class="square" id="4"></div>
                  <div class="square" id="5"></div>
                  <div class="square" id="6"></div>
              </div>
              <div class="panel-row">
                  <div class="square" id="7"></div>
                  <div class="square" id="8"></div>
                  <div class="square" id="9"></div>
              </div>
          </div>
      </div>
    
      <script defer src="./src/scripts/engine.js"></script>
      <audio id="bg-music" src="./src/audios/background.mp3" loop></audio>
    </body>
    </html>
    
    Estilos CSS (main.css e reset.css)

    O CSS foi aplicado para garantir um layout simples e funcional, com uso das fontes “Bebas Neue” e “Press Start 2P” para estilo de texto. O reset.css zera margens, paddings e define o box-sizing para border-box:

    css
    CopiarEditar
    /* reset.css */
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
      font-family: "Bebas Neue", sans-serif;
    }
    

    O main.css define a estrutura do layout, painel de quadrados, cores e posicionamento:

    css
    CopiarEditar
    body {
      font-family: 'Bebas Neue', sans-serif;
    }
    
    h2, .menu-time h2, .menu-score h2 {
      font-family: 'Press Start 2P', cursive;
    }
    
    .container {
      display: flex;
      flex-direction: column;
      height: 100vh;
      background-image: url("../images/wall.png");
    }
    
    .menu {
      display: flex;
      justify-content: space-evenly;
      align-items: center;
      height: 90px;
      width: 100%;
      background-color: #000000;
      color: #ffffff;
      border-bottom: 5px solid #ffd700;
    }
    
    .panel {
      margin-top: 1rem;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    
    .square {
      height: 150px;
      width: 150px;
      border: 1px solid #000000;
      background-color: #1aeaa5;
    }
    
    .enemy {
      background-image: url("../images/ralph.png");
      background-size: cover;
    }
    
    .lives {
      display: flex;
      align-items: center;
      justify-content: center;
    }
    
    .second {
      margin-top: 10px;
    }
    
    Lógica do jogo (engine.js)

    O JavaScript controla a dinâmica do jogo, incluindo:

    • Seleção aleatória do quadrado inimigo (randomsquare);
    • Movimentação do inimigo em intervalos de tempo definidos (moveenemy);
    • Detecção de cliques válidos para marcar pontos (addlistenerhitbox);
    • Temporizador regressivo que termina o jogo quando chega a zero (countdawn);
    • Efeitos sonoros para interação.
    js
    CopiarEditar
    const state = {
    view: {
      squares: document.querySelectorAll(".square"),
      enemy: document.querySelector(".enemy"),
      timeleft: document.querySelector("#time-left"),
      score: document.querySelector("#score"),
    },
    values: {
      timerId: null,
      gamevelocity: 1000,
      hitposition: 0,
      result: 0, 
      currenttime: 10,
      countdawntimerid: null,
    }, 
    };
    
    function countdawn() {
    state.values.currenttime--;
    state.view.timeleft.textContent = state.values.currenttime;
    
    if (state.values.currenttime <= 0) {
      clearInterval(state.values.countdawntimerid);
      clearInterval(state.values.timerId);
      alert("GAME OVER! O seu resultado foi:" + state.values.result);
    }
    }
    
    function playsound() {
    let audio = new Audio("./src/audios/hit.m4a");
    audio.volume = 0.2;
    audio.play();
    }
    
    function randomsquare() {
    state.view.squares.forEach(square => square.classList.remove("enemy"));
    let ramdomnumber = Math.floor(Math.random() * 9);
    let ramdomsquare = state.view.squares[ramdomnumber];
    ramdomsquare.classList.add("enemy");
    state.values.hitposition = ramdomsquare.id;
    }
    
    function moveenemy() {
    state.values.timerId = setInterval(randomsquare, state.values.gamevelocity);
    }
    
    function addlistenerhitbox() {
    state.view.squares.forEach(square => {
      square.addEventListener("mousedown", () => {
        if (square.id === state.values.hitposition) {
          state.values.result++;
          state.view.score.textContent = state.values.result;
          state.values.hitposition = null;
          playsound();
        }
      });
    });
    }
    
    function init() {
    moveenemy();
    addlistenerhitbox();
    state.values.countdawntimerid = setInterval(countdawn, 1000);
    }
    
    window.addEventListener("DOMContentLoaded", () => {
    const bgMusic = document.getElementById("bg-music");
    bgMusic.volume = 0.3;
    
    document.addEventListener("click", function startAudioAndGame() {
      bgMusic.play().catch(error => {
        console.log("Erro ao reproduzir música de fundo:", error);
      });
    
      init();
    
      document.removeEventListener("click", startAudioAndGame);
    });
    });
    

    Integração com GitHub

    Para versionar o projeto e manter o código seguro, utilizei os comandos Git abaixo:

    bash
    CopiarEditar
    cd Desktop
    cd detona-ralph
    git init
    git add .
    git commit -m "Commit inicial"
    git branch -M main
    git remote add origin https://github.com/eliabysilva/Detona-ralph.git
    git push -u origin main
    

    image

    Figura 02: Tela do jogo Detona Ralph

    Com isso, o projeto está disponível online para consulta e evolução contínua.

    Como o jogo funciona

    O usuário deve clicar rapidamente no quadrado onde o inimigo (personagem Ralph) aparece. Cada acerto aumenta a pontuação exibida em tempo real. O jogo dura 10 segundos, controlados por um temporizador visível na tela. Ao final, o jogo exibe o resultado final com um alerta.

    Resultados e aprendizados

    Este projeto permitiu consolidar conhecimentos em HTML, CSS e JavaScript, especialmente no que se refere à manipulação dinâmica do DOM, eventos e temporizadores. O uso do GitHub reforçou boas práticas de versionamento e organização.

    Conclusão

    Desenvolver o jogo "Detona Ralph" foi uma experiência enriquecedora para aprofundar o domínio das tecnologias front-end e ferramentas colaborativas, preparando para desafios futuros em desenvolvimento web.

    Referências

    • ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. NBR 6022:2018 – Informação e documentação – Artigo em publicação periódica técnica e/ou científica – Apresentação. Rio de Janeiro, 2018.
    • ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. NBR 6023:2018 – Informação e documentação – Referências – Elaboração. Rio de Janeiro, 2018.
    • ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. NBR 14724:2011 – Informação e documentação – Trabalhos acadêmicos – Apresentação. Rio de Janeiro, 2011.
    Compartilhe
    Recomendados para você
    TONNIE - Java and AI in Europe
    WEX - End to End Engineering
    Microsoft 50 Anos - Prompts Inteligentes
    Comentários (2)
    Eliabe Silva
    Eliabe Silva - 25/05/2025 19:49

    Valeu Rafaela ✌️

    Rafaela Silva
    Rafaela Silva - 25/05/2025 15:42

    Muito legal

    Recomendados para vocêWEX - End to End Engineering