Math Game using HTML and JavaScript (Source Code)
Published: 2023-05-22 07:15:10

**Introduction**

Hello Coder! Welcome to the Codewithrandom blog. today we're going to Create a **[Math Game](https://www.codewithrandom.com/2023/04/18/math-game-using-javascript/)** using HTML, CSS and JavaScript.The user must enter the correct number or operator to finish the equation in order to win the game. When finished, the user clicks "submit" to send their response.

A result screen appears once you click the submit button. The result is displayed on the result screen, along with a restart button.

These tasks range from being simple to being complex in difficulty. This playlist is appropriate for all levels of JavaScript learners. Therefore, this playlist includes something for everyone, regardless of Javascript experience level.

**Project Description**

**Step 1**
The HTML (Hypertext Markup Language) will help us to create the structure for the list with some necessary attributes and elements to make Math Game Project.

**Step 2**
Then we will use CSS (Cascading Stylesheet) which will help us to style or design the project with suitable padding and alignment in the Math Game Project.

**Step 3**
At last we will use JS (JavaScript) which will add logic to make the Math Game Project function from the user end.

I hope you have got an idea about the project.

## Math Game Html Code:-
```
<html lang="en">
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Math Game</title>
    <!-- Google Font -->
    <link
      href="https://fonts.googleapis.com/css2?family=Poppins:wght@500;600&display=swap"
      rel="stylesheet"
    />
    <!-- Stylesheet -->
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <div class="container">
      <h3>Fill In The Blank With Correct Number Or Operator</h3>
      <div id="question"></div>
      <button id="submit-btn">Submit</button>
      <p id="error-msg">Some Demo Error Message</p>
    </div>
    <div class="controls-container">
      <p id="result"></p>
      <button id="start-btn">Start Game</button>
    </div>
    <!-- Script -->
    <script src="script.js"></script>
  </body>
</html>
```
The container for our math quiz will be created inside the body element using a div tag with the class container, and the header will be set as an h3 using the h3 tag selector. Finally, a div container for the quiz's questions will be created inside the body tag using a div tag with the id question. The start button and the submit button for our maths quiz will now be made using the submit button.

we'll start with creating the structure of the Math Game project for that as you can see in the above code we have used all the necessary elements & attributes to set up the structure. Let us know to code the CSS part to add styling and aligned the tags.

## CSS Code for Math Game:-
```
* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
  font-family: "Poppins", sans-serif;
}
body {
  background-color: #f4c531;
}
.container {
  background-color: #ffffff;
  width: 90%;
  max-width: 31.25em;
  position: absolute;
  transform: translate(-50%, -50%);
  top: 50%;
  left: 50%;
  padding: 5em 3em;
  border-radius: 0.5em;
}
.container h3 {
  font-size: 1.2em;
  color: #23234c;
  text-align: center;
  font-weight: 500;
  line-height: 1.8em;
}
.container #submit-btn {
  font-size: 1.2em;
  font-weight: 500;
  display: block;
  margin: 0 auto;
  background-color: #f4c531;
  border-radius: 0.3em;
  border: none;
  outline: none;
  cursor: pointer;
  color: #23234c;
  padding: 0.6em 2em;
}
#error-msg {
  text-align: center;
  margin-top: 1em;
  background-color: #ffdde0;
  color: #d62f2f;
  padding: 0.2em 0;
}
.container #question {
  background-color: #eeedf1;
  font-size: 2em;
  font-weight: 600;
  color: #23234c;
  text-align: center;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 1.4em 0 1em 0;
  padding: 1em 0;
}
.container input {
  font-size: 1em;
  font-weight: 600;
  width: 2.35em;
  color: #23234c;
  text-align: center;
  padding: 0 0.2em;
  border: none;
  background-color: transparent;
  border-bottom: 0.12em solid #23234c;
  margin: 0 0.25em;
}
.container input:focus {
  border-color: #f4c531;
  outline: none;
}
/*Hide Number Arrows*/
.container input[type="number"] {
  -moz-appearance: textfield;
}
.container input[type="number"]::-webkit-outer-spin-button,
.container input[type="number"]::-webkit-inner-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
.controls-container {
  position: absolute;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  background-color: #f4c531;
  height: 100%;
  width: 100%;
  top: 0;
}
#start-btn {
  font-size: 1.2em;
  font-weight: 500;
  background-color: #ffffff;
  color: #23234c;
  border: none;
  outline: none;
  cursor: pointer;
  padding: 0.8em 1.8em;
  border-radius: 0.3em;
}
#result {
  margin-bottom: 1em;
  font-size: 1.5em;
  color: #23234c;
}
#result span {
  font-weight: 600;
}

.hide {
  display: none;
}
```
**Step1:** We will set the padding and margin to zero using the universal selector (*), then we will use the box-sizing property to set the box-sizing to "border-box." We'll set the font family to "Poppins" using the font family attribute as well.

We will also set the backdrop colour of our game to yellow using the body tag selector.
```
* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
  font-family: "Poppins", sans-serif;
}
body {
  background-color: #f4c531;
}
```
**Step2:** We'll set the container's background colour to white and its width to 90% using the class selector (.container) and the background colour property. We will translate the -50% from all side directions by using the transform attribute. We will use the border-radius attribute and add a border radius of 0.5 rem.

We will now style the operator's component parts. We will use the font-size property to set the font size to 1.2 em, the colour property to set the heading's colour to black, and the font-weight property to set the font weight to 500.
```
.container {
  background-color: #ffffff;
  width: 90%;
  max-width: 31.25em;
  position: absolute;
  transform: translate(-50%, -50%);
  top: 50%;
  left: 50%;
  padding: 5em 3em;
  border-radius: 0.5em;
}
.container h3 {
  font-size: 1.2em;
  color: #23234c;
  text-align: center;
  font-weight: 500;
  line-height: 1.8em;
}
.container #submit-btn {
  font-size: 1.2em;
  font-weight: 500;
  display: block;
  margin: 0 auto;
  background-color: #f4c531;
  border-radius: 0.3em;
  border: none;
  outline: none;
  cursor: pointer;
  color: #23234c;
  padding: 0.6em 2em;
}
#error-msg {
  text-align: center;
  margin-top: 1em;
  background-color: #ffdde0;
  color: #d62f2f;
  padding: 0.2em 0;
}
.container #question {
  background-color: #eeedf1;
  font-size: 2em;
  font-weight: 600;
  color: #23234c;
  text-align: center;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 1.4em 0 1em 0;
  padding: 1em 0;
}
.container input {
  font-size: 1em;
  font-weight: 600;
  width: 2.35em;
  color: #23234c;
  text-align: center;
  padding: 0 0.2em;
  border: none;
  background-color: transparent;
  border-bottom: 0.12em solid #23234c;
  margin: 0 0.25em;
}
.container input:focus {
  border-color: #f4c531;
  outline: none;
}
```
**Step3:** The text size, background color, padding, and margin of our button will now be set using the id selector when we add styling to our result, button, and display. To enhance the user experience, we will add these fundamental stylings to our button and result display.
```
#start-btn {
  font-size: 1.2em;
  font-weight: 500;
  background-color: #ffffff;
  color: #23234c;
  border: none;
  outline: none;
  cursor: pointer;
  padding: 0.8em 1.8em;
  border-radius: 0.3em;
}
#result {
  margin-bottom: 1em;
  font-size: 1.5em;
  color: #23234c;
}
#result span {
  font-weight: 600;
}

.hide {
  display: none;
}
```
Second comes the CSS code, which is mentioned above in that we have styled for the structure we have padded as well as aligned the Math Game project so that it is properly situated and doesn't get messy with suitable CSS elements. Now we have created the structure using HTML and styled the webpage using CSS its time to add the functionality using JavaScript in this project.

## JavaScript Code for Math Game
```
let operators = ["+", "-", "*"];
const startBtn = document.getElementById("start-btn");
const question = document.getElementById("question");
const controls = document.querySelector(".controls-container");
const result = document.getElementById("result");
const submitBtn = document.getElementById("submit-btn");
const errorMessage = document.getElementById("error-msg");
let answerValue;
let operatorQuestion;

//Random Value Generator
const randomValue = (min, max) => Math.floor(Math.random() * (max - min)) + min;

const questionGenerator = () => {
  //Two random values between 1 and 20
  let [num1, num2] = [randomValue(1, 20), randomValue(1, 20)];

  //For getting random operator
  let randomOperator = operators[Math.floor(Math.random() * operators.length)];

  if (randomOperator == "-" && num2 > num1) {
    [num1, num2] = [num2, num1];
  }

  //Solve equation
  let solution = eval(`${num1}${randomOperator}${num2}`);

  //For placing the input at random position
  //(1 for num1, 2 for num2, 3 for operator, anything else(4) for solution)
  let randomVar = randomValue(1, 5);

  if (randomVar == 1) {
    answerValue = num1;
    question.innerHTML = `<input type="number" id="inputValue" placeholder="?"\> ${randomOperator} ${num2} = ${solution}`;
  } else if (randomVar == 2) {
    answerValue = num2;
    question.innerHTML = `${num1} ${randomOperator}<input type="number" id="inputValue" placeholder="?"\> = ${solution}`;
  } else if (randomVar == 3) {
    answerValue = randomOperator;
    operatorQuestion = true;
    question.innerHTML = `${num1} <input type="text" id="inputValue" placeholder="?"\> ${num2} = ${solution}`;
  } else {
    answerValue = solution;
    question.innerHTML = `${num1} ${randomOperator} ${num2} = <input type="number" id="inputValue" placeholder="?"\>`;
  }

  //User Input Check
  submitBtn.addEventListener("click", () => {
    errorMessage.classList.add("hide");
    let userInput = document.getElementById("inputValue").value;
    //If user input is not empty
    if (userInput) {
      //If the user guessed correct answer
      if (userInput == answerValue) {
        stopGame(`Yippie!! <span>Correct</span> Answer`);
      }
      //If user inputs operator other than +,-,*
      else if (operatorQuestion && !operators.includes(userInput)) {
        errorMessage.classList.remove("hide");
        errorMessage.innerHTML = "Please enter a valid operator";
      }
      //If user guessed wrong answer
      else {
        stopGame(`Opps!! <span>Wrong</span> Answer`);
      }
    }
    //If user input is empty
    else {
      errorMessage.classList.remove("hide");
      errorMessage.innerHTML = "Input Cannot Be Empty";
    }
  });
};

//Start Game
startBtn.addEventListener("click", () => {
  operatorQuestion = false;
  answerValue = "";
  errorMessage.innerHTML = "";
  errorMessage.classList.add("hide");
  //Controls and buttons visibility
  controls.classList.add("hide");
  startBtn.classList.add("hide");
  questionGenerator();
});

//Stop Game
const stopGame = (resultText) => {
  result.innerHTML = resultText;
  startBtn.innerText = "Restart";
  controls.classList.remove("hide");
  startBtn.classList.remove("hide");
};
```
Using the let keyword, we will first create an array of operators and then use the document. With the getElementById property, we will select all the html elements, and along with these variables, we will create two more variables: answervalue and answeroperator. To use them inside our math game.

Now, using the math random function, we will get a random value between 1 and 20, then ask the user to guess one number. If the value of the guess number is the same, the function will evaluate and check if the solution is correct or not.

 We will display whether the answer is wrong, and we will also create the function for starting the game, and we will add an event listener to our button click to submit the guessed value to the function.

Last stage of the project the JavaScript in which we have added the logical and coded as per the requirement with some conditions. We have added the Question Generator in the constant section which will constantly generate the questions as per the user action. Let us see the Final Output of the project Math Game using HTML, CSS & JavaScript (Source Code).

We have Successfully created our **[Math Game](https://www.codewithrandom.com/2023/04/18/math-game-using-javascript/)** using HTML, CSS & JavaScript (Source Code). You can use this project for your personal needs and the respective lines of code are given with the code pen link mentioned above.

If you find out this Blog helpful, then make sure to search code with random on google for Front End Projects with Source codes and make sure to Follow the Code with Random Instagram page.

Code Idea - codingartist

Written By – Harsh Sawant

Code By – harshh9