From d489ed1685079d7763b4388ef37bbb53a7e74b9f Mon Sep 17 00:00:00 2001 From: suhani bansal Date: Thu, 13 Jun 2024 20:33:54 +0530 Subject: [PATCH 1/4] added airhockey game --- Games/Airhocky_game/game.js | 155 +++++++++++++++++++++++++++++++++ Games/Airhocky_game/index.html | 29 ++++++ README.md | 1 + 3 files changed, 185 insertions(+) create mode 100644 Games/Airhocky_game/game.js create mode 100644 Games/Airhocky_game/index.html diff --git a/Games/Airhocky_game/game.js b/Games/Airhocky_game/game.js new file mode 100644 index 0000000000..04c34a4b74 --- /dev/null +++ b/Games/Airhocky_game/game.js @@ -0,0 +1,155 @@ +const canvas = document.getElementById('gameCanvas'); +const ctx = canvas.getContext('2d'); + +const WIDTH = canvas.width; +const HEIGHT = canvas.height; +const PUCK_RADIUS = 15; +const MALLET_RADIUS = 30; +const FRICTION = 0.99; +const GOAL_WIDTH = 200; +const GOAL_HEIGHT = 40; +const MAX_SPEED = 10; + +let puck = { x: WIDTH / 2, y: HEIGHT / 2, vx: 0, vy: 0 }; +let mallet1 = { x: WIDTH / 4, y: HEIGHT / 2 }; +let mallet2 = { x: 3 * WIDTH / 4, y: HEIGHT / 2 }; +let playerScore = 0; +let computerScore = 0; + +canvas.addEventListener('mousemove', (event) => { + mallet1.x = event.offsetX; + mallet1.y = event.offsetY; + mallet1.x = Math.min(Math.max(mallet1.x, MALLET_RADIUS), WIDTH - MALLET_RADIUS); + mallet1.y = Math.min(Math.max(mallet1.y, MALLET_RADIUS), HEIGHT - MALLET_RADIUS); +}); + +function drawCircle(x, y, radius, color) { + ctx.beginPath(); + ctx.arc(x, y, radius, 0, Math.PI * 2); + ctx.fillStyle = color; + ctx.fill(); + ctx.closePath(); +} + +function drawRectangle(x, y, width, height, color) { + ctx.beginPath(); + ctx.rect(x, y, width, height); + ctx.fillStyle = color; + ctx.fill(); + ctx.closePath(); +} + +function drawLine(x1, y1, x2, y2, color) { + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.strokeStyle = color; + ctx.lineWidth = 5; + ctx.stroke(); + ctx.closePath(); +} + +function updatePuck() { + puck.x += puck.vx; + puck.y += puck.vy; + puck.vx *= FRICTION; + puck.vy *= FRICTION; + + // Ensure speed does not exceed maximum + let speed = Math.sqrt(puck.vx * puck.vx + puck.vy * puck.vy); + if (speed > MAX_SPEED) { + puck.vx *= MAX_SPEED / speed; + puck.vy *= MAX_SPEED / speed; + } + + // Ensure puck does not move out of the borders + if (puck.x < PUCK_RADIUS) { + puck.x = PUCK_RADIUS; + puck.vx = -puck.vx; + } + if (puck.x > WIDTH - PUCK_RADIUS) { + puck.x = WIDTH - PUCK_RADIUS; + puck.vx = -puck.vx; + } + if (puck.y < PUCK_RADIUS) { + puck.y = PUCK_RADIUS; + puck.vy = -puck.vy; + } + if (puck.y > HEIGHT - PUCK_RADIUS) { + puck.y = HEIGHT - PUCK_RADIUS; + puck.vy = -puck.vy; + } + + if (puck.x <= PUCK_RADIUS && (puck.y > HEIGHT / 2 - GOAL_WIDTH / 2 && puck.y < HEIGHT / 2 + GOAL_WIDTH / 2)) { + computerScore++; + resetPuck(); + } + + if (puck.x >= WIDTH - PUCK_RADIUS && (puck.y > HEIGHT / 2 - GOAL_WIDTH / 2 && puck.y < HEIGHT / 2 + GOAL_WIDTH / 2)) { + playerScore++; + resetPuck(); + } +} + +function resetPuck() { + puck.x = WIDTH / 2; + puck.y = HEIGHT / 2; + puck.vx = 0; + puck.vy = 0; +} + +function checkCollisionWithMallet(mallet) { + let dx = puck.x - mallet.x; + let dy = puck.y - mallet.y; + let distance = Math.sqrt(dx * dx + dy * dy); + + if (distance < PUCK_RADIUS + MALLET_RADIUS) { + let angle = Math.atan2(dy, dx); + puck.vx = Math.cos(angle) * 5; + puck.vy = Math.sin(angle) * 5; + + // Move puck out of collision + let overlap = PUCK_RADIUS + MALLET_RADIUS - distance; + puck.x += Math.cos(angle) * overlap; + puck.y += Math.sin(angle) * overlap; + } +} + +function updateComputerMallet() { + let dx = puck.x - mallet2.x; + let dy = puck.y - mallet2.y; + + // Simplified AI: Move towards the puck + mallet2.x += dx * 0.05; + mallet2.y += dy * 0.05; + + // Restrict to the table + mallet2.x = Math.min(Math.max(mallet2.x, MALLET_RADIUS), WIDTH - MALLET_RADIUS); + mallet2.y = Math.min(Math.max(mallet2.y, MALLET_RADIUS), HEIGHT - MALLET_RADIUS); +} + +function draw() { + ctx.clearRect(0, 0, WIDTH, HEIGHT); + + drawRectangle(0, HEIGHT / 2 - GOAL_WIDTH / 2, GOAL_HEIGHT, GOAL_WIDTH, '#00ff00'); + drawRectangle(WIDTH - GOAL_HEIGHT, HEIGHT / 2 - GOAL_WIDTH / 2, GOAL_HEIGHT, GOAL_WIDTH, '#00ff00'); + drawLine(WIDTH / 2, 0, WIDTH / 2, HEIGHT, '#ffffff'); + + drawCircle(puck.x, puck.y, PUCK_RADIUS, '#ff0000'); + drawCircle(mallet1.x, mallet1.y, MALLET_RADIUS, '#00ff00'); + drawCircle(mallet2.x, mallet2.y, MALLET_RADIUS, '#0000ff'); + + updatePuck(); + checkCollisionWithMallet(mallet1); + checkCollisionWithMallet(mallet2); + updateComputerMallet(); + + ctx.font = "20px Arial"; + ctx.fillStyle = "#ffffff"; + ctx.fillText(`Player: ${playerScore}`, 20, 30); + ctx.fillText(`Computer: ${computerScore}`, WIDTH - 150, 30); + + requestAnimationFrame(draw); +} + +draw(); diff --git a/Games/Airhocky_game/index.html b/Games/Airhocky_game/index.html new file mode 100644 index 0000000000..3f8b821bc0 --- /dev/null +++ b/Games/Airhocky_game/index.html @@ -0,0 +1,29 @@ + + + + + + Air Hockey Game + + + + + + + + diff --git a/README.md b/README.md index 624620560c..25936bcab5 100644 --- a/README.md +++ b/README.md @@ -354,6 +354,7 @@ This repository also provides one such platforms where contributers come over an | [Block_Ninja] (https://github.com/kunjgit/GameZone/tree/main/Games/Block_Ninja) | | [Disney_Trivia](https://github.com/manmita/GameZone/tree/Disney_Trivia/Games/Disney_Trivia)| |[Harmony_Mixer](https://github.com/kunjgit/GameZone/tree/main/Games/Harmony_Mixer)| +| [Airhockey_game](https://github.com/kunjgit/GameZone/tree/main/Games/Airhockey_game)| From 091861ca1afad815214e1a123ba136260c9c85c9 Mon Sep 17 00:00:00 2001 From: suhani bansal Date: Thu, 13 Jun 2024 21:08:13 +0530 Subject: [PATCH 2/4] Added image and readme file. --- Games/Airhocky_game/README.md | 23 +++++++++++++++++++++++ Games/Airhocky_game/airhockey_game.png | Bin 0 -> 12459 bytes 2 files changed, 23 insertions(+) create mode 100644 Games/Airhocky_game/README.md create mode 100644 Games/Airhocky_game/airhockey_game.png diff --git a/Games/Airhocky_game/README.md b/Games/Airhocky_game/README.md new file mode 100644 index 0000000000..8c535cbbec --- /dev/null +++ b/Games/Airhocky_game/README.md @@ -0,0 +1,23 @@ +# **Game_Name** + +Airhockey_game + +
+ +## **Description 📃** +- game involves simulating the movement and interactions of the puck and mallets on a table. + +## **functionalities 🎮** +- this game is played by just moving your cursor or mouse around and score a goal. providing a challenging experience for the player against the computer-controlled opponent. +
+ +## **How to play? 🕹ī¸** +-Start the Game +Score Goals +Defend Your Goal +
+ +## **Screenshots 📸** + +
+[image](GameZone\Games\Airhocky_game\airhockey_game.png) \ No newline at end of file diff --git a/Games/Airhocky_game/airhockey_game.png b/Games/Airhocky_game/airhockey_game.png new file mode 100644 index 0000000000000000000000000000000000000000..32eb99ce12ba5a8b682097e65e2789bc4e926f65 GIT binary patch literal 12459 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 Date: Sun, 16 Jun 2024 19:49:38 +0530 Subject: [PATCH 3/4] updated readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a8fdd5e89c..b955e09b2d 100644 --- a/README.md +++ b/README.md @@ -344,7 +344,7 @@ This repository also provides one such platforms where contributers come over an | [Intellect Quest](https://github.com/Will2Jacks/GameZoneForked/tree/Task/Games/Intellect_Quest) | | [Number_Guessing_Game](https://github.com/kunjgit/GameZone/tree/main/Games/Number_Guessing_Game) | | [Modulo_Game](https://github.com/kunjgit/GameZone/tree/main/Games/Modulo_Game) | - +| [Airhockey_Game](https://github.com/kunjgit/GameZone/tree/main/Games/Airhockey_Game) |
From 28cfa0c56d901516154fd2eeb66b1bf27e59e7eb Mon Sep 17 00:00:00 2001 From: suhani bansal Date: Sun, 16 Jun 2024 19:50:43 +0530 Subject: [PATCH 4/4] Added Image --- assets/images/Airhockey_Game.png | Bin 0 -> 12459 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/images/Airhockey_Game.png diff --git a/assets/images/Airhockey_Game.png b/assets/images/Airhockey_Game.png new file mode 100644 index 0000000000000000000000000000000000000000..32eb99ce12ba5a8b682097e65e2789bc4e926f65 GIT binary patch literal 12459 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