Skip to content

Latest commit

Β 

History

History
388 lines (293 loc) Β· 11.8 KB

readme.md

File metadata and controls

388 lines (293 loc) Β· 11.8 KB

Detonator Dash

Background

Welcome to Detonator Dash, an exhilarating grid-based game where players strive to achieve the highest score by navigating a perilous landscape filled with coins, keys, and hidden bombs. The game introduces various elements, such as cool animations, a full interactive 8 by 8 grid, and strategic challenges that keep players on the edge of their seats.

Detonator Dash

Home Page

Wireframes

Wire Frame

Functionality & MVPs

In Detonator Dash, users can expect the following features:

  1. Tile Interaction:

    • Reveal tiles on the grid with strategic clicks.
  2. Scoring Mechanism:

    • Collect coins for 10 points each, diamonds near keys for $25, and keys for a substantial $50.
  3. Visual Cues:

    • Receive visual cues:
      • Blue indicates proximity to the key when clicking on a coin.
      • Red signifies dangerβ€”you're on a bomb.
  4. Progressive Challenges:

    • Progress through levels with increasing difficulty and dynamically adjusting grid sizes.
  5. Scoreboard:

    • View the number of lives and the current score to track your progress.

Additionally, the project will include:

  • Instructions & README:
    • Detailed instructions on gameplay and controls.
    • A comprehensive README file providing information about the project.

Instructions

Welcome to Denotator Dash, an adrenaline-pumping grid-based game that takes excitement to new heights. In this thrilling journey, players embark on a quest to achieve the highest score possible by strategically collecting coins and unlocking vaults with keys, all while navigating the treacherous landscape of hidden bombs.

The game unfolds in a grid filled with a dynamic array of elements, including coins, keys, and enticing power-ups. Your task is to strategically click on tiles, revealing coins and keys to earn points. Be on the lookout for diamonds, as tiles near the key are diamonds worth $25 each. Keys, on the other hand, are worth a whopping $50. Keep an eye out for visual cues: blue indicates you are near the key, while red signals you are on a bomb.

Brace yourself for an escalating challenge as each level expands the grid and introduces more hidden bombs. Dive into the game's strategic depth as you encounter hidden power-ups that elevate your gameplay to new heights.

Progress through levels with increasing difficulty, navigating larger grids and facing more unpredictable challenges. Keep a close eye on your number of lives and your current scoreβ€”your journey through Denotator Dash is a relentless test of skill and strategy.

To play click the screen with your mouse to reveal the hidden tiles and aim for a highscore!

Technologies, Libraries, APIs

Detonator Dash leverages the following technologies, libraries, and methods:

  • JavaScript:

    • For game logic and interactivity.
  • CSS:

    • For styling the game interface.
  • GitHub Pages:

    • To deploy the game online.

Technical Implementations

Creating a Board:

  • Created a nested for loop to generate (64) "li" tags and appended them to my boardContainer div tag
  • Need to add some styling to make the board a symmetric grid
  • Then, I assigned a unique id to each "li" tag so that I could reference that specific tag
  createBoard() {
    for (let r = 0; r < 8; r++) {
      for (let c = 0; c < 8; c++) {
        let tile = document.createElement("li");
        tile.dataset.posX = r;
        tile.dataset.posY = c;
        tile.setAttribute("id", r + "-" + c);
        this.boardContainer.appendChild(tile);
      }
    }
    this.updateScoreDisplay();
    this.updateVaultCount();
    this.updateLifeCount();
    this.boardContainer.addEventListener("click", this.handleClick);
  }
#board {
  width: 550px;
  height: fit-content;
  border: 10px solid black;
  background-color: lightslategray;
  position: relative;
  top: 150px;
  margin: 0 auto;
  display: flex;
  flex-wrap: wrap;
}

li {
  width: 66.75px;
  height: 66.75px;
  border: 1px solid black;
  margin: 0px;
  font-size: 30px;
  display: inline-flex;
  justify-content: center;
  align-items: center;
  padding-bottom: 0px;
}

Creating a Hidden Board:

  • Created a hidden board so that it wouldn't show what was behind the tiles.
  • Next, randomly populated the board with 1 key and the default 20% bombs, and the rest cash
  • This guaranteed the board is constantly shuffled each time.
  createBoardArray() {
    if (this.bombRate === undefined) {
      this.bombRate = 0.2;
    }

    this.keyPosition = {
      row: Math.floor(Math.random() * 8),
      column: Math.floor(Math.random() * 8),
    };

    let arr = [];
    for (let i = 0; i < 8; i++) {
      const row = [];
      for (let j = 0; j < 8; j++) {
        if (i === this.keyPosition.row && j === this.keyPosition.column) {
          row.push("πŸ—οΈ");
        } else {
          const randomValue = Math.random();
          const cellValue = randomValue <= this.bombRate ? "πŸ’£" : "πŸ’°";
          row.push(cellValue);
        }
      }
      arr.push(row);
    }
    return arr;
  }

Creating a Reveal Board:

  • Use a nested for loop to literate over whole the board
  • Next, found each li tag by it's id and added its assigned class
  revealBoard() {
    for (let i = 0; i < 8; i++) {
      for (let j = 0; j < 8; j++) {
        let tile = document.getElementById(i + "-" + j);
        switch (this.boardArray[i][j]) {
          case "πŸ’°":
            if (this.nearKey(parseInt(i), parseInt(j))) {
              tile.classList.add("diamondTile");
            } else {
              tile.classList.add("cashTile");
            }
            break;
          case "πŸ—οΈ":
            tile.classList.add("keyTile");
            break;
          case "πŸ’£":
            tile.classList.add("bombTile");
            break;
        }
      }
    }
  }

Creating a click method:

  • Created method where the tile will change to its respected value
  • Based on the tile clicked certain methods will occur
  • Keys: creates a new board with greater rewards, diamond & cash: increase score, bomb: 1 life each tile
  • prevented the action of clicking a tile more than twice
  • create a modal pop up whenever lives equal 0
  handleClick(e) {
    const dataPosValue = [
      parseInt(e.target.dataset.posX),
      parseInt(e.target.dataset.posY),
    ];

    if (
      e.target.classList.contains("diamondTile") ||
      e.target.classList.contains("cashTile") ||
      e.target.classList.contains("keyTile") ||
      e.target.classList.contains("bombTile")
    ) {
      return;
    }

    if (this.boardArray[dataPosValue[0]][dataPosValue[1]] === "πŸ’°") {
      if (this.nearKey(dataPosValue[0], dataPosValue[1])) {
        e.target.classList.add("diamondTile");
        this.score += this.diamondScore;
      } else {
        e.target.classList.add("cashTile");
        this.score += this.cashScore;
      }
    } else if (this.boardArray[dataPosValue[0]][dataPosValue[1]] === "πŸ—οΈ") {
      e.target.classList.add("keyTile");
      this.score += this.KeyScore;
      this.KeyFound();
      this.vaultCount += 1;
    } else {
      e.target.classList.add("bombTile");
      this.life--;
      if (this.life === 0) {
        this.updateLifeCount();
        this.revealBoard();

        const modalContent = document.getElementById("context");
        modalContent.innerHTML = "";

        const h3Element1 = document.createElement("h3");
        const h3Element2 = document.createElement("h3");
        const h3Element3 = document.createElement("h3");
        h3Element1.textContent = "GAME OVER!!!";
        h3Element2.textContent = `Vault Number: ${this.vaultCount}`;
        h3Element3.textContent = `Your Score: $${this.score}`;
        modalContent.appendChild(h3Element1);
        modalContent.appendChild(h3Element2);
        modalContent.appendChild(h3Element3);

        const modal = document.getElementById("gameOverModal");
        modal.style.display = "flex";

        const closeModal = document.getElementById("closeModal");
        closeModal.addEventListener("click", () => {
          modal.style.display = "none";
        });

        this.boardContainer.removeEventListener("click", this.handleClick);
        return;
      }
    }
    this.updateScoreDisplay();
    this.updateLifeCount();
  }

Update Score Board:

  • Created a score board that updates the current information
  • It grabs the div tag by the id and reassigns the existing information
  updateScoreDisplay() {
    const score = document.getElementById("score");
    score.innerHTML = "Current Score $" + this.score;
    console.log("Score: $" + this.score);
  }

  updateVaultCount() {
    const vault = document.getElementById("vaultCount");
    vault.innerHTML = "Vault Number " + this.vaultCount;
  }

  updateLifeCount() {
    const life = document.getElementById("lifeCount");
    life.innerHTML = "Lives " + this.life;
  }

Creating a Reset Button:

  • Created a button to reset the game
  • Added a eventlister so the reset game is called
  • The reset game method resets everything to default
  createResetButton() {
    const resetButton = document.getElementById("resetGame");
    resetButton.classList.add("reset");
    resetButton.textContent = "Reset Game";
    resetButton.addEventListener("click", () => this.resetGame());
  }

  resetGame() {
    this.vaultCount = 1;
    this.score = 0;
    this.KeyScore = 50;
    this.diamondScore = 25;
    this.cashScore = 10;
    this.bombRate = 0.2;
    this.life = 3;
    this.boardArray = this.createBoardArray();
    this.boardContainer.innerHTML = "";
    this.createBoard();
    this.updateScoreDisplay();
    this.updateVaultCount();
    this.updateLifeCount();
  }

Implementation Timeline

Thursday

  • Set Up Repository:

    • Create local and remote repositories.
    • Structure the project folders.
  • Basic HTML and CSS:

    • Set up the HTML structure.
    • Apply initial styling using CSS.

Friday Afternoon & Weekend

  • Game Grid and Tiles:

    • Define different tile types (cash, diamonds, keys, bombs).
  • Tile Click Functionality:

    • Add functionality to reveal tiles upon clicking.

Monday

  • Scoring System:

    • Implement scoring logic for cash, diamonds, and keys.
  • Proximity Indicator:

    • Added visual cues (blue/diamonds) for proximity to 1 tile from the key when clicking on cash.

Tuesday

  • Animations:

    • Integrate tiles with unique effects.
  • Adjusting Grid Size:

    • Implement dynamic grid resizing and bomb addition for increasing difficulty.

Wednesday Morning

  • Lives Display:

    • Display the number of lives remaining.
  • README:

    • Write detailed instructions and information in the README file.

Presentation & Deployment

  • Prepare Presentation:

    • Practice the presentation.
    • Prepare visuals for the presentation.
  • Deploy to GitHub Pages:

    • Deploy the game online using GitHub Pages.

This timeline provides a structured plan for the development of Detonator Dash, ensuring a smooth and organized progression throughout the project. Adjustments can be made based on the actual progress during each phase of development.

Future Implementations

  • Add music and sound effect to every indivual sound effects
  • Add a Easy, Default, and Hard mode
  • Add diffent grid sizes options
  • Add powerups in the future

CC Licensing: