Hello Guys! Welcome to Coding Torque. In this blog, we are going to create a Rock Paper Scissor using HTML, CSS & JavaScript. You should create this project if you are a beginner and learning JavaScript.
Before we start, here are some more JavaScript projects for you to practice:
1. Filter Cards using JavaScript
2. Typing Effect using JavaScript
3. Email Validator using JavaScript
4. Tip Calculator using JavaScript
5. QR Code Generator using JavaScript
I would recommend you don't just copy and paste the code, just look at the code and type by understanding it.
Let's go step by step:
Step 1: HTML Code
Starter Template
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSS -->
<link rel="stylesheet" href="style.css">
<title>Rock Paper Scissor Game using JavaSript using JavaScript with Source Code - @code.scientist x @codingtorque
</title>
</head>
<body>
<!-- Further code here -->
<script src="script.js"></script>
</body>
</html>
Paste the below code in your <body> tag
<div id="root">
<div class="results">
<span class="you-win">You: 0</span>
<span class="draw">DRAW!</span>
<span class="pc-win">PC: 0</span>
</div>
<h1>Rock Paper Scissors</h1>
<section class="choose">
<div class="options">
<div data-option="rock" class="img">
<img
src="https://raw.githubusercontent.com/developedbyed/rock-paper-scissor/master/assets/rock.png">
</div>
<div data-option="paper" class="img">
<img
src="https://raw.githubusercontent.com/developedbyed/rock-paper-scissor/master/assets/paper.png">
</div>
<div data-option="scissors" class="img">
<img
src="https://raw.githubusercontent.com/developedbyed/rock-paper-scissor/master/assets/scissors.png">
</div>
<button data-option="rock">Rock</button>
<button data-option="paper">Paper</button>
<button data-option="scissors">Scissors</button>
</div>
</section>
</div>
Output Till Now
Step 2: CSS Code
Create a file style.css and paste the code below.
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
font-family: "Roboto", sans-serif;
font-size: 1em;
}
body {
height: 100vh;
background-color: darkslateblue;
}
.results {
display: flex;
justify-content: space-between;
padding: 0.7em 1em;
color: white;
font-size: 1.5em;
}
.results > .draw {
font-size: 2.3em;
transform: scale(0);
}
h1 {
font-size: 3.7em;
color: white;
text-align: center;
padding: 0.5em 0;
letter-spacing: 0.1em;
}
section {
padding: 0 15em;
}
.options {
display: flex;
justify-content: space-around;
flex-wrap: wrap;
}
.img {
flex-basis: 30%;
border-radius: 10px;
margin-bottom: 1em;
}
img {
width: 100%;
height: 100%;
}
button[data-option] {
flex-basis: 15%;
background-color: transparent;
font-size: 1.5em;
color: white;
border: 2px solid white;
border-radius: 10px;
line-height: 2em;
transition: 0.2 ease;
}
button[data-option]:hover {
color: darkslateblue;
background-color: white;
cursor: pointer;
}
.draw-animation {
animation: draw 0.5s ease 1 both;
}
.player-choice {
background-color: #fff;
}
.pc-choice {
background-color: yellow;
}
.draw-color {
background-image: linear-gradient(-43deg, white 50%, yellow 50%);
}
@keyframes draw {
50% {
transform: scale(1.5);
}
100% {
transform: scale(1.5);
}
}
Output Till Now
Step 3: JavaScript Code
Create a file script.js and paste the code below.
class Result {
static whoWin(yourChoice, PCchoice) {
if (yourChoice === "rock" && PCchoice === "scissors" || yourChoice === "scissors" && PCchoice === "paper" || yourChoice === "paper" && PCchoice === "rock") return "win";
else if (yourChoice === "scissors" && PCchoice === "rock" || yourChoice === "paper" && PCchoice === "scissors" || yourChoice === "rock" && PCchoice === "paper") return "lose";
else return "draw";
}
}
class Choice {
constructor(yourChoice) {
this.yourChoice = yourChoice;
this.PCchoice = this.drawPcChoice();
}
getYourChoice = () => this.yourChoice;
getPcChoice = () => this.PCchoice;
drawPcChoice() {
const options = ["rock", "paper", "scissors"];
return options[Math.floor(Math.random() * options.length)];
}
}
class Stats {
constructor(wins, draws, loses) {
this.status = {
wins: wins,
draws: draws,
loses: loses,
}
}
getStats = () => this.status;
refreshStats(result) {
switch (result) {
case "win":
this.status.wins++;
break;
case "draw":
this.status.draws++;
break;
case "lose":
this.status.loses++;
break;
}
}
}
class Game {
constructor() {
this.optionsImg = document.querySelectorAll('.img');
this.optionsBtns = document.querySelectorAll('button');
this.optionsBtns.forEach(option => option.addEventListener('click', this.startGame.bind(this)))
this.youWins = document.querySelector('.results > .you-win');
this.draw = document.querySelector('.results > .draw');
this.PcWins = document.querySelector('.results > .pc-win');
this.stats = new Stats(0, 0, 0);
this.render.call(this, this.stats.getStats());
}
startGame(e) {
this.optionsImg.forEach(choice => choice.className = 'img');
if (this.draw.classList.contains('draw-animation')) {
this.draw.classList.toggle('draw-animation');
}
this.choice = new Choice(e.target.dataset.option);
const yourChoice = this.choice.getYourChoice(),
PcChoice = this.choice.getPcChoice();
if (yourChoice === PcChoice) {
[...this.optionsImg].find(choice => choice.dataset.option === PcChoice && choice.dataset.option === PcChoice).classList.add('draw-color');
this.draw.classList.toggle('draw-animation');
} else {
[...this.optionsImg].find(choice => choice.dataset.option === yourChoice).classList.add('player-choice');
[...this.optionsImg].find(choice => choice.dataset.option === PcChoice).classList.add('pc-choice');
}
this.stats.refreshStats(Result.whoWin(yourChoice, PcChoice));
this.render.call(this, this.stats.getStats());
}
render(stats) {
this.youWins.textContent = `You: ${stats.wins}`;
this.PcWins.textContent = `PC: ${stats.loses}`;
}
}
const newGame = new Game();
If you want me to code any project or post any specific post, feel free to DM me at IG @code.scientist or @codingtorque
If you have any doubts or any project ideas feel free to Contact Us
Hope you find this post helpful💖
Follow us on Instagram for more projects like this👨💻