From 776e79cd240b21467d329d5d77864d3239c8545e Mon Sep 17 00:00:00 2001 From: its-kritika Date: Wed, 31 Jul 2024 01:47:56 +0530 Subject: [PATCH] New Game, issue #1104 Created Arkanoid Game --- README.md | 1 + SinglePlayer - Games/Arkanoid_Game/README.md | 29 ++ SinglePlayer - Games/Arkanoid_Game/index.html | 29 ++ SinglePlayer - Games/Arkanoid_Game/script.js | 248 ++++++++++++++++++ SinglePlayer - Games/Arkanoid_Game/style.css | 67 +++++ assets/images/arkanoid-game1 (1).png | Bin 0 -> 20973 bytes assets/images/arkanoid-game1 (2).png | Bin 0 -> 29568 bytes 7 files changed, 374 insertions(+) create mode 100644 SinglePlayer - Games/Arkanoid_Game/README.md create mode 100644 SinglePlayer - Games/Arkanoid_Game/index.html create mode 100644 SinglePlayer - Games/Arkanoid_Game/script.js create mode 100644 SinglePlayer - Games/Arkanoid_Game/style.css create mode 100644 assets/images/arkanoid-game1 (1).png create mode 100644 assets/images/arkanoid-game1 (2).png diff --git a/README.md b/README.md index 0aacec62..74fcdda2 100644 --- a/README.md +++ b/README.md @@ -262,6 +262,7 @@ ________________________________________________________________________________ | 204 | [Breakout_Game](.SinglePlayer%20-%20Games/BreakOut_Game) | | 205 | [Breakout_Game](.SinglePlayer%20-%20Games/Maze_Game) | | 206 | [Breakout_Game](.SinglePlayer%20-%20Games/Bomber_Game) | +| 207 | [Arkanoid_Game](.SinglePlayer%20-%20Games/Arkanoid_Game) | diff --git a/SinglePlayer - Games/Arkanoid_Game/README.md b/SinglePlayer - Games/Arkanoid_Game/README.md new file mode 100644 index 00000000..ea78a296 --- /dev/null +++ b/SinglePlayer - Games/Arkanoid_Game/README.md @@ -0,0 +1,29 @@ +# Arkanoid Game +Welcome to the game! This is a classic brick-breaking game inspired by the popular game Arkanoid. The objective is to break all the bricks on the screen using a ball while preventing the ball from falling out of the play area with the help of a paddle. + +# Features +- **Brick Types**: The game includes three types of bricks, each with different hit points and corresponding score values: + - **Gold Bricks**: Requires 3 hits to break and gives the 25 points. + - **Silver Bricks**: Requires 2 hits to break and gives 15 points. + - **Red Bricks**: Requires 1 hit to break and gives the 8 points. +- **Dynamic Speed**: The ball speed increases as the score increases, adding more challenge to the game. +- **Scoring System**: Track your current score and lives. +- **Persistent Highest Score**: Highest score is saved locally in your browser. +- **Game Over Popup**: A popup appears with a restart button when the game is over. +- **Easy Controls**: Use arrow keys to move the basket left and right. + +# Installation +- Clone the repository +- Navigate to the project directory `cd Arkanoid_Game` + +# Usage +- Open index.html to start the game. +- Use the left and right arrow keys to move the paddle. +- Keep an eye on your score and lives at the top of the screen. +- When you lose all your lives, the game will show a "Game Over" popup with a button to restart the game. + +# Controls +- **Left Arrow Key**: Move basket to the left. +- **Right Arrow Key**: Move basket to the right. + +# Enjoy Playing!🥳 \ No newline at end of file diff --git a/SinglePlayer - Games/Arkanoid_Game/index.html b/SinglePlayer - Games/Arkanoid_Game/index.html new file mode 100644 index 00000000..705239da --- /dev/null +++ b/SinglePlayer - Games/Arkanoid_Game/index.html @@ -0,0 +1,29 @@ + + + + + + Arkanoid Game + + + +
+

Highest Score is :

+

Current Score : 0

+
+
+
+

Break the Blocks

+

Ready to Play!!

+ +
+ +
+

Game Over

+

+ +
+
+ + + \ No newline at end of file diff --git a/SinglePlayer - Games/Arkanoid_Game/script.js b/SinglePlayer - Games/Arkanoid_Game/script.js new file mode 100644 index 00000000..fb578374 --- /dev/null +++ b/SinglePlayer - Games/Arkanoid_Game/script.js @@ -0,0 +1,248 @@ +const canvas = document.getElementById('game-board') +const gameOver = document.getElementById('game-over') +const gameStart = document.getElementById('game-start') +const restart = document.getElementById('restart') +const start = document.getElementById('start') +const scoreCard = document.getElementById('score-card') +const Currscore = document.getElementById('current-score') +const highScoreCard = document.getElementById('highest-score') + +const ctx = canvas.getContext('2d') + +const highestScoreKey = 'arkanoid' +let highestScore = localStorage.getItem(highestScoreKey) ? parseInt(localStorage.getItem(highestScoreKey)) : 0 + +highScoreCard.textContent += highestScore + +//paddle +const paddleWidth = 130 +const paddleHeight = 12 +const paddleSpeed = 16 + +const ballRadius = 10 +//let gameRunning + +//brick +const brickRowCount = 7 +const brickColumnCount = 9 +const brickWidth = 75 +const brickHeight = 20 +const brickPadding = 10 +const brickOffsetTop = 30 +const brickOffsetLeft = 25 + +let score = 0 + +const keys = { + left : false, + right : false +} + +bricks = [] + +//When we press the arrow key +document.addEventListener('keydown', e => { + if (e.key === 'ArrowLeft') keys.left = true + if (e.key === 'ArrowRight') keys.right = true +}) + +//When arrow key is released +document.addEventListener('keyup', e => { + if (e.key === 'ArrowLeft') keys.left = false + if (e.key === 'ArrowRight') keys.right = false +}) + +function drawBall() { + ctx.beginPath(); + ctx.arc(x, y, ballRadius, 0, Math.PI * 2); + ctx.fillStyle = "#0095DD"; + ctx.fill(); + ctx.closePath(); +} + +function drawPaddle(){ + ctx.beginPath() //It's typically used when you want to start a new shape or line segment without connecting it to the previous shapes or lines drawn on the canvas. + //canvas.height: This is the total height of the canvas. Placing something exactly at canvas.height would put it right at the bottom edge of the canvas, which means it would be off-screen because the y-coordinates start at 0 at the top and increase downward. + //paddleHeight: This is the height of the paddle itself. By subtracting the paddle's height from the canvas height, you ensure that the top edge of the paddle is positioned exactly paddleHeight pixels above the bottom edge of the canvas. + // x-coordinate, y-coordinate, width of paddle, height of paddle + ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight) + ctx.fillStyle = '#00FF00' + ctx.fill() + ctx.closePath() +} + +function drawBricks() { + for (let c = 0; c < brickColumnCount; c++) { + if (c === 4){ + continue + } + for (let r = 0; r < brickRowCount; r++) { + // Only draw the brick if it has hit points left + if (bricks[c][r].hitPoints > 0) { + //c * (brickWidth + brickPadding) calculates the total horizontal distance from the left edge of the first brick to the left edge of the current brick. + //brickOffsetLeft ensures that the entire row of bricks is offset from the left edge of the canvas by a specific amount + const brickX = c * (brickWidth + brickPadding) + brickOffsetLeft + const brickY = r * (brickHeight + brickPadding) + brickOffsetTop + bricks[c][r].x = brickX + bricks[c][r].y = brickY + ctx.beginPath() + ctx.rect(brickX, brickY, brickWidth, brickHeight) + ctx.fillStyle = bricks[c][r].color + ctx.fill() + ctx.closePath() + } + } + } +} + +function movePaddle(){ + if (keys.left && paddleX > 0){ + paddleX -= paddleSpeed + } + if (keys.right && paddleX < canvas.width - paddleWidth){ + paddleX += paddleSpeed + } +} + +// Collision detection +function collisionDetection() { + for (let c = 0; c < brickColumnCount; c++) { + for (let r = 0; r < brickRowCount; r++) { + const brick = bricks[c][r]; + if (brick.hitPoints > 0) { + //Checking if ball's x-coordinate is greater than the brick's left edge and less than the brick's right edge + //Similarly for y-coordinate + if (x > brick.x && x < brick.x + brickWidth && y > brick.y && y < brick.y + brickHeight) { + dy = -dy //it reverses the vertical direction of the ball by negating its vertical velocity (dy). This makes the ball bounce off the brick. + brick.hitPoints-- + if (brick.hitPoints === 2) { + brick.color = "#bebebe" //silver + } else if (brick.hitPoints === 1) { + brick.color = "red" + } + else { + brick.color = ""; + score += (r === 3 || r === 0) ? 25 : (r === 2) ? 15 : 8 + } + } + } + } + } +} + +function adjustSpeedBasedOnScore() { + const baseSpeed = 3 + const speedIncrement = 0.5 // Adjust increment as needed + const additionalSpeed = Math.floor(score / 30) * speedIncrement; + + const newSpeed = baseSpeed + additionalSpeed + + // Adjust dx and dy proportionally to maintain the direction + const speedRatio = newSpeed / Math.sqrt(dx * dx + dy * dy); + dx *= speedRatio; + dy *= speedRatio; +} + +let animationFrameId + +function draw() { + ctx.clearRect(0, 0, canvas.width, canvas.height) + + drawBricks() + drawBall() + drawPaddle() + collisionDetection() + adjustSpeedBasedOnScore() + + + //Horizontal Collision Detection + if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) { + dx = -dx + } + //Top Collision Detection + if (y + dy < ballRadius) { + dy = -dy + } + //Bottom Collision Detection + else if (y + dy > canvas.height - ballRadius) { + if (x > paddleX && x < paddleX + paddleWidth) { + dy = -dy; + } else { + //gameRunning = false + scoreCard.textContent = 'Your Score is : ' + score + gameOver.style.display = 'block' + Currscore.style.display = 'none' + + if (score > highestScore){ + highestScore = score + localStorage.setItem(highestScoreKey, highestScore) + highScoreCard.textContent = 'Highest Score is : ' + highestScore + } + return + } + } + movePaddle() + + x += dx + y += dy + Currscore.textContent = 'Current Score : ' + score + animationFrameId = requestAnimationFrame(draw) +} + +function resetGame() { + //so that on restarting game speed of ball remains same, it happened bcoz each time resetGame is called, it starts a new game + //loop by calling draw again, which can result in multiple overlapping game loops, causing the ball to move faster. + if (animationFrameId) { + cancelAnimationFrame(animationFrameId); + } + + // Reset ball position + x = canvas.width / 2 + y = canvas.height - 30 + + // Reset ball velocity + const speed = 3 + dx = (Math.random() * 2 - 1) * speed + dy = -speed //so that ball always moves upward + + //Reset paddle + //By dividing the remaining space of the canvas (canvas.width - paddleWidth) by 2, we find the amount of space needed on the left + //side of the paddle to center it horizontally. This places the paddle in the middle of the canvas + paddleX = (canvas.width - paddleWidth) / 2 + + // Reset bricks + //it initializes a grid of bricks with different hit points and colors based on their row positions + for (let c = 0; c < brickColumnCount; c++) { + bricks[c] = [] + for (let r = 0; r < brickRowCount; r++) { + const hitPoints = (r === 3 || r === 0) ? 3 : (r === 2 || r === 4) ? 2 : 1; + let color + if (hitPoints === 3) { + color = '#ffcc00' //gold + } else if (hitPoints === 2) { + color = '#bebebe' //silver + } else { + color = 'red' + } + bricks[c][r] = { x: 0, y: 0, hitPoints, color } + } + } + + score = 0 + Currscore.style.display = 'block' + // Restart the game loop + draw() +} + +start.addEventListener('click', e => { + gameStart.style.display = 'none' + canvas.style.display = 'block' + resetGame() +}) + +//Re-initializing all variables +restart.addEventListener('click', e => { + gameOver.style.display = 'none' + resetGame() + +}) \ No newline at end of file diff --git a/SinglePlayer - Games/Arkanoid_Game/style.css b/SinglePlayer - Games/Arkanoid_Game/style.css new file mode 100644 index 00000000..c8869051 --- /dev/null +++ b/SinglePlayer - Games/Arkanoid_Game/style.css @@ -0,0 +1,67 @@ +body{ + box-sizing: border-box; + margin: 0; + height: 97vh; +} +.game-container{ + display: flex; + justify-content: center; + align-items: center; + position: relative; + height: 90%; +} +#game-board{ + background-color: black; + background-size: cover; + display: none; +} +#game-start{ + height: 500px; + width: 800px; + backdrop-filter: blur(12px) brightness(78%); + text-align: center; + font-size: 18px; +} +#game-over{ + width: 802px; + height: 560px; + display: none; + background-color: rgba(208, 207, 207, 0.838); + position: absolute; + z-index: 3; + text-align: center; +} +h1{ + margin-top: 18%; + margin-bottom: 3%; + font-family: Arial, Helvetica, sans-serif; +} +button{ + width: 140px; + height: 40px; + font-size: 16px; + cursor: pointer; +} +#score-card{ + font-size: 18px; + margin-bottom: 3%; +} +.flex{ + display: flex; +} +.flex p{ + margin: 12px; + font-size: 20px; + font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; + margin-right: 2.5%; +} +#highest-score{ + flex-grow: 1; +} +.name{ + font-size: 23px; + font-family: Arial, Helvetica, sans-serif; + margin-top: 15%; + color: rgba(7, 79, 174, 0.91); + font-weight: 600; +} \ No newline at end of file diff --git a/assets/images/arkanoid-game1 (1).png b/assets/images/arkanoid-game1 (1).png new file mode 100644 index 0000000000000000000000000000000000000000..24d20c2d9696bf3971a9ce2e939994a57552433e GIT binary patch literal 20973 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