formatted like my Boss wants it (help!)
This commit is contained in:
parent
5d11f87dd3
commit
b507a6b0ea
19 changed files with 1425 additions and 1136 deletions
63
dropdown.js
63
dropdown.js
|
@ -18,39 +18,44 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const menu = document.querySelector(".menu");
|
||||
const burgerMenu = document.querySelector(".burger-menu");
|
||||
const menu = document.querySelector(".menu");
|
||||
const burgerMenu = document.querySelector(".burger-menu");
|
||||
|
||||
if (!menu || !burgerMenu) {
|
||||
console.warn("Menu or burger menu element not found. Ensure they exist in the DOM.");
|
||||
return;
|
||||
if (!menu || !burgerMenu) {
|
||||
console.warn(
|
||||
"Menu or burger menu element not found. Ensure they exist in the DOM."
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
// Toggle the menu visibility
|
||||
function toggleMenu() {
|
||||
menu.classList.toggle("active");
|
||||
|
||||
if (menu.classList.contains("active")) {
|
||||
// Add click listener to close menu when clicking outside
|
||||
document.addEventListener("click", closeMenu);
|
||||
} else {
|
||||
// Remove the click listener when menu is closed
|
||||
document.removeEventListener("click", closeMenu);
|
||||
}
|
||||
}
|
||||
|
||||
// Toggle the menu visibility
|
||||
function toggleMenu() {
|
||||
menu.classList.toggle("active");
|
||||
|
||||
if (menu.classList.contains("active")) {
|
||||
// Add click listener to close menu when clicking outside
|
||||
document.addEventListener("click", closeMenu);
|
||||
} else {
|
||||
// Remove the click listener when menu is closed
|
||||
document.removeEventListener("click", closeMenu);
|
||||
}
|
||||
// Close the menu if clicking outside of it
|
||||
function closeMenu(event) {
|
||||
if (
|
||||
!menu.contains(event.target) &&
|
||||
!event.target.classList.contains("burger-menu")
|
||||
) {
|
||||
menu.classList.remove("active");
|
||||
document.removeEventListener("click", closeMenu);
|
||||
}
|
||||
}
|
||||
|
||||
// Close the menu if clicking outside of it
|
||||
function closeMenu(event) {
|
||||
if (!menu.contains(event.target) && !event.target.classList.contains("burger-menu")) {
|
||||
menu.classList.remove("active");
|
||||
document.removeEventListener("click", closeMenu);
|
||||
}
|
||||
}
|
||||
|
||||
// Attach click event to the burger menu button
|
||||
burgerMenu.addEventListener("click", (event) => {
|
||||
event.stopPropagation(); // Prevent click from immediately triggering closeMenu
|
||||
toggleMenu();
|
||||
});
|
||||
// Attach click event to the burger menu button
|
||||
burgerMenu.addEventListener("click", (event) => {
|
||||
event.stopPropagation(); // Prevent click from immediately triggering closeMenu
|
||||
toggleMenu();
|
||||
});
|
||||
});
|
||||
// @license-end
|
|
@ -37,17 +37,16 @@ class Footer extends HTMLElement {
|
|||
`;
|
||||
|
||||
// Add event listener for button click
|
||||
this.querySelector('.secret-button').addEventListener('click', () => {
|
||||
window.open('secret/index.html', '_blank');
|
||||
this.querySelector(".secret-button").addEventListener("click", () => {
|
||||
window.open("secret/index.html", "_blank");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define('footer-component', Footer);
|
||||
|
||||
customElements.define("footer-component", Footer);
|
||||
|
||||
// CSS for the hidden button
|
||||
const style = document.createElement('style');
|
||||
const style = document.createElement("style");
|
||||
style.textContent = `
|
||||
.secret-button {
|
||||
display: none;
|
||||
|
|
|
@ -42,5 +42,5 @@ class Header extends HTMLElement {
|
|||
}
|
||||
}
|
||||
|
||||
customElements.define('header-component', Header);
|
||||
customElements.define("header-component", Header);
|
||||
// @license-end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
"use strict";
|
||||
// Canvas setup
|
||||
const canvas = document.getElementById('gameCanvas');
|
||||
const ctx = canvas.getContext('2d');
|
||||
const canvas = document.getElementById("gameCanvas");
|
||||
const ctx = canvas.getContext("2d");
|
||||
const targetFPS = 60;
|
||||
const targetFrameTime = 1000 / targetFPS;
|
||||
canvas.width = window.innerWidth;
|
||||
|
@ -15,9 +15,9 @@ const player = {
|
|||
y: canvas.height - 60,
|
||||
width: 40,
|
||||
height: 40,
|
||||
color: 'white',
|
||||
color: "white",
|
||||
speed: 5,
|
||||
dx: 0
|
||||
dx: 0,
|
||||
};
|
||||
|
||||
let bullets = [];
|
||||
|
@ -48,14 +48,14 @@ let greenSphereCooldown = 0;
|
|||
let rainbowSphereCooldown = 0;
|
||||
|
||||
// Sphere types
|
||||
const sphereTypes = ['blue', 'yellow', 'green', 'rainbow'];
|
||||
const sphereTypes = ["blue", "yellow", "green", "rainbow"];
|
||||
|
||||
/// Control for left button press and release
|
||||
function btnMoveLeft(isPressed) {
|
||||
if (isPressed) {
|
||||
player.dx = -player.speed; // Start moving left
|
||||
player.dx = -player.speed; // Start moving left
|
||||
} else {
|
||||
player.dx = 0; // Stop moving when button is released
|
||||
player.dx = 0; // Stop moving when button is released
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -70,37 +70,42 @@ function btnShoot() {
|
|||
// Control for right button press and release
|
||||
function btnMoveRight(isPressed) {
|
||||
if (isPressed) {
|
||||
player.dx = player.speed; // Start moving right
|
||||
player.dx = player.speed; // Start moving right
|
||||
} else {
|
||||
player.dx = 0; // Stop moving when button is released
|
||||
player.dx = 0; // Stop moving when button is released
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementById('shootBtn').addEventListener('mouseup', () => {
|
||||
document.getElementById("shootBtn").addEventListener("mouseup", () => {
|
||||
canShoot = true; // Allow shooting again when button is released
|
||||
});
|
||||
|
||||
window.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'ArrowLeft' || e.key === 'a') player.dx = -player.speed;
|
||||
if (e.key === 'ArrowRight' || e.key === 'd') player.dx = player.speed;
|
||||
window.addEventListener("keydown", (e) => {
|
||||
if (e.key === "ArrowLeft" || e.key === "a") player.dx = -player.speed;
|
||||
if (e.key === "ArrowRight" || e.key === "d") player.dx = player.speed;
|
||||
|
||||
// Shoot only if it's not a hold, and we can shoot
|
||||
if (e.key === ' ' && canShoot && !isGameOver) {
|
||||
if (e.key === " " && canShoot && !isGameOver) {
|
||||
shootBullet();
|
||||
canShoot = false; // Prevent shooting until the key is released
|
||||
}
|
||||
|
||||
if (e.key === 'r' && isGameOver) restartGame();
|
||||
if (e.key === "r" && isGameOver) restartGame();
|
||||
});
|
||||
|
||||
window.addEventListener('keyup', (e) => {
|
||||
window.addEventListener("keyup", (e) => {
|
||||
// Stop moving when either the arrow keys or the 'a'/'d' keys are released
|
||||
if (e.key === 'ArrowLeft' || e.key === 'ArrowRight' || e.key === 'a' || e.key === 'd') {
|
||||
if (
|
||||
e.key === "ArrowLeft" ||
|
||||
e.key === "ArrowRight" ||
|
||||
e.key === "a" ||
|
||||
e.key === "d"
|
||||
) {
|
||||
player.dx = 0;
|
||||
}
|
||||
|
||||
// Allow shooting again when the space key is released
|
||||
if (e.key === ' ') {
|
||||
if (e.key === " ") {
|
||||
canShoot = true;
|
||||
}
|
||||
});
|
||||
|
@ -124,8 +129,8 @@ function shootBullet() {
|
|||
y: player.y,
|
||||
width: 5,
|
||||
height: 10,
|
||||
color: 'yellow',
|
||||
speed: 7
|
||||
color: "yellow",
|
||||
speed: 7,
|
||||
});
|
||||
}, i * 50); // Fire bullets with 50ms delay between shots
|
||||
}
|
||||
|
@ -137,9 +142,9 @@ function shootBullet() {
|
|||
y: player.y,
|
||||
width: 5,
|
||||
height: 10,
|
||||
color: 'yellow',
|
||||
color: "yellow",
|
||||
speed: 7,
|
||||
angle: i * 10 // Spray the bullets at different angles
|
||||
angle: i * 10, // Spray the bullets at different angles
|
||||
});
|
||||
}
|
||||
} else {
|
||||
|
@ -149,15 +154,15 @@ function shootBullet() {
|
|||
y: player.y,
|
||||
width: 5,
|
||||
height: 10,
|
||||
color: 'yellow',
|
||||
speed: 7
|
||||
color: "yellow",
|
||||
speed: 7,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Generate random color
|
||||
function getRandomColor() {
|
||||
const colors = ['red', 'blue', 'green', 'orange', 'purple', 'pink'];
|
||||
const colors = ["red", "blue", "green", "orange", "purple", "pink"];
|
||||
return colors[Math.floor(Math.random() * colors.length)];
|
||||
}
|
||||
|
||||
|
@ -170,13 +175,14 @@ function createAsteroid() {
|
|||
width: size,
|
||||
height: size,
|
||||
color: getRandomColor(),
|
||||
speed: (Math.random() * 3 + 2) * asteroidSpeedMultiplier // Faster initial speed
|
||||
speed: (Math.random() * 3 + 2) * asteroidSpeedMultiplier, // Faster initial speed
|
||||
});
|
||||
}
|
||||
|
||||
// Item mechanics
|
||||
function createItem() {
|
||||
const randomType = sphereTypes[Math.floor(Math.random() * sphereTypes.length)];
|
||||
const randomType =
|
||||
sphereTypes[Math.floor(Math.random() * sphereTypes.length)];
|
||||
const size = 30;
|
||||
const x = Math.random() * canvas.width;
|
||||
items.push({
|
||||
|
@ -185,8 +191,15 @@ function createItem() {
|
|||
width: size,
|
||||
height: size,
|
||||
type: randomType,
|
||||
color: randomType === 'blue' ? 'blue' : randomType === 'yellow' ? 'yellow' : randomType === 'green' ? 'green' : 'rainbow',
|
||||
speed: 3
|
||||
color:
|
||||
randomType === "blue"
|
||||
? "blue"
|
||||
: randomType === "yellow"
|
||||
? "yellow"
|
||||
: randomType === "green"
|
||||
? "green"
|
||||
: "rainbow",
|
||||
speed: 3,
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -194,7 +207,8 @@ function createItem() {
|
|||
function updatePlayer() {
|
||||
player.x += player.dx;
|
||||
if (player.x < 0) player.x = 0;
|
||||
if (player.x + player.width > canvas.width) player.x = canvas.width - player.width;
|
||||
if (player.x + player.width > canvas.width)
|
||||
player.x = canvas.width - player.width;
|
||||
}
|
||||
|
||||
function updateBullets() {
|
||||
|
@ -230,15 +244,15 @@ function updateItems() {
|
|||
|
||||
function applyItemEffect(type) {
|
||||
let points = Math.floor(Math.random() * 5) + 1; // Random points between 1 and 5
|
||||
if (type === 'blue') {
|
||||
if (type === "blue") {
|
||||
rapidFireActive = true;
|
||||
setTimeout(() => rapidFireActive = false, 15000); // 15 seconds of rapid fire
|
||||
} else if (type === 'yellow') {
|
||||
setTimeout(() => (rapidFireActive = false), 15000); // 15 seconds of rapid fire
|
||||
} else if (type === "yellow") {
|
||||
shotgunActive = true;
|
||||
setTimeout(() => shotgunActive = false, 30000); // 30 seconds of shotgun
|
||||
} else if (type === 'green') {
|
||||
setTimeout(() => (shotgunActive = false), 30000); // 30 seconds of shotgun
|
||||
} else if (type === "green") {
|
||||
ammo = 100; // Refill ammo
|
||||
} else if (type === 'rainbow') {
|
||||
} else if (type === "rainbow") {
|
||||
rapidFireActive = true;
|
||||
shotgunActive = true;
|
||||
setTimeout(() => {
|
||||
|
@ -282,7 +296,7 @@ function checkCollisions() {
|
|||
|
||||
// Explosion effect
|
||||
function createExplosion(x, y) {
|
||||
ctx.fillStyle = 'yellow';
|
||||
ctx.fillStyle = "yellow";
|
||||
ctx.beginPath();
|
||||
ctx.arc(x, y, 20, 0, Math.PI * 2);
|
||||
ctx.fill();
|
||||
|
@ -313,33 +327,47 @@ function drawItems() {
|
|||
items.forEach((item) => {
|
||||
ctx.fillStyle = item.color;
|
||||
ctx.beginPath();
|
||||
ctx.arc(item.x + item.width / 2, item.y + item.height / 2, item.width / 2, 0, Math.PI * 2);
|
||||
ctx.arc(
|
||||
item.x + item.width / 2,
|
||||
item.y + item.height / 2,
|
||||
item.width / 2,
|
||||
0,
|
||||
Math.PI * 2
|
||||
);
|
||||
ctx.fill();
|
||||
});
|
||||
}
|
||||
|
||||
function drawScore() {
|
||||
ctx.fillStyle = 'white';
|
||||
ctx.font = '24px Arial';
|
||||
ctx.fillStyle = "white";
|
||||
ctx.font = "24px Arial";
|
||||
ctx.fillText(`Score: ${score}`, 20, 40); // Score at top-left corner
|
||||
}
|
||||
|
||||
function drawAmmo() {
|
||||
ctx.fillStyle = 'white';
|
||||
ctx.font = '24px Arial';
|
||||
ctx.fillStyle = "white";
|
||||
ctx.font = "24px Arial";
|
||||
ctx.fillText(`Ammo: ${ammo}`, 20, 70); // Ammo at top-left corner
|
||||
}
|
||||
|
||||
function drawGameOver() {
|
||||
if (isGameOver) {
|
||||
ctx.fillStyle = 'white';
|
||||
ctx.font = '40px Arial';
|
||||
ctx.textAlign = 'center';
|
||||
ctx.fillText('Game Over!', canvas.width / 2, canvas.height / 2 - 40);
|
||||
ctx.font = '24px Arial';
|
||||
ctx.fillStyle = "white";
|
||||
ctx.font = "40px Arial";
|
||||
ctx.textAlign = "center";
|
||||
ctx.fillText("Game Over!", canvas.width / 2, canvas.height / 2 - 40);
|
||||
ctx.font = "24px Arial";
|
||||
ctx.fillText(`Total Score: ${score}`, canvas.width / 2, canvas.height / 2);
|
||||
ctx.fillText(`Bullets Fired: ${totalBulletsFired}`, canvas.width / 2, canvas.height / 2 + 40);
|
||||
ctx.fillText('Press "R" to Restart', canvas.width / 2, canvas.height / 2 + 80);
|
||||
ctx.fillText(
|
||||
`Bullets Fired: ${totalBulletsFired}`,
|
||||
canvas.width / 2,
|
||||
canvas.height / 2 + 40
|
||||
);
|
||||
ctx.fillText(
|
||||
'Press "R" to Restart',
|
||||
canvas.width / 2,
|
||||
canvas.height / 2 + 80
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,43 +1,43 @@
|
|||
body {
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
margin: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
canvas {
|
||||
display: block;
|
||||
background: black;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
background: black;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.controls {
|
||||
display: none;
|
||||
position: absolute;
|
||||
bottom: 20px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 80%;
|
||||
display: none;
|
||||
position: absolute;
|
||||
bottom: 20px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
.control-btn {
|
||||
display: none;
|
||||
padding: 10px;
|
||||
font-size: 18px;
|
||||
background-color: rgba(0, 0, 0, 0.6);
|
||||
color: white;
|
||||
border: 1px solid #fff;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
flex-grow: 1;
|
||||
margin: 0 5px;
|
||||
display: none;
|
||||
padding: 10px;
|
||||
font-size: 18px;
|
||||
background-color: rgba(0, 0, 0, 0.6);
|
||||
color: white;
|
||||
border: 1px solid #fff;
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
flex-grow: 1;
|
||||
margin: 0 5px;
|
||||
}
|
||||
|
||||
@media(max-width: 600px) {
|
||||
.control-btn {
|
||||
display: block;
|
||||
font-size: 16px;
|
||||
padding: 12px;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
.control-btn {
|
||||
display: block;
|
||||
font-size: 16px;
|
||||
padding: 12px;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,74 +1,76 @@
|
|||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body,
|
||||
html {
|
||||
height: 100%;
|
||||
font-family: Arial, sans-serif;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: #000;
|
||||
color: white;
|
||||
overflow: hidden;
|
||||
height: 100%;
|
||||
font-family: Arial, sans-serif;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: #000;
|
||||
color: white;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.landing-page {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.game-background {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.7); /* Dark overlay */
|
||||
backdrop-filter: blur(8px); /* Apply blur effect to the background */
|
||||
z-index: -1; /* Ensures it's in the background */
|
||||
pointer-events: none; /* Prevent interaction with the blurred background */
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.7); /* Dark overlay */
|
||||
backdrop-filter: blur(8px); /* Apply blur effect to the background */
|
||||
z-index: -1; /* Ensures it's in the background */
|
||||
pointer-events: none; /* Prevent interaction with the blurred background */
|
||||
}
|
||||
|
||||
.content {
|
||||
text-align: center;
|
||||
z-index: 1; /* Ensure content appears above the game background */
|
||||
padding: 20px;
|
||||
max-width: 600px; /* Limit the width of the content */
|
||||
position: relative;
|
||||
color: white;
|
||||
backdrop-filter: blur(8px); /* Ensure content has some blur as well for contrast */
|
||||
text-align: center;
|
||||
z-index: 1; /* Ensure content appears above the game background */
|
||||
padding: 20px;
|
||||
max-width: 600px; /* Limit the width of the content */
|
||||
position: relative;
|
||||
color: white;
|
||||
backdrop-filter: blur(
|
||||
8px
|
||||
); /* Ensure content has some blur as well for contrast */
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 20px;
|
||||
font-size: 2rem;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 1.2rem;
|
||||
margin-bottom: 30px;
|
||||
font-size: 1.2rem;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 12px 24px;
|
||||
background-color: #ffcc00;
|
||||
color: black;
|
||||
border: none;
|
||||
font-size: 18px;
|
||||
cursor: pointer;
|
||||
border-radius: 5px;
|
||||
text-transform: uppercase;
|
||||
transition: background-color 0.3s ease;
|
||||
padding: 12px 24px;
|
||||
background-color: #ffcc00;
|
||||
color: black;
|
||||
border: none;
|
||||
font-size: 18px;
|
||||
cursor: pointer;
|
||||
border-radius: 5px;
|
||||
text-transform: uppercase;
|
||||
transition: background-color 0.3s ease;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #ff9900;
|
||||
background-color: #ff9900;
|
||||
}
|
||||
|
|
|
@ -1,78 +1,90 @@
|
|||
import { useEffect, useRef, useState } from "react";
|
||||
|
||||
export default function EndlessRunner() {
|
||||
const canvasRef = useRef(null);
|
||||
const [running, setRunning] = useState(true);
|
||||
const player = { x: 50, y: 150, width: 20, height: 20, dy: 0 };
|
||||
const gravity = 0.5;
|
||||
let obstacles = [];
|
||||
let score = 0;
|
||||
const canvasRef = useRef(null);
|
||||
const [running, setRunning] = useState(true);
|
||||
const player = { x: 50, y: 150, width: 20, height: 20, dy: 0 };
|
||||
const gravity = 0.5;
|
||||
let obstacles = [];
|
||||
let score = 0;
|
||||
|
||||
useEffect(() => {
|
||||
const canvas = canvasRef.current;
|
||||
const ctx = canvas.getContext("2d");
|
||||
canvas.width = window.innerWidth;
|
||||
canvas.height = 300;
|
||||
useEffect(() => {
|
||||
const canvas = canvasRef.current;
|
||||
const ctx = canvas.getContext("2d");
|
||||
canvas.width = window.innerWidth;
|
||||
canvas.height = 300;
|
||||
|
||||
function update() {
|
||||
if (!running) return;
|
||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||
function update() {
|
||||
if (!running) return;
|
||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||
|
||||
// Player physics
|
||||
player.dy += gravity;
|
||||
player.y += player.dy;
|
||||
if (player.y > 150) {
|
||||
player.y = 150;
|
||||
player.dy = 0;
|
||||
}
|
||||
// Player physics
|
||||
player.dy += gravity;
|
||||
player.y += player.dy;
|
||||
if (player.y > 150) {
|
||||
player.y = 150;
|
||||
player.dy = 0;
|
||||
}
|
||||
|
||||
// Draw player
|
||||
ctx.fillStyle = "blue";
|
||||
ctx.fillRect(player.x, player.y, player.width, player.height);
|
||||
// Draw player
|
||||
ctx.fillStyle = "blue";
|
||||
ctx.fillRect(player.x, player.y, player.width, player.height);
|
||||
|
||||
// Obstacles
|
||||
if (Math.random() < 0.02) {
|
||||
obstacles.push({ x: canvas.width, y: 150, width: 20, height: 20 });
|
||||
}
|
||||
obstacles = obstacles.map(obstacle => ({ ...obstacle, x: obstacle.x - 5 }));
|
||||
obstacles = obstacles.filter(obstacle => obstacle.x + obstacle.width > 0);
|
||||
// Obstacles
|
||||
if (Math.random() < 0.02) {
|
||||
obstacles.push({ x: canvas.width, y: 150, width: 20, height: 20 });
|
||||
}
|
||||
obstacles = obstacles.map((obstacle) => ({
|
||||
...obstacle,
|
||||
x: obstacle.x - 5,
|
||||
}));
|
||||
obstacles = obstacles.filter(
|
||||
(obstacle) => obstacle.x + obstacle.width > 0
|
||||
);
|
||||
|
||||
obstacles.forEach(obstacle => {
|
||||
ctx.fillStyle = "red";
|
||||
ctx.fillRect(obstacle.x, obstacle.y, obstacle.width, obstacle.height);
|
||||
obstacles.forEach((obstacle) => {
|
||||
ctx.fillStyle = "red";
|
||||
ctx.fillRect(obstacle.x, obstacle.y, obstacle.width, obstacle.height);
|
||||
|
||||
// Collision detection
|
||||
if (
|
||||
player.x < obstacle.x + obstacle.width &&
|
||||
player.x + player.width > obstacle.x &&
|
||||
player.y < obstacle.y + obstacle.height &&
|
||||
player.y + player.height > obstacle.y
|
||||
) {
|
||||
setRunning(false);
|
||||
}
|
||||
});
|
||||
|
||||
// Score
|
||||
score++;
|
||||
ctx.fillStyle = "black";
|
||||
ctx.fillText("Score: " + score, 10, 20);
|
||||
|
||||
requestAnimationFrame(update);
|
||||
// Collision detection
|
||||
if (
|
||||
player.x < obstacle.x + obstacle.width &&
|
||||
player.x + player.width > obstacle.x &&
|
||||
player.y < obstacle.y + obstacle.height &&
|
||||
player.y + player.height > obstacle.y
|
||||
) {
|
||||
setRunning(false);
|
||||
}
|
||||
});
|
||||
|
||||
update();
|
||||
}, [running]);
|
||||
// Score
|
||||
score++;
|
||||
ctx.fillStyle = "black";
|
||||
ctx.fillText("Score: " + score, 10, 20);
|
||||
|
||||
function jump() {
|
||||
if (player.y >= 150) {
|
||||
player.dy = -10;
|
||||
}
|
||||
requestAnimationFrame(update);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex flex-col items-center">
|
||||
<canvas ref={canvasRef} className="border" onClick={jump}></canvas>
|
||||
{!running && <button onClick={() => window.location.reload()} className="mt-4 bg-blue-500 text-white px-4 py-2 rounded">Restart</button>}
|
||||
</div>
|
||||
);
|
||||
update();
|
||||
}, [running]);
|
||||
|
||||
function jump() {
|
||||
if (player.y >= 150) {
|
||||
player.dy = -10;
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex flex-col items-center">
|
||||
<canvas ref={canvasRef} className="border" onClick={jump}></canvas>
|
||||
{!running && (
|
||||
<button
|
||||
onClick={() => window.location.reload()}
|
||||
className="mt-4 bg-blue-500 text-white px-4 py-2 rounded"
|
||||
>
|
||||
Restart
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
126
secret/game.js
126
secret/game.js
|
@ -1,7 +1,7 @@
|
|||
"use strict";
|
||||
// Canvas setup
|
||||
const canvas = document.getElementById('gameCanvas');
|
||||
const ctx = canvas.getContext('2d');
|
||||
const canvas = document.getElementById("gameCanvas");
|
||||
const ctx = canvas.getContext("2d");
|
||||
canvas.width = window.innerWidth;
|
||||
canvas.height = window.innerHeight;
|
||||
|
||||
|
@ -11,9 +11,9 @@ const player = {
|
|||
y: canvas.height - 60,
|
||||
width: 40,
|
||||
height: 40,
|
||||
color: 'white',
|
||||
color: "white",
|
||||
speed: 5,
|
||||
dx: 0
|
||||
dx: 0,
|
||||
};
|
||||
|
||||
let bullets = [];
|
||||
|
@ -44,14 +44,14 @@ let greenSphereCooldown = 0;
|
|||
let rainbowSphereCooldown = 0;
|
||||
|
||||
// Sphere types
|
||||
const sphereTypes = ['blue', 'yellow', 'green', 'rainbow'];
|
||||
const sphereTypes = ["blue", "yellow", "green", "rainbow"];
|
||||
|
||||
/// Control for left button press and release
|
||||
function btnMoveLeft(isPressed) {
|
||||
if (isPressed) {
|
||||
player.dx = -player.speed; // Start moving left
|
||||
player.dx = -player.speed; // Start moving left
|
||||
} else {
|
||||
player.dx = 0; // Stop moving when button is released
|
||||
player.dx = 0; // Stop moving when button is released
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -66,37 +66,42 @@ function btnShoot() {
|
|||
// Control for right button press and release
|
||||
function btnMoveRight(isPressed) {
|
||||
if (isPressed) {
|
||||
player.dx = player.speed; // Start moving right
|
||||
player.dx = player.speed; // Start moving right
|
||||
} else {
|
||||
player.dx = 0; // Stop moving when button is released
|
||||
player.dx = 0; // Stop moving when button is released
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementById('shootBtn').addEventListener('mouseup', () => {
|
||||
document.getElementById("shootBtn").addEventListener("mouseup", () => {
|
||||
canShoot = true; // Allow shooting again when button is released
|
||||
});
|
||||
|
||||
window.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'ArrowLeft' || e.key === 'a') player.dx = -player.speed;
|
||||
if (e.key === 'ArrowRight' || e.key === 'd') player.dx = player.speed;
|
||||
window.addEventListener("keydown", (e) => {
|
||||
if (e.key === "ArrowLeft" || e.key === "a") player.dx = -player.speed;
|
||||
if (e.key === "ArrowRight" || e.key === "d") player.dx = player.speed;
|
||||
|
||||
// Shoot only if it's not a hold, and we can shoot
|
||||
if (e.key === ' ' && canShoot && !isGameOver) {
|
||||
if (e.key === " " && canShoot && !isGameOver) {
|
||||
shootBullet();
|
||||
canShoot = false; // Prevent shooting until the key is released
|
||||
}
|
||||
|
||||
if (e.key === 'r' && isGameOver) restartGame();
|
||||
if (e.key === "r" && isGameOver) restartGame();
|
||||
});
|
||||
|
||||
window.addEventListener('keyup', (e) => {
|
||||
window.addEventListener("keyup", (e) => {
|
||||
// Stop moving when either the arrow keys or the 'a'/'d' keys are released
|
||||
if (e.key === 'ArrowLeft' || e.key === 'ArrowRight' || e.key === 'a' || e.key === 'd') {
|
||||
if (
|
||||
e.key === "ArrowLeft" ||
|
||||
e.key === "ArrowRight" ||
|
||||
e.key === "a" ||
|
||||
e.key === "d"
|
||||
) {
|
||||
player.dx = 0;
|
||||
}
|
||||
|
||||
// Allow shooting again when the space key is released
|
||||
if (e.key === ' ') {
|
||||
if (e.key === " ") {
|
||||
canShoot = true;
|
||||
}
|
||||
});
|
||||
|
@ -120,8 +125,8 @@ function shootBullet() {
|
|||
y: player.y,
|
||||
width: 5,
|
||||
height: 10,
|
||||
color: 'yellow',
|
||||
speed: 7
|
||||
color: "yellow",
|
||||
speed: 7,
|
||||
});
|
||||
}, i * 50); // Fire bullets with 50ms delay between shots
|
||||
}
|
||||
|
@ -133,9 +138,9 @@ function shootBullet() {
|
|||
y: player.y,
|
||||
width: 5,
|
||||
height: 10,
|
||||
color: 'yellow',
|
||||
color: "yellow",
|
||||
speed: 7,
|
||||
angle: i * 10 // Spray the bullets at different angles
|
||||
angle: i * 10, // Spray the bullets at different angles
|
||||
});
|
||||
}
|
||||
} else {
|
||||
|
@ -145,15 +150,15 @@ function shootBullet() {
|
|||
y: player.y,
|
||||
width: 5,
|
||||
height: 10,
|
||||
color: 'yellow',
|
||||
speed: 7
|
||||
color: "yellow",
|
||||
speed: 7,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Generate random color
|
||||
function getRandomColor() {
|
||||
const colors = ['red', 'blue', 'green', 'orange', 'purple', 'pink'];
|
||||
const colors = ["red", "blue", "green", "orange", "purple", "pink"];
|
||||
return colors[Math.floor(Math.random() * colors.length)];
|
||||
}
|
||||
|
||||
|
@ -166,13 +171,14 @@ function createAsteroid() {
|
|||
width: size,
|
||||
height: size,
|
||||
color: getRandomColor(),
|
||||
speed: (Math.random() * 3 + 2) * asteroidSpeedMultiplier // Faster initial speed
|
||||
speed: (Math.random() * 3 + 2) * asteroidSpeedMultiplier, // Faster initial speed
|
||||
});
|
||||
}
|
||||
|
||||
// Item mechanics
|
||||
function createItem() {
|
||||
const randomType = sphereTypes[Math.floor(Math.random() * sphereTypes.length)];
|
||||
const randomType =
|
||||
sphereTypes[Math.floor(Math.random() * sphereTypes.length)];
|
||||
const size = 30;
|
||||
const x = Math.random() * canvas.width;
|
||||
items.push({
|
||||
|
@ -181,8 +187,15 @@ function createItem() {
|
|||
width: size,
|
||||
height: size,
|
||||
type: randomType,
|
||||
color: randomType === 'blue' ? 'blue' : randomType === 'yellow' ? 'yellow' : randomType === 'green' ? 'green' : 'rainbow',
|
||||
speed: 3
|
||||
color:
|
||||
randomType === "blue"
|
||||
? "blue"
|
||||
: randomType === "yellow"
|
||||
? "yellow"
|
||||
: randomType === "green"
|
||||
? "green"
|
||||
: "rainbow",
|
||||
speed: 3,
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -190,7 +203,8 @@ function createItem() {
|
|||
function updatePlayer() {
|
||||
player.x += player.dx;
|
||||
if (player.x < 0) player.x = 0;
|
||||
if (player.x + player.width > canvas.width) player.x = canvas.width - player.width;
|
||||
if (player.x + player.width > canvas.width)
|
||||
player.x = canvas.width - player.width;
|
||||
}
|
||||
|
||||
function updateBullets() {
|
||||
|
@ -226,15 +240,15 @@ function updateItems() {
|
|||
|
||||
function applyItemEffect(type) {
|
||||
let points = Math.floor(Math.random() * 5) + 1; // Random points between 1 and 5
|
||||
if (type === 'blue') {
|
||||
if (type === "blue") {
|
||||
rapidFireActive = true;
|
||||
setTimeout(() => rapidFireActive = false, 15000); // 15 seconds of rapid fire
|
||||
} else if (type === 'yellow') {
|
||||
setTimeout(() => (rapidFireActive = false), 15000); // 15 seconds of rapid fire
|
||||
} else if (type === "yellow") {
|
||||
shotgunActive = true;
|
||||
setTimeout(() => shotgunActive = false, 30000); // 30 seconds of shotgun
|
||||
} else if (type === 'green') {
|
||||
setTimeout(() => (shotgunActive = false), 30000); // 30 seconds of shotgun
|
||||
} else if (type === "green") {
|
||||
ammo = 100; // Refill ammo
|
||||
} else if (type === 'rainbow') {
|
||||
} else if (type === "rainbow") {
|
||||
rapidFireActive = true;
|
||||
shotgunActive = true;
|
||||
setTimeout(() => {
|
||||
|
@ -278,7 +292,7 @@ function checkCollisions() {
|
|||
|
||||
// Explosion effect
|
||||
function createExplosion(x, y) {
|
||||
ctx.fillStyle = 'yellow';
|
||||
ctx.fillStyle = "yellow";
|
||||
ctx.beginPath();
|
||||
ctx.arc(x, y, 20, 0, Math.PI * 2);
|
||||
ctx.fill();
|
||||
|
@ -309,33 +323,47 @@ function drawItems() {
|
|||
items.forEach((item) => {
|
||||
ctx.fillStyle = item.color;
|
||||
ctx.beginPath();
|
||||
ctx.arc(item.x + item.width / 2, item.y + item.height / 2, item.width / 2, 0, Math.PI * 2);
|
||||
ctx.arc(
|
||||
item.x + item.width / 2,
|
||||
item.y + item.height / 2,
|
||||
item.width / 2,
|
||||
0,
|
||||
Math.PI * 2
|
||||
);
|
||||
ctx.fill();
|
||||
});
|
||||
}
|
||||
|
||||
function drawScore() {
|
||||
ctx.fillStyle = 'white';
|
||||
ctx.font = '24px Arial';
|
||||
ctx.fillStyle = "white";
|
||||
ctx.font = "24px Arial";
|
||||
ctx.fillText(`Score: ${score}`, 20, 40); // Score at top-left corner
|
||||
}
|
||||
|
||||
function drawAmmo() {
|
||||
ctx.fillStyle = 'white';
|
||||
ctx.font = '24px Arial';
|
||||
ctx.fillStyle = "white";
|
||||
ctx.font = "24px Arial";
|
||||
ctx.fillText(`Ammo: ${ammo}`, 20, 70); // Ammo at top-left corner
|
||||
}
|
||||
|
||||
function drawGameOver() {
|
||||
if (isGameOver) {
|
||||
ctx.fillStyle = 'white';
|
||||
ctx.font = '40px Arial';
|
||||
ctx.textAlign = 'center';
|
||||
ctx.fillText('Game Over!', canvas.width / 2, canvas.height / 2 - 40);
|
||||
ctx.font = '24px Arial';
|
||||
ctx.fillStyle = "white";
|
||||
ctx.font = "40px Arial";
|
||||
ctx.textAlign = "center";
|
||||
ctx.fillText("Game Over!", canvas.width / 2, canvas.height / 2 - 40);
|
||||
ctx.font = "24px Arial";
|
||||
ctx.fillText(`Total Score: ${score}`, canvas.width / 2, canvas.height / 2);
|
||||
ctx.fillText(`Bullets Fired: ${totalBulletsFired}`, canvas.width / 2, canvas.height / 2 + 40);
|
||||
ctx.fillText('Press "R" to Restart', canvas.width / 2, canvas.height / 2 + 80);
|
||||
ctx.fillText(
|
||||
`Bullets Fired: ${totalBulletsFired}`,
|
||||
canvas.width / 2,
|
||||
canvas.height / 2 + 40
|
||||
);
|
||||
ctx.fillText(
|
||||
'Press "R" to Restart',
|
||||
canvas.width / 2,
|
||||
canvas.height / 2 + 80
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,54 +1,65 @@
|
|||
'use strict';
|
||||
"use strict";
|
||||
|
||||
const targetNum = Math.trunc(Math.random() * 20) + 1;
|
||||
let highScore = Number(localStorage.getItem('highscore')) || 0;
|
||||
let userGuess = 10; // Default guess
|
||||
let highScore = Number(localStorage.getItem("highscore")) || 0;
|
||||
let userGuess = 10; // Default guess
|
||||
let currScore = 20;
|
||||
|
||||
const screenEl = document.querySelector('.screen');
|
||||
const msgEl = document.querySelector('.message');
|
||||
const guessInput = document.querySelector('#guess');
|
||||
const scoreEl = document.querySelector('.score');
|
||||
const highScoreEl = document.querySelector('.highScore');
|
||||
const checkBtn = document.querySelector('#check');
|
||||
const restartBtn = document.querySelector('#restart');
|
||||
const incBtn = document.querySelector('#up');
|
||||
const decBtn = document.querySelector('#down');
|
||||
const screenEl = document.querySelector(".screen");
|
||||
const msgEl = document.querySelector(".message");
|
||||
const guessInput = document.querySelector("#guess");
|
||||
const scoreEl = document.querySelector(".score");
|
||||
const highScoreEl = document.querySelector(".highScore");
|
||||
const checkBtn = document.querySelector("#check");
|
||||
const restartBtn = document.querySelector("#restart");
|
||||
const incBtn = document.querySelector("#up");
|
||||
const decBtn = document.querySelector("#down");
|
||||
|
||||
const setMsg = msg => msgEl.textContent = msg;
|
||||
const setScore = score => scoreEl.textContent = `Score: ${currScore = score}`;
|
||||
const setMsg = (msg) => (msgEl.textContent = msg);
|
||||
const setScore = (score) =>
|
||||
(scoreEl.textContent = `Score: ${(currScore = score)}`);
|
||||
const setHighScore = () => {
|
||||
highScoreEl.textContent = `Highscore: ${highScore}`;
|
||||
localStorage.setItem('highscore', highScore);
|
||||
highScoreEl.textContent = `Highscore: ${highScore}`;
|
||||
localStorage.setItem("highscore", highScore);
|
||||
};
|
||||
const changeColor = color => screenEl.style.backgroundColor = color;
|
||||
const changeColor = (color) => (screenEl.style.backgroundColor = color);
|
||||
|
||||
checkBtn.addEventListener('click', () => {
|
||||
userGuess = Number(guessInput.textContent);
|
||||
if (!userGuess || userGuess < 1 || userGuess > 20) {
|
||||
setMsg("Please enter a valid number between 1 and 20.");
|
||||
} else if (userGuess === targetNum) {
|
||||
highScore = Math.max(highScore, currScore);
|
||||
setHighScore();
|
||||
setMsg(currScore !== 20 ? 'Correct Number!' : 'Are you sure you didn\'t cheat?');
|
||||
changeColor(currScore !== 20 ? '#1ba100' : '#FFC300');
|
||||
checkBtn.addEventListener("click", () => {
|
||||
userGuess = Number(guessInput.textContent);
|
||||
if (!userGuess || userGuess < 1 || userGuess > 20) {
|
||||
setMsg("Please enter a valid number between 1 and 20.");
|
||||
} else if (userGuess === targetNum) {
|
||||
highScore = Math.max(highScore, currScore);
|
||||
setHighScore();
|
||||
setMsg(
|
||||
currScore !== 20 ? "Correct Number!" : "Are you sure you didn't cheat?"
|
||||
);
|
||||
changeColor(currScore !== 20 ? "#1ba100" : "#FFC300");
|
||||
} else {
|
||||
setMsg(userGuess > targetNum ? "Too High!" : "Too Low!");
|
||||
if (currScore > 1) {
|
||||
setScore(currScore - 1);
|
||||
} else {
|
||||
setMsg(userGuess > targetNum ? 'Too High!' : 'Too Low!');
|
||||
if (currScore > 1) {
|
||||
setScore(currScore - 1);
|
||||
} else {
|
||||
setScore(1);
|
||||
setMsg("You lost the game!");
|
||||
changeColor('#a10000');
|
||||
}
|
||||
setScore(1);
|
||||
setMsg("You lost the game!");
|
||||
changeColor("#a10000");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
restartBtn.addEventListener('click', () => location.reload());
|
||||
incBtn.addEventListener('click', () => guessInput.textContent = Math.min(Number(guessInput.textContent) + 1, 20));
|
||||
decBtn.addEventListener('click', () => guessInput.textContent = Math.max(Number(guessInput.textContent) - 1, 1));
|
||||
restartBtn.addEventListener("click", () => location.reload());
|
||||
incBtn.addEventListener(
|
||||
"click",
|
||||
() =>
|
||||
(guessInput.textContent = Math.min(Number(guessInput.textContent) + 1, 20))
|
||||
);
|
||||
decBtn.addEventListener(
|
||||
"click",
|
||||
() =>
|
||||
(guessInput.textContent = Math.max(Number(guessInput.textContent) - 1, 1))
|
||||
);
|
||||
|
||||
guessInput.textContent = userGuess;
|
||||
setMsg('Guess a number');
|
||||
setMsg("Guess a number");
|
||||
setScore(currScore);
|
||||
setHighScore();
|
||||
|
|
|
@ -1,189 +1,189 @@
|
|||
/* Base Reset */
|
||||
body,
|
||||
html {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: monospace;
|
||||
background-color: #3a2d56;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: monospace;
|
||||
background-color: #3a2d56;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
/* GameBoy Layout */
|
||||
.gameboy {
|
||||
background-color: #5f4c82; /* Game Boy Color purple shell */
|
||||
width: 441px;
|
||||
height: 735px;
|
||||
border-radius: 20px;
|
||||
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.6);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 10px;
|
||||
position: relative;
|
||||
background-color: #5f4c82; /* Game Boy Color purple shell */
|
||||
width: 441px;
|
||||
height: 735px;
|
||||
border-radius: 20px;
|
||||
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.6);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 10px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
@media(max-width: 768px) {
|
||||
.gameboy {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
border-radius: 0;
|
||||
}
|
||||
@media (max-width: 768px) {
|
||||
.gameboy {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Screen */
|
||||
.screen {
|
||||
background-color: #306230; /* Game Boy green screen */
|
||||
border: 4px solid #0f380f;
|
||||
width: 90%;
|
||||
height: 55%;
|
||||
margin-top: 20px;
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
box-shadow: inset 0 4px 8px rgba(0, 0, 0, 0.5);
|
||||
overflow: hidden;
|
||||
background-color: #306230; /* Game Boy green screen */
|
||||
border: 4px solid #0f380f;
|
||||
width: 90%;
|
||||
height: 55%;
|
||||
margin-top: 20px;
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
box-shadow: inset 0 4px 8px rgba(0, 0, 0, 0.5);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.game {
|
||||
text-align: center;
|
||||
width: 90%;
|
||||
text-align: center;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
/* Titles */
|
||||
h1 {
|
||||
font-size: 2rem; /* Increased font size */
|
||||
margin-bottom: 10px;
|
||||
text-transform: uppercase;
|
||||
font-size: 2rem; /* Increased font size */
|
||||
margin-bottom: 10px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
/* Guess Display */
|
||||
.guess-display {
|
||||
background-color: #9bbc0f;
|
||||
color: #0f380f;
|
||||
border: 2px solid #0f380f;
|
||||
font-size: 2rem; /* Increased font size */
|
||||
width: 80px; /* Increased width */
|
||||
text-align: center;
|
||||
margin: 10px auto;
|
||||
padding: 10px; /* Increased padding */
|
||||
border-radius: 4px;
|
||||
background-color: #9bbc0f;
|
||||
color: #0f380f;
|
||||
border: 2px solid #0f380f;
|
||||
font-size: 2rem; /* Increased font size */
|
||||
width: 80px; /* Increased width */
|
||||
text-align: center;
|
||||
margin: 10px auto;
|
||||
padding: 10px; /* Increased padding */
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
/* Messages */
|
||||
.message,
|
||||
.score,
|
||||
.highScore {
|
||||
font-size: 1.4rem; /* Increased font size */
|
||||
margin: 5px 0;
|
||||
font-size: 1.4rem; /* Increased font size */
|
||||
margin: 5px 0;
|
||||
}
|
||||
|
||||
.description,
|
||||
.description p {
|
||||
font-size: 1.2rem;
|
||||
margin: 0 auto;
|
||||
padding: 0 auto;
|
||||
font-size: 1.2rem;
|
||||
margin: 0 auto;
|
||||
padding: 0 auto;
|
||||
}
|
||||
|
||||
/* Controls Section */
|
||||
.controls {
|
||||
margin-top: 20px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 80%;
|
||||
align-items: center;
|
||||
margin-top: 20px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 80%;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
/* D-Pad */
|
||||
.dpad {
|
||||
position: relative;
|
||||
width: 120px; /* Increased size */
|
||||
height: 120px; /* Increased size */
|
||||
position: relative;
|
||||
width: 120px; /* Increased size */
|
||||
height: 120px; /* Increased size */
|
||||
}
|
||||
|
||||
/* Base Styling for D-Pad Buttons */
|
||||
.dpad-btn {
|
||||
background-color: #0f380f;
|
||||
color: #9bbc0f;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
position: absolute;
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
font-size: 1.5rem; /* Increased size */
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
z-index: 1;
|
||||
background-color: #0f380f;
|
||||
color: #9bbc0f;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
position: absolute;
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
font-size: 1.5rem; /* Increased size */
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.dpad-btn.up {
|
||||
top: 0;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
top: 0;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
|
||||
.dpad-btn.down {
|
||||
bottom: 0;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
bottom: 0;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
|
||||
.dpad-btn.left {
|
||||
top: 50%;
|
||||
left: 0;
|
||||
transform: translateY(-50%);
|
||||
top: 50%;
|
||||
left: 0;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.dpad-btn.right {
|
||||
top: 50%;
|
||||
right: 0;
|
||||
transform: translateY(-50%);
|
||||
top: 50%;
|
||||
right: 0;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
/* D-Pad Center to Connect Buttons */
|
||||
.dpad-center {
|
||||
background-color: #0f380f;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 2px solid #9cbc0f00;
|
||||
z-index: 0;
|
||||
border-radius: 5px;
|
||||
background-color: #0f380f;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 2px solid #9cbc0f00;
|
||||
z-index: 0;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
/* A and B Buttons */
|
||||
.action-buttons {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
height: 140px; /* Increased height */
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
height: 140px; /* Increased height */
|
||||
}
|
||||
|
||||
.btn {
|
||||
background-color: #0f380f;
|
||||
color: #9bbc0f;
|
||||
border: 2px solid #9bbc0f;
|
||||
border-radius: 50%;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
font-size: 1.8rem; /* Increased font size */
|
||||
cursor: pointer;
|
||||
transition: transform 0.1s, background-color 0.2s;
|
||||
background-color: #0f380f;
|
||||
color: #9bbc0f;
|
||||
border: 2px solid #9bbc0f;
|
||||
border-radius: 50%;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
font-size: 1.8rem; /* Increased font size */
|
||||
cursor: pointer;
|
||||
transition: transform 0.1s, background-color 0.2s;
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
background-color: #9bbc0f;
|
||||
color: #0f380f;
|
||||
background-color: #9bbc0f;
|
||||
color: #0f380f;
|
||||
}
|
||||
|
||||
.btn:active {
|
||||
transform: scale(0.9);
|
||||
transform: scale(0.9);
|
||||
}
|
||||
|
|
|
@ -1,62 +1,148 @@
|
|||
'use strict';
|
||||
const left = document.querySelector('#left');
|
||||
const right = document.querySelector('#right');
|
||||
const gameboy = document.querySelector('.gameboy');
|
||||
"use strict";
|
||||
const left = document.querySelector("#left");
|
||||
const right = document.querySelector("#right");
|
||||
const gameboy = document.querySelector(".gameboy");
|
||||
const html = document.documentElement;
|
||||
const body = document.body;
|
||||
const screen = document.querySelector('.screen');
|
||||
const dpadButtons = document.querySelectorAll('.dpad-btn');
|
||||
const dpadCenter = document.querySelector('.dpad-center'); // Darker variant
|
||||
const actionButtons = document.querySelectorAll('.btn');
|
||||
const screen = document.querySelector(".screen");
|
||||
const dpadButtons = document.querySelectorAll(".dpad-btn");
|
||||
const dpadCenter = document.querySelector(".dpad-center"); // Darker variant
|
||||
const actionButtons = document.querySelectorAll(".btn");
|
||||
|
||||
const colors = [
|
||||
{ gameboyColor: '#B39DDB', htmlColor: '#D1C4E9', screenColor: '#E1BEE7', buttonColor: '#673AB7', buttonTextColor: '#FFFFFF', dpadCenterColor: '#5E35B1' },
|
||||
{ gameboyColor: '#FFC107', htmlColor: '#FFF9C4', screenColor: '#FFEB3B', buttonColor: '#FF9800', buttonTextColor: '#000000', dpadCenterColor: '#EF6C00' },
|
||||
{ gameboyColor: '#8BC34A', htmlColor: '#C5E1A5', screenColor: '#A5D6A7', buttonColor: '#FF5722', buttonTextColor: '#FFFFFF', dpadCenterColor: '#E64A19' },
|
||||
{ gameboyColor: '#F44336', htmlColor: '#FFCDD2', screenColor: '#EF9A9A', buttonColor: '#E91E63', buttonTextColor: '#FFFFFF', dpadCenterColor: '#C2185B' },
|
||||
{ gameboyColor: '#03A9F4', htmlColor: '#BBDEFB', screenColor: '#90CAF9', buttonColor: '#FFEB3B', buttonTextColor: '#000000', dpadCenterColor: '#0277BD' },
|
||||
{ gameboyColor: '#FF7043', htmlColor: '#FFCCBC', screenColor: '#FFAB91', buttonColor: '#FF5722', buttonTextColor: '#FFFFFF', dpadCenterColor: '#D84315' },
|
||||
{ gameboyColor: '#9C27B0', htmlColor: '#E1BEE7', screenColor: '#D1C4E9', buttonColor: '#7B1FA2', buttonTextColor: '#FFFFFF', dpadCenterColor: '#6A1B9A' },
|
||||
{ gameboyColor: '#FFD700', htmlColor: '#FFF9C4', screenColor: '#FFF59D', buttonColor: '#FF9800', buttonTextColor: '#FFFFFF', dpadCenterColor: '#F57F17' },
|
||||
{ gameboyColor: '#009688', htmlColor: '#B2DFDB', screenColor: '#80CBC4', buttonColor: '#4CAF50', buttonTextColor: '#FFFFFF', dpadCenterColor: '#00796B' },
|
||||
{ gameboyColor: '#795548', htmlColor: '#D7CCC8', screenColor: '#A1887F', buttonColor: '#9E9E9E', buttonTextColor: '#000000', dpadCenterColor: '#5D4037' },
|
||||
{ gameboyColor: '#FF5733', htmlColor: '#FFCCCB', screenColor: '#FFABAB', buttonColor: '#C70039', buttonTextColor: '#FFFFFF', dpadCenterColor: '#B71C1C' },
|
||||
{ gameboyColor: '#00BCD4', htmlColor: '#B2EBF2', screenColor: '#80DEEA', buttonColor: '#00ACC1', buttonTextColor: '#FFFFFF', dpadCenterColor: '#00838F' }
|
||||
{
|
||||
gameboyColor: "#B39DDB",
|
||||
htmlColor: "#D1C4E9",
|
||||
screenColor: "#E1BEE7",
|
||||
buttonColor: "#673AB7",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#5E35B1",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#FFC107",
|
||||
htmlColor: "#FFF9C4",
|
||||
screenColor: "#FFEB3B",
|
||||
buttonColor: "#FF9800",
|
||||
buttonTextColor: "#000000",
|
||||
dpadCenterColor: "#EF6C00",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#8BC34A",
|
||||
htmlColor: "#C5E1A5",
|
||||
screenColor: "#A5D6A7",
|
||||
buttonColor: "#FF5722",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#E64A19",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#F44336",
|
||||
htmlColor: "#FFCDD2",
|
||||
screenColor: "#EF9A9A",
|
||||
buttonColor: "#E91E63",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#C2185B",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#03A9F4",
|
||||
htmlColor: "#BBDEFB",
|
||||
screenColor: "#90CAF9",
|
||||
buttonColor: "#FFEB3B",
|
||||
buttonTextColor: "#000000",
|
||||
dpadCenterColor: "#0277BD",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#FF7043",
|
||||
htmlColor: "#FFCCBC",
|
||||
screenColor: "#FFAB91",
|
||||
buttonColor: "#FF5722",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#D84315",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#9C27B0",
|
||||
htmlColor: "#E1BEE7",
|
||||
screenColor: "#D1C4E9",
|
||||
buttonColor: "#7B1FA2",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#6A1B9A",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#FFD700",
|
||||
htmlColor: "#FFF9C4",
|
||||
screenColor: "#FFF59D",
|
||||
buttonColor: "#FF9800",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#F57F17",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#009688",
|
||||
htmlColor: "#B2DFDB",
|
||||
screenColor: "#80CBC4",
|
||||
buttonColor: "#4CAF50",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#00796B",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#795548",
|
||||
htmlColor: "#D7CCC8",
|
||||
screenColor: "#A1887F",
|
||||
buttonColor: "#9E9E9E",
|
||||
buttonTextColor: "#000000",
|
||||
dpadCenterColor: "#5D4037",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#FF5733",
|
||||
htmlColor: "#FFCCCB",
|
||||
screenColor: "#FFABAB",
|
||||
buttonColor: "#C70039",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#B71C1C",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#00BCD4",
|
||||
htmlColor: "#B2EBF2",
|
||||
screenColor: "#80DEEA",
|
||||
buttonColor: "#00ACC1",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#00838F",
|
||||
},
|
||||
];
|
||||
|
||||
let currentColorIndex = localStorage.getItem('gameboyColorIndex') ? parseInt(localStorage.getItem('gameboyColorIndex')) : 0;
|
||||
let currentColorIndex = localStorage.getItem("gameboyColorIndex")
|
||||
? parseInt(localStorage.getItem("gameboyColorIndex"))
|
||||
: 0;
|
||||
|
||||
function updateGameBoyColor() {
|
||||
gameboy.style.backgroundColor = colors[currentColorIndex].gameboyColor;
|
||||
html.style.backgroundColor = colors[currentColorIndex].htmlColor;
|
||||
body.style.backgroundColor = colors[currentColorIndex].htmlColor;
|
||||
screen.style.backgroundColor = colors[currentColorIndex].screenColor;
|
||||
gameboy.style.backgroundColor = colors[currentColorIndex].gameboyColor;
|
||||
html.style.backgroundColor = colors[currentColorIndex].htmlColor;
|
||||
body.style.backgroundColor = colors[currentColorIndex].htmlColor;
|
||||
screen.style.backgroundColor = colors[currentColorIndex].screenColor;
|
||||
|
||||
dpadButtons.forEach(button => {
|
||||
button.style.backgroundColor = colors[currentColorIndex].buttonColor;
|
||||
button.style.color = colors[currentColorIndex].buttonTextColor;
|
||||
});
|
||||
dpadButtons.forEach((button) => {
|
||||
button.style.backgroundColor = colors[currentColorIndex].buttonColor;
|
||||
button.style.color = colors[currentColorIndex].buttonTextColor;
|
||||
});
|
||||
|
||||
// Using darker dpad center color
|
||||
dpadCenter.style.backgroundColor = colors[currentColorIndex].dpadCenterColor;
|
||||
dpadCenter.style.color = colors[currentColorIndex].buttonTextColor;
|
||||
// Using darker dpad center color
|
||||
dpadCenter.style.backgroundColor = colors[currentColorIndex].dpadCenterColor;
|
||||
dpadCenter.style.color = colors[currentColorIndex].buttonTextColor;
|
||||
|
||||
actionButtons.forEach(button => {
|
||||
button.style.backgroundColor = colors[currentColorIndex].buttonColor;
|
||||
button.style.color = colors[currentColorIndex].buttonTextColor;
|
||||
});
|
||||
actionButtons.forEach((button) => {
|
||||
button.style.backgroundColor = colors[currentColorIndex].buttonColor;
|
||||
button.style.color = colors[currentColorIndex].buttonTextColor;
|
||||
});
|
||||
}
|
||||
|
||||
left.addEventListener('click', () => {
|
||||
currentColorIndex = (currentColorIndex - 1 + colors.length) % colors.length;
|
||||
localStorage.setItem('gameboyColorIndex', currentColorIndex);
|
||||
updateGameBoyColor();
|
||||
left.addEventListener("click", () => {
|
||||
currentColorIndex = (currentColorIndex - 1 + colors.length) % colors.length;
|
||||
localStorage.setItem("gameboyColorIndex", currentColorIndex);
|
||||
updateGameBoyColor();
|
||||
});
|
||||
|
||||
right.addEventListener('click', () => {
|
||||
currentColorIndex = (currentColorIndex + 1) % colors.length;
|
||||
localStorage.setItem('gameboyColorIndex', currentColorIndex);
|
||||
updateGameBoyColor();
|
||||
right.addEventListener("click", () => {
|
||||
currentColorIndex = (currentColorIndex + 1) % colors.length;
|
||||
localStorage.setItem("gameboyColorIndex", currentColorIndex);
|
||||
updateGameBoyColor();
|
||||
});
|
||||
|
||||
updateGameBoyColor();
|
||||
|
|
|
@ -1,173 +1,192 @@
|
|||
document.getElementById('startGame').addEventListener('click', function () {
|
||||
const gridSize = parseInt(document.getElementById('gridSize').value);
|
||||
const bombs = parseInt(document.getElementById('bombs').value);
|
||||
document.getElementById("startGame").addEventListener("click", function () {
|
||||
const gridSize = parseInt(document.getElementById("gridSize").value);
|
||||
const bombs = parseInt(document.getElementById("bombs").value);
|
||||
|
||||
document.getElementById('settings').style.display = 'none';
|
||||
document.getElementById('game').style.display = 'block';
|
||||
document.getElementById("settings").style.display = "none";
|
||||
document.getElementById("game").style.display = "block";
|
||||
|
||||
renderGame(gridSize, bombs);
|
||||
renderGame(gridSize, bombs);
|
||||
});
|
||||
|
||||
const canvas = document.getElementById('game');
|
||||
const ctx = canvas.getContext('2d');
|
||||
const canvas = document.getElementById("game");
|
||||
const ctx = canvas.getContext("2d");
|
||||
|
||||
class Minesweeper {
|
||||
constructor(width, height, bombs) {
|
||||
this.size = 25;
|
||||
this.field = new Array(width);
|
||||
this.bombs = new Array(width);
|
||||
for (let x = 0; x < this.field.length; x++) {
|
||||
this.field[x] = new Array(height);
|
||||
this.bombs[x] = new Array(height);
|
||||
for (let y = 0; y < this.field[x].length; y++) {
|
||||
this.field[x][y] = 1;
|
||||
this.bombs[x][y] = false;
|
||||
}
|
||||
}
|
||||
|
||||
this.bombAmount = bombs > width * height / 2 ? width * height / 2 : bombs;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this.firstClick = false;
|
||||
this.drawField();
|
||||
constructor(width, height, bombs) {
|
||||
this.size = 25;
|
||||
this.field = new Array(width);
|
||||
this.bombs = new Array(width);
|
||||
for (let x = 0; x < this.field.length; x++) {
|
||||
this.field[x] = new Array(height);
|
||||
this.bombs[x] = new Array(height);
|
||||
for (let y = 0; y < this.field[x].length; y++) {
|
||||
this.field[x][y] = 1;
|
||||
this.bombs[x][y] = false;
|
||||
}
|
||||
}
|
||||
|
||||
generateBombs() {
|
||||
for (let i = 0; i < this.bombAmount; i++) {
|
||||
let x = Math.floor(Math.random() * this.width);
|
||||
let y = Math.floor(Math.random() * this.height);
|
||||
(this.bombs[x][y] || this.field[x][y] == 0) ? i-- : this.bombs[x][y] = true;
|
||||
}
|
||||
this.firstClick = true;
|
||||
}
|
||||
this.bombAmount =
|
||||
bombs > (width * height) / 2 ? (width * height) / 2 : bombs;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this.firstClick = false;
|
||||
this.drawField();
|
||||
}
|
||||
|
||||
getNearbyBombs(x, y) {
|
||||
let counter = 0;
|
||||
for (let newX = x - 1; newX <= x + 1; newX++) {
|
||||
for (let newY = y - 1; newY <= y + 1; newY++) {
|
||||
if (newX < this.field.length && newX >= 0 && newY < this.field[0].length && newY >= 0) {
|
||||
this.bombs[newX][newY] ? counter++ : {};
|
||||
}
|
||||
}
|
||||
}
|
||||
return counter;
|
||||
generateBombs() {
|
||||
for (let i = 0; i < this.bombAmount; i++) {
|
||||
let x = Math.floor(Math.random() * this.width);
|
||||
let y = Math.floor(Math.random() * this.height);
|
||||
this.bombs[x][y] || this.field[x][y] == 0
|
||||
? i--
|
||||
: (this.bombs[x][y] = true);
|
||||
}
|
||||
this.firstClick = true;
|
||||
}
|
||||
|
||||
checkWin() {
|
||||
for (let x = 0; x < this.field.length; x++) {
|
||||
for (let y = 0; y < this.field[x].length; y++) {
|
||||
if (this.field[x][y] != 0 && !this.bombs[x][y]) {
|
||||
return;
|
||||
} else if (this.field[x][y] == 0 && this.bombs[x][y]) {
|
||||
alert(`[ERROR]: Square (${x}|${y}) should not be a bomb!`);
|
||||
this.bombs[x][y] = false;
|
||||
}
|
||||
}
|
||||
getNearbyBombs(x, y) {
|
||||
let counter = 0;
|
||||
for (let newX = x - 1; newX <= x + 1; newX++) {
|
||||
for (let newY = y - 1; newY <= y + 1; newY++) {
|
||||
if (
|
||||
newX < this.field.length &&
|
||||
newX >= 0 &&
|
||||
newY < this.field[0].length &&
|
||||
newY >= 0
|
||||
) {
|
||||
this.bombs[newX][newY] ? counter++ : {};
|
||||
}
|
||||
this.drawField();
|
||||
alert('You won!');
|
||||
}
|
||||
}
|
||||
return counter;
|
||||
}
|
||||
|
||||
checkWin() {
|
||||
for (let x = 0; x < this.field.length; x++) {
|
||||
for (let y = 0; y < this.field[x].length; y++) {
|
||||
if (this.field[x][y] != 0 && !this.bombs[x][y]) {
|
||||
return;
|
||||
} else if (this.field[x][y] == 0 && this.bombs[x][y]) {
|
||||
alert(`[ERROR]: Square (${x}|${y}) should not be a bomb!`);
|
||||
this.bombs[x][y] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
this.drawField();
|
||||
alert("You won!");
|
||||
window.location.reload();
|
||||
}
|
||||
|
||||
markSquare(x, y) {
|
||||
if (x < this.field.length && y < this.field[0].length) {
|
||||
switch (this.field[x][y]) {
|
||||
case 1:
|
||||
this.field[x][y]++;
|
||||
break;
|
||||
case 2:
|
||||
this.field[x][y]++;
|
||||
break;
|
||||
case 3:
|
||||
this.field[x][y] = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
this.drawField();
|
||||
}
|
||||
}
|
||||
|
||||
uncoverSquare(x, y) {
|
||||
if (x < this.field.length && x >= 0 && y < this.field[0].length && y >= 0) {
|
||||
if (this.bombs[x][y] && this.field[x][y] == 1) {
|
||||
alert("You lost!");
|
||||
window.location.reload();
|
||||
}
|
||||
|
||||
markSquare(x, y) {
|
||||
if (x < this.field.length && y < this.field[0].length) {
|
||||
switch (this.field[x][y]) {
|
||||
case 1:
|
||||
this.field[x][y]++;
|
||||
break;
|
||||
case 2:
|
||||
this.field[x][y]++;
|
||||
break;
|
||||
case 3:
|
||||
this.field[x][y] = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
} else if (this.field[x][y] == 1) {
|
||||
this.field[x][y] = 0;
|
||||
!this.firstClick ? this.generateBombs() : {};
|
||||
if (this.getNearbyBombs(x, y) == 0) {
|
||||
for (let newX = x - 1; newX <= x + 1; newX++) {
|
||||
for (let newY = y - 1; newY <= y + 1; newY++) {
|
||||
if (
|
||||
newX < this.field.length &&
|
||||
newX >= 0 &&
|
||||
newY < this.field[0].length &&
|
||||
newY >= 0
|
||||
) {
|
||||
this.field[newX][newY] == 1
|
||||
? this.uncoverSquare(newX, newY)
|
||||
: {};
|
||||
}
|
||||
}
|
||||
this.drawField();
|
||||
}
|
||||
}
|
||||
}
|
||||
this.checkWin();
|
||||
this.drawField();
|
||||
}
|
||||
}
|
||||
|
||||
drawSquare(x, y, type) {
|
||||
ctx.lineWidth = 3;
|
||||
let uncovered = (x + y) % 2 === 0 ? "#D3D3D3" : "#A9A9A9";
|
||||
let covered = (x + y) % 2 === 0 ? "#4CAF50" : "#81C784";
|
||||
ctx.fillStyle = type != 0 ? covered : uncovered;
|
||||
ctx.fillRect(x * this.size, y * this.size, this.size, this.size);
|
||||
ctx.strokeStyle = "#000";
|
||||
ctx.strokeRect(x * this.size, y * this.size, this.size, this.size);
|
||||
|
||||
if (type != 1) {
|
||||
const fontSize = this.size / 2;
|
||||
const number = this.getNearbyBombs(x, y);
|
||||
let finalPrint;
|
||||
ctx.font = `${fontSize}px sans-serif`;
|
||||
ctx.fillStyle = "#000";
|
||||
type == 0 ? (finalPrint = number ? number : " ") : {};
|
||||
type == 2 ? (finalPrint = "🚩") : {};
|
||||
type == 3 ? (finalPrint = "❓") : {};
|
||||
ctx.fillText(
|
||||
finalPrint,
|
||||
x * this.size + fontSize / (type == 0 ? 1.5 : 1.8),
|
||||
y * this.size + fontSize * 1.3
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
drawField() {
|
||||
if (window.innerWidth > window.innerHeight) {
|
||||
this.size = window.innerHeight / (this.field[0].length + 4);
|
||||
} else {
|
||||
this.size = window.innerWidth / (this.field.length + 4);
|
||||
}
|
||||
|
||||
uncoverSquare(x, y) {
|
||||
if (x < this.field.length && x >= 0 && y < this.field[0].length && y >= 0) {
|
||||
if (this.bombs[x][y] && this.field[x][y] == 1) {
|
||||
alert('You lost!');
|
||||
window.location.reload();
|
||||
} else if (this.field[x][y] == 1) {
|
||||
this.field[x][y] = 0;
|
||||
!this.firstClick ? this.generateBombs() : {};
|
||||
if (this.getNearbyBombs(x, y) == 0) {
|
||||
for (let newX = x - 1; newX <= x + 1; newX++) {
|
||||
for (let newY = y - 1; newY <= y + 1; newY++) {
|
||||
if (newX < this.field.length && newX >= 0 && newY < this.field[0].length && newY >= 0) {
|
||||
this.field[newX][newY] == 1 ? this.uncoverSquare(newX, newY) : {};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
this.checkWin();
|
||||
this.drawField();
|
||||
}
|
||||
}
|
||||
|
||||
drawSquare(x, y, type) {
|
||||
ctx.lineWidth = 3;
|
||||
let uncovered = (x + y) % 2 === 0 ? '#D3D3D3' : '#A9A9A9';
|
||||
let covered = (x + y) % 2 === 0 ? '#4CAF50' : '#81C784';
|
||||
ctx.fillStyle = type != 0 ? covered : uncovered;
|
||||
ctx.fillRect(x * this.size, y * this.size, this.size, this.size);
|
||||
ctx.strokeStyle = '#000';
|
||||
ctx.strokeRect(x * this.size, y * this.size, this.size, this.size);
|
||||
|
||||
if (type != 1) {
|
||||
const fontSize = this.size / 2;
|
||||
const number = this.getNearbyBombs(x, y);
|
||||
let finalPrint;
|
||||
ctx.font = `${fontSize}px sans-serif`;
|
||||
ctx.fillStyle = '#000';
|
||||
type == 0 ? finalPrint = number ? number : ' ' : {};
|
||||
type == 2 ? finalPrint = '🚩' : {};
|
||||
type == 3 ? finalPrint = '❓' : {};
|
||||
ctx.fillText(finalPrint, x * this.size + fontSize / (type == 0 ? 1.5 : 1.8), y * this.size + fontSize * 1.3);
|
||||
}
|
||||
}
|
||||
|
||||
drawField() {
|
||||
if (window.innerWidth > window.innerHeight) {
|
||||
this.size = window.innerHeight / (this.field[0].length + 4);
|
||||
} else {
|
||||
this.size = window.innerWidth / (this.field.length + 4);
|
||||
}
|
||||
|
||||
canvas.width = this.size * this.field.length;
|
||||
canvas.height = this.size * this.field[0].length;
|
||||
|
||||
const offsetX = (canvas.width - (this.field.length * this.size)) / 2;
|
||||
const offsetY = (canvas.height - (this.field[0].length * this.size)) / 2;
|
||||
|
||||
for (let x = 0; x < this.field.length; x++) {
|
||||
for (let y = 0; y < this.field[x].length; y++) {
|
||||
this.drawSquare(x, y, this.field[x][y], offsetX, offsetY);
|
||||
}
|
||||
}
|
||||
canvas.width = this.size * this.field.length;
|
||||
canvas.height = this.size * this.field[0].length;
|
||||
|
||||
const offsetX = (canvas.width - this.field.length * this.size) / 2;
|
||||
const offsetY = (canvas.height - this.field[0].length * this.size) / 2;
|
||||
|
||||
for (let x = 0; x < this.field.length; x++) {
|
||||
for (let y = 0; y < this.field[x].length; y++) {
|
||||
this.drawSquare(x, y, this.field[x][y], offsetX, offsetY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const renderGame = (gridSize, bombs) => {
|
||||
let field = new Minesweeper(gridSize, gridSize, bombs);
|
||||
window.addEventListener('resize', () => field.drawField());
|
||||
canvas.addEventListener('click', (event) => {
|
||||
const rect = canvas.getBoundingClientRect();
|
||||
const x = Math.floor((event.clientX - rect.left) / field.size);
|
||||
const y = Math.floor((event.clientY - rect.top) / field.size);
|
||||
field.uncoverSquare(x, y);
|
||||
});
|
||||
canvas.addEventListener('contextmenu', (event) => {
|
||||
event.preventDefault();
|
||||
const rect = canvas.getBoundingClientRect();
|
||||
const x = Math.floor((event.clientX - rect.left) / field.size);
|
||||
const y = Math.floor((event.clientY - rect.top) / field.size);
|
||||
field.markSquare(x, y);
|
||||
});
|
||||
let field = new Minesweeper(gridSize, gridSize, bombs);
|
||||
window.addEventListener("resize", () => field.drawField());
|
||||
canvas.addEventListener("click", (event) => {
|
||||
const rect = canvas.getBoundingClientRect();
|
||||
const x = Math.floor((event.clientX - rect.left) / field.size);
|
||||
const y = Math.floor((event.clientY - rect.top) / field.size);
|
||||
field.uncoverSquare(x, y);
|
||||
});
|
||||
canvas.addEventListener("contextmenu", (event) => {
|
||||
event.preventDefault();
|
||||
const rect = canvas.getBoundingClientRect();
|
||||
const x = Math.floor((event.clientX - rect.left) / field.size);
|
||||
const y = Math.floor((event.clientY - rect.top) / field.size);
|
||||
field.markSquare(x, y);
|
||||
});
|
||||
};
|
||||
|
|
|
@ -1,104 +1,104 @@
|
|||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body,
|
||||
html {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: #121212;
|
||||
color: #e0e0e0;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: #121212;
|
||||
color: #e0e0e0;
|
||||
}
|
||||
|
||||
#settings {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
margin: auto;
|
||||
background-color: #1e1e1e;
|
||||
padding: 40px;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 6px 15px rgba(0, 0, 0, 0.5);
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
margin: auto;
|
||||
background-color: #1e1e1e;
|
||||
padding: 40px;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 6px 15px rgba(0, 0, 0, 0.5);
|
||||
width: 100%;
|
||||
max-width: 600px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2.5em;
|
||||
margin-bottom: 20px;
|
||||
color: #007bff;
|
||||
font-size: 2.5em;
|
||||
margin-bottom: 20px;
|
||||
color: #007bff;
|
||||
}
|
||||
|
||||
label {
|
||||
margin-bottom: 12px;
|
||||
font-size: 20px;
|
||||
color: #d1d1d1;
|
||||
margin-bottom: 12px;
|
||||
font-size: 20px;
|
||||
color: #d1d1d1;
|
||||
}
|
||||
|
||||
input[type="number"],
|
||||
input[type="range"],
|
||||
span {
|
||||
padding: 12px;
|
||||
margin-bottom: 20px;
|
||||
width: 100%;
|
||||
max-width: 400px;
|
||||
text-align: center;
|
||||
border: 1px solid #444;
|
||||
border-radius: 6px;
|
||||
background-color: #333;
|
||||
color: #e0e0e0;
|
||||
font-size: 18px;
|
||||
transition: border-color 0.3s ease;
|
||||
padding: 12px;
|
||||
margin-bottom: 20px;
|
||||
width: 100%;
|
||||
max-width: 400px;
|
||||
text-align: center;
|
||||
border: 1px solid #444;
|
||||
border-radius: 6px;
|
||||
background-color: #333;
|
||||
color: #e0e0e0;
|
||||
font-size: 18px;
|
||||
transition: border-color 0.3s ease;
|
||||
}
|
||||
|
||||
input[type="number"]:focus,
|
||||
input[type="range"]:focus {
|
||||
border-color: #007bff;
|
||||
outline: none;
|
||||
border-color: #007bff;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 12px 24px;
|
||||
background-color: #007bff;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s ease, transform 0.2s ease;
|
||||
font-size: 18px;
|
||||
padding: 12px 24px;
|
||||
background-color: #007bff;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s ease, transform 0.2s ease;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #0056b3;
|
||||
transform: translateY(-2px);
|
||||
background-color: #0056b3;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
button:active {
|
||||
transform: translateY(0);
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
canvas {
|
||||
display: none;
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media(max-width: 600px) {
|
||||
#settings {
|
||||
font-size: 16px;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
#settings {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
input[type="number"],
|
||||
input[type="range"],
|
||||
button {
|
||||
width: 90%;
|
||||
max-width: none;
|
||||
}
|
||||
input[type="number"],
|
||||
input[type="range"],
|
||||
button {
|
||||
width: 90%;
|
||||
max-width: none;
|
||||
}
|
||||
}
|
|
@ -1,13 +1,13 @@
|
|||
'use strict';
|
||||
"use strict";
|
||||
|
||||
const upButton = document.getElementById('up');
|
||||
const downButton = document.getElementById('down');
|
||||
const leftButton = document.getElementById('left');
|
||||
const rightButton = document.getElementById('right');
|
||||
const startButton = document.getElementById('start');
|
||||
const grid = document.createElement('div');
|
||||
grid.id = 'grid';
|
||||
document.querySelector('.game').appendChild(grid);
|
||||
const upButton = document.getElementById("up");
|
||||
const downButton = document.getElementById("down");
|
||||
const leftButton = document.getElementById("left");
|
||||
const rightButton = document.getElementById("right");
|
||||
const startButton = document.getElementById("start");
|
||||
const grid = document.createElement("div");
|
||||
grid.id = "grid";
|
||||
document.querySelector(".game").appendChild(grid);
|
||||
|
||||
let snake = [{ x: 5, y: 5 }];
|
||||
let apple = { x: 8, y: 5 };
|
||||
|
@ -17,128 +17,134 @@ let isGameRunning = false;
|
|||
const gridSize = 10;
|
||||
|
||||
function initGame() {
|
||||
grid.style.display = 'grid';
|
||||
grid.style.gridTemplateColumns = `repeat(${gridSize}, 1fr)`;
|
||||
grid.style.gridTemplateRows = `repeat(${gridSize}, 1fr)`;
|
||||
grid.style.width = '350px';
|
||||
grid.style.height = '350px';
|
||||
document.getElementById('title').style.display = 'none';
|
||||
document.getElementById('description').style.display = 'none';
|
||||
grid.style.display = "grid";
|
||||
grid.style.gridTemplateColumns = `repeat(${gridSize}, 1fr)`;
|
||||
grid.style.gridTemplateRows = `repeat(${gridSize}, 1fr)`;
|
||||
grid.style.width = "350px";
|
||||
grid.style.height = "350px";
|
||||
document.getElementById("title").style.display = "none";
|
||||
document.getElementById("description").style.display = "none";
|
||||
|
||||
isGameRunning = true;
|
||||
snake = [{ x: 5, y: 5 }];
|
||||
apple = spawnApple();
|
||||
direction = { x: 0, y: 0 };
|
||||
isGameRunning = true;
|
||||
snake = [{ x: 5, y: 5 }];
|
||||
apple = spawnApple();
|
||||
direction = { x: 0, y: 0 };
|
||||
|
||||
clearInterval(gameInterval);
|
||||
gameInterval = setInterval(gameLoop, 200);
|
||||
render();
|
||||
clearInterval(gameInterval);
|
||||
gameInterval = setInterval(gameLoop, 200);
|
||||
render();
|
||||
}
|
||||
|
||||
function spawnApple() {
|
||||
let newApple;
|
||||
do {
|
||||
newApple = {
|
||||
x: Math.floor(Math.random() * gridSize),
|
||||
y: Math.floor(Math.random() * gridSize)
|
||||
};
|
||||
} while (snake.some(segment => segment.x === newApple.x && segment.y === newApple.y));
|
||||
return newApple;
|
||||
let newApple;
|
||||
do {
|
||||
newApple = {
|
||||
x: Math.floor(Math.random() * gridSize),
|
||||
y: Math.floor(Math.random() * gridSize),
|
||||
};
|
||||
} while (
|
||||
snake.some(
|
||||
(segment) => segment.x === newApple.x && segment.y === newApple.y
|
||||
)
|
||||
);
|
||||
return newApple;
|
||||
}
|
||||
|
||||
function updateSnake() {
|
||||
const newHead = {
|
||||
x: snake[0].x + direction.x,
|
||||
y: snake[0].y + direction.y
|
||||
};
|
||||
const newHead = {
|
||||
x: snake[0].x + direction.x,
|
||||
y: snake[0].y + direction.y,
|
||||
};
|
||||
|
||||
if (newHead.x < 0) newHead.x = gridSize - 1;
|
||||
if (newHead.y < 0) newHead.y = gridSize - 1;
|
||||
if (newHead.x >= gridSize) newHead.x = 0;
|
||||
if (newHead.y >= gridSize) newHead.y = 0;
|
||||
if (newHead.x < 0) newHead.x = gridSize - 1;
|
||||
if (newHead.y < 0) newHead.y = gridSize - 1;
|
||||
if (newHead.x >= gridSize) newHead.x = 0;
|
||||
if (newHead.y >= gridSize) newHead.y = 0;
|
||||
|
||||
if (snake.some(segment => segment.x === newHead.x && segment.y === newHead.y)) {
|
||||
gameOver();
|
||||
return;
|
||||
}
|
||||
if (
|
||||
snake.some((segment) => segment.x === newHead.x && segment.y === newHead.y)
|
||||
) {
|
||||
gameOver();
|
||||
return;
|
||||
}
|
||||
|
||||
snake.unshift(newHead);
|
||||
snake.unshift(newHead);
|
||||
|
||||
if (newHead.x === apple.x && newHead.y === apple.y) {
|
||||
apple = spawnApple();
|
||||
} else {
|
||||
snake.pop();
|
||||
}
|
||||
if (newHead.x === apple.x && newHead.y === apple.y) {
|
||||
apple = spawnApple();
|
||||
} else {
|
||||
snake.pop();
|
||||
}
|
||||
}
|
||||
|
||||
function render() {
|
||||
grid.innerHTML = "";
|
||||
grid.innerHTML = "";
|
||||
|
||||
for (let y = 0; y < gridSize; y++) {
|
||||
for (let x = 0; x < gridSize; x++) {
|
||||
const cell = document.createElement("div");
|
||||
cell.classList.add("cell");
|
||||
for (let y = 0; y < gridSize; y++) {
|
||||
for (let x = 0; x < gridSize; x++) {
|
||||
const cell = document.createElement("div");
|
||||
cell.classList.add("cell");
|
||||
|
||||
if ((x + y) % 2 === 0) {
|
||||
cell.classList.add("light-green");
|
||||
} else {
|
||||
cell.classList.add("dark-green");
|
||||
}
|
||||
if ((x + y) % 2 === 0) {
|
||||
cell.classList.add("light-green");
|
||||
} else {
|
||||
cell.classList.add("dark-green");
|
||||
}
|
||||
|
||||
if (snake.some(segment => segment.x === x && segment.y === y)) {
|
||||
cell.classList.add("snake");
|
||||
}
|
||||
if (snake.some((segment) => segment.x === x && segment.y === y)) {
|
||||
cell.classList.add("snake");
|
||||
}
|
||||
|
||||
if (apple.x === x && apple.y === y) {
|
||||
cell.classList.add("apple");
|
||||
}
|
||||
if (apple.x === x && apple.y === y) {
|
||||
cell.classList.add("apple");
|
||||
}
|
||||
|
||||
grid.appendChild(cell);
|
||||
}
|
||||
grid.appendChild(cell);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function gameLoop() {
|
||||
if (!isGameRunning) return;
|
||||
updateSnake();
|
||||
render();
|
||||
if (!isGameRunning) return;
|
||||
updateSnake();
|
||||
render();
|
||||
}
|
||||
|
||||
function gameOver() {
|
||||
alert('Game Over!');
|
||||
clearInterval(gameInterval);
|
||||
isGameRunning = false;
|
||||
alert("Game Over!");
|
||||
clearInterval(gameInterval);
|
||||
isGameRunning = false;
|
||||
}
|
||||
|
||||
function handleDirectionInput(key) {
|
||||
switch (key) {
|
||||
case 'ArrowUp':
|
||||
case 'w':
|
||||
if (direction.y === 0) direction = { x: 0, y: -1 };
|
||||
break;
|
||||
case 'ArrowDown':
|
||||
case 's':
|
||||
if (direction.y === 0) direction = { x: 0, y: 1 };
|
||||
break;
|
||||
case 'ArrowLeft':
|
||||
case 'a':
|
||||
if (direction.x === 0) direction = { x: -1, y: 0 };
|
||||
break;
|
||||
case 'ArrowRight':
|
||||
case 'd':
|
||||
if (direction.x === 0) direction = { x: 1, y: 0 };
|
||||
break;
|
||||
}
|
||||
switch (key) {
|
||||
case "ArrowUp":
|
||||
case "w":
|
||||
if (direction.y === 0) direction = { x: 0, y: -1 };
|
||||
break;
|
||||
case "ArrowDown":
|
||||
case "s":
|
||||
if (direction.y === 0) direction = { x: 0, y: 1 };
|
||||
break;
|
||||
case "ArrowLeft":
|
||||
case "a":
|
||||
if (direction.x === 0) direction = { x: -1, y: 0 };
|
||||
break;
|
||||
case "ArrowRight":
|
||||
case "d":
|
||||
if (direction.x === 0) direction = { x: 1, y: 0 };
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
upButton.addEventListener('click', () => handleDirectionInput('ArrowUp'));
|
||||
downButton.addEventListener('click', () => handleDirectionInput('ArrowDown'));
|
||||
leftButton.addEventListener('click', () => handleDirectionInput('ArrowLeft'));
|
||||
rightButton.addEventListener('click', () => handleDirectionInput('ArrowRight'));
|
||||
startButton.addEventListener('click', () => {
|
||||
if (!isGameRunning) initGame();
|
||||
upButton.addEventListener("click", () => handleDirectionInput("ArrowUp"));
|
||||
downButton.addEventListener("click", () => handleDirectionInput("ArrowDown"));
|
||||
leftButton.addEventListener("click", () => handleDirectionInput("ArrowLeft"));
|
||||
rightButton.addEventListener("click", () => handleDirectionInput("ArrowRight"));
|
||||
startButton.addEventListener("click", () => {
|
||||
if (!isGameRunning) initGame();
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', (event) => {
|
||||
handleDirectionInput(event.key);
|
||||
document.addEventListener("keydown", (event) => {
|
||||
handleDirectionInput(event.key);
|
||||
});
|
||||
|
|
|
@ -1,238 +1,238 @@
|
|||
/* Base Reset */
|
||||
body,
|
||||
html {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: monospace;
|
||||
background-color: #3a2d56;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: monospace;
|
||||
background-color: #3a2d56;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
/* GameBoy Layout */
|
||||
.gameboy {
|
||||
background-color: #5f4c82; /* Game Boy Color purple shell */
|
||||
width: 441px;
|
||||
height: 735px;
|
||||
border-radius: 20px;
|
||||
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.6);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 10px;
|
||||
position: relative;
|
||||
background-color: #5f4c82;
|
||||
width: 441px;
|
||||
height: 735px;
|
||||
border-radius: 20px;
|
||||
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.6);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
padding: 10px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
@media(max-width: 768px) {
|
||||
.gameboy {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
border-radius: 0;
|
||||
}
|
||||
@media (max-width: 768px) {
|
||||
.gameboy {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Screen */
|
||||
.screen {
|
||||
background-color: black;
|
||||
border: 4px solid #0f380f;
|
||||
width: 90%;
|
||||
height: 55%;
|
||||
margin-top: 20px;
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
box-shadow: inset 0 4px 8px rgba(0, 0, 0, 0.5);
|
||||
overflow: hidden;
|
||||
background-color: black;
|
||||
border: 4px solid #0f380f;
|
||||
width: 90%;
|
||||
height: 55%;
|
||||
margin-top: 20px;
|
||||
border-radius: 10px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
box-shadow: inset 0 4px 8px rgba(0, 0, 0, 0.5);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.game {
|
||||
text-align: center;
|
||||
width: 90%;
|
||||
text-align: center;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
/* Titles */
|
||||
h1 {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 10px;
|
||||
text-transform: uppercase;
|
||||
color: #9bbc0f;
|
||||
font-size: 2rem;
|
||||
margin-bottom: 10px;
|
||||
text-transform: uppercase;
|
||||
color: #9bbc0f;
|
||||
}
|
||||
|
||||
.description,
|
||||
.description p {
|
||||
font-size: 1.2rem;
|
||||
margin: 0 auto;
|
||||
padding: 0 auto;
|
||||
color: white;
|
||||
font-size: 1.2rem;
|
||||
margin: 0 auto;
|
||||
padding: 0 auto;
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* Grid container */
|
||||
#grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(10, 1fr); /* Adjust to match gridSize */
|
||||
grid-template-rows: repeat(10, 1fr); /* Adjust to match gridSize */
|
||||
width: 400px; /* Adjust as needed */
|
||||
height: 400px; /* Adjust as needed */
|
||||
border: 2px solid #0f380f;
|
||||
margin: 20px auto;
|
||||
/* initially hide */
|
||||
display: none;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(10, 1fr); /* Adjust to match gridSize */
|
||||
grid-template-rows: repeat(10, 1fr); /* Adjust to match gridSize */
|
||||
width: 400px; /* Adjust as needed */
|
||||
height: 400px; /* Adjust as needed */
|
||||
border: 2px solid #0f380f;
|
||||
margin: 20px auto;
|
||||
/* initially hide */
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Individual cells */
|
||||
.cell {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.cell.light-green {
|
||||
background-color: #9bbc0f;
|
||||
background-color: #9bbc0f;
|
||||
}
|
||||
|
||||
.cell.dark-green {
|
||||
background-color: #0f380f;
|
||||
background-color: #0f380f;
|
||||
}
|
||||
|
||||
/* Snake styling */
|
||||
.snake {
|
||||
background-color: #e600ff; /* Snake color */
|
||||
z-index: 1000;
|
||||
background-color: #e600ff; /* Snake color */
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
/* Apple styling */
|
||||
.apple {
|
||||
background-color: red; /* Apple color */
|
||||
z-index: 999;
|
||||
background-color: red; /* Apple color */
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
/* Controls Section */
|
||||
.controls {
|
||||
margin-top: 20px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 80%;
|
||||
align-items: center;
|
||||
margin-top: 20px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
width: 80%;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
/* D-Pad */
|
||||
.dpad {
|
||||
position: relative;
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
position: relative;
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
}
|
||||
|
||||
/* Base Styling for D-Pad Buttons */
|
||||
.dpad-btn {
|
||||
background-color: #0f380f;
|
||||
color: #9bbc0f;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
position: absolute;
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
font-size: 1.5rem;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
z-index: 1;
|
||||
background-color: #0f380f;
|
||||
color: #9bbc0f;
|
||||
border: none;
|
||||
border-radius: 5px;
|
||||
position: absolute;
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
font-size: 1.5rem;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.dpad-btn.up {
|
||||
top: 0;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
top: 0;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
|
||||
.dpad-btn.down {
|
||||
bottom: 0;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
bottom: 0;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
}
|
||||
|
||||
.dpad-btn.left {
|
||||
top: 50%;
|
||||
left: 0;
|
||||
transform: translateY(-50%);
|
||||
top: 50%;
|
||||
left: 0;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.dpad-btn.right {
|
||||
top: 50%;
|
||||
right: 0;
|
||||
transform: translateY(-50%);
|
||||
top: 50%;
|
||||
right: 0;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
/* D-Pad Center to Connect Buttons */
|
||||
.dpad-center {
|
||||
background-color: #0f380f;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 2px solid transparent;
|
||||
z-index: 0;
|
||||
border-radius: 5px;
|
||||
background-color: #0f380f;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 2px solid transparent;
|
||||
z-index: 0;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
/* A and B Buttons */
|
||||
.action-buttons {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
height: 200px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
.btn {
|
||||
background-color: #0f380f;
|
||||
color: #9bbc0f;
|
||||
border: 2px solid #9bbc0f;
|
||||
border-radius: 50%;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
font-size: 1.8rem;
|
||||
cursor: pointer;
|
||||
transition: transform 0.1s, background-color 0.2s;
|
||||
background-color: #0f380f;
|
||||
color: #9bbc0f;
|
||||
border: 2px solid #9bbc0f;
|
||||
border-radius: 50%;
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
font-size: 1.8rem;
|
||||
cursor: pointer;
|
||||
transition: transform 0.1s, background-color 0.2s;
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
background-color: #9bbc0f;
|
||||
color: #0f380f;
|
||||
background-color: #9bbc0f;
|
||||
color: #0f380f;
|
||||
}
|
||||
|
||||
.btn:active {
|
||||
transform: scale(0.9);
|
||||
transform: scale(0.9);
|
||||
}
|
||||
|
||||
/* Start Button */
|
||||
.start-btn {
|
||||
background-color: #0f380f;
|
||||
color: #9bbc0f;
|
||||
border: 2px solid #9bbc0f;
|
||||
border-radius: 5px;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
font-size: 1.2rem;
|
||||
cursor: pointer;
|
||||
transition: transform 0.1s, background-color 0.2s;
|
||||
margin-bottom: 20px;
|
||||
background-color: #0f380f;
|
||||
color: #9bbc0f;
|
||||
border: 2px solid #9bbc0f;
|
||||
border-radius: 5px;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
font-size: 1.2rem;
|
||||
cursor: pointer;
|
||||
transition: transform 0.1s, background-color 0.2s;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.start-btn:hover {
|
||||
background-color: #9bbc0f;
|
||||
color: #0f380f;
|
||||
background-color: #9bbc0f;
|
||||
color: #0f380f;
|
||||
}
|
||||
|
||||
.start-btn:active {
|
||||
transform: scale(0.9);
|
||||
transform: scale(0.9);
|
||||
}
|
||||
|
||||
/* Hidden Canvas for Debugging or Fallback */
|
||||
canvas {
|
||||
display: none;
|
||||
z-index: 1000;
|
||||
display: none;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
|
|
@ -1,60 +1,134 @@
|
|||
'use strict';
|
||||
const aBtn = document.querySelector('#a');
|
||||
const bBtn = document.querySelector('#b');
|
||||
const gameboy = document.querySelector('.gameboy');
|
||||
"use strict";
|
||||
const aBtn = document.querySelector("#a");
|
||||
const bBtn = document.querySelector("#b");
|
||||
const gameboy = document.querySelector(".gameboy");
|
||||
const html = document.documentElement;
|
||||
const body = document.body;
|
||||
const dpadButtons = document.querySelectorAll('.dpad-btn');
|
||||
const dpadCenter = document.querySelector('.dpad-center'); // Darker variant
|
||||
const actionButtons = document.querySelectorAll('.btn');
|
||||
const dpadButtons = document.querySelectorAll(".dpad-btn");
|
||||
const dpadCenter = document.querySelector(".dpad-center"); // Darker variant
|
||||
const actionButtons = document.querySelectorAll(".btn");
|
||||
|
||||
const colors = [
|
||||
{ gameboyColor: '#B39DDB', htmlColor: '#D1C4E9', buttonColor: '#673AB7', buttonTextColor: '#FFFFFF', dpadCenterColor: '#5E35B1' },
|
||||
{ gameboyColor: '#FFC107', htmlColor: '#FFF9C4', buttonColor: '#FF9800', buttonTextColor: '#000000', dpadCenterColor: '#EF6C00' },
|
||||
{ gameboyColor: '#8BC34A', htmlColor: '#C5E1A5', buttonColor: '#FF5722', buttonTextColor: '#FFFFFF', dpadCenterColor: '#E64A19' },
|
||||
{ gameboyColor: '#F44336', htmlColor: '#FFCDD2', buttonColor: '#E91E63', buttonTextColor: '#FFFFFF', dpadCenterColor: '#C2185B' },
|
||||
{ gameboyColor: '#03A9F4', htmlColor: '#BBDEFB', buttonColor: '#FFEB3B', buttonTextColor: '#000000', dpadCenterColor: '#0277BD' },
|
||||
{ gameboyColor: '#FF7043', htmlColor: '#FFCCBC', buttonColor: '#FF5722', buttonTextColor: '#FFFFFF', dpadCenterColor: '#D84315' },
|
||||
{ gameboyColor: '#9C27B0', htmlColor: '#E1BEE7', buttonColor: '#7B1FA2', buttonTextColor: '#FFFFFF', dpadCenterColor: '#6A1B9A' },
|
||||
{ gameboyColor: '#FFD700', htmlColor: '#FFF9C4', buttonColor: '#FF9800', buttonTextColor: '#FFFFFF', dpadCenterColor: '#F57F17' },
|
||||
{ gameboyColor: '#009688', htmlColor: '#B2DFDB', buttonColor: '#4CAF50', buttonTextColor: '#FFFFFF', dpadCenterColor: '#00796B' },
|
||||
{ gameboyColor: '#795548', htmlColor: '#D7CCC8', buttonColor: '#9E9E9E', buttonTextColor: '#000000', dpadCenterColor: '#5D4037' },
|
||||
{ gameboyColor: '#FF5733', htmlColor: '#FFCCCB', buttonColor: '#C70039', buttonTextColor: '#FFFFFF', dpadCenterColor: '#B71C1C' },
|
||||
{ gameboyColor: '#00BCD4', htmlColor: '#B2EBF2', buttonColor: '#00ACC1', buttonTextColor: '#FFFFFF', dpadCenterColor: '#00838F' }
|
||||
{
|
||||
gameboyColor: "#B39DDB",
|
||||
htmlColor: "#D1C4E9",
|
||||
buttonColor: "#673AB7",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#5E35B1",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#FFC107",
|
||||
htmlColor: "#FFF9C4",
|
||||
buttonColor: "#FF9800",
|
||||
buttonTextColor: "#000000",
|
||||
dpadCenterColor: "#EF6C00",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#8BC34A",
|
||||
htmlColor: "#C5E1A5",
|
||||
buttonColor: "#FF5722",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#E64A19",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#F44336",
|
||||
htmlColor: "#FFCDD2",
|
||||
buttonColor: "#E91E63",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#C2185B",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#03A9F4",
|
||||
htmlColor: "#BBDEFB",
|
||||
buttonColor: "#FFEB3B",
|
||||
buttonTextColor: "#000000",
|
||||
dpadCenterColor: "#0277BD",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#FF7043",
|
||||
htmlColor: "#FFCCBC",
|
||||
buttonColor: "#FF5722",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#D84315",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#9C27B0",
|
||||
htmlColor: "#E1BEE7",
|
||||
buttonColor: "#7B1FA2",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#6A1B9A",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#FFD700",
|
||||
htmlColor: "#FFF9C4",
|
||||
buttonColor: "#FF9800",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#F57F17",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#009688",
|
||||
htmlColor: "#B2DFDB",
|
||||
buttonColor: "#4CAF50",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#00796B",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#795548",
|
||||
htmlColor: "#D7CCC8",
|
||||
buttonColor: "#9E9E9E",
|
||||
buttonTextColor: "#000000",
|
||||
dpadCenterColor: "#5D4037",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#FF5733",
|
||||
htmlColor: "#FFCCCB",
|
||||
buttonColor: "#C70039",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#B71C1C",
|
||||
},
|
||||
{
|
||||
gameboyColor: "#00BCD4",
|
||||
htmlColor: "#B2EBF2",
|
||||
buttonColor: "#00ACC1",
|
||||
buttonTextColor: "#FFFFFF",
|
||||
dpadCenterColor: "#00838F",
|
||||
},
|
||||
];
|
||||
|
||||
let currentColorIndex = localStorage.getItem('gameboyColorIndex') ? parseInt(localStorage.getItem('gameboyColorIndex')) : 0;
|
||||
let currentColorIndex = localStorage.getItem("gameboyColorIndex")
|
||||
? parseInt(localStorage.getItem("gameboyColorIndex"))
|
||||
: 0;
|
||||
|
||||
function updateGameBoyColor() {
|
||||
gameboy.style.backgroundColor = colors[currentColorIndex].gameboyColor;
|
||||
html.style.backgroundColor = colors[currentColorIndex].htmlColor;
|
||||
body.style.backgroundColor = colors[currentColorIndex].htmlColor;
|
||||
gameboy.style.backgroundColor = colors[currentColorIndex].gameboyColor;
|
||||
html.style.backgroundColor = colors[currentColorIndex].htmlColor;
|
||||
body.style.backgroundColor = colors[currentColorIndex].htmlColor;
|
||||
|
||||
dpadButtons.forEach(button => {
|
||||
button.style.backgroundColor = colors[currentColorIndex].buttonColor;
|
||||
button.style.color = colors[currentColorIndex].buttonTextColor;
|
||||
});
|
||||
dpadButtons.forEach((button) => {
|
||||
button.style.backgroundColor = colors[currentColorIndex].buttonColor;
|
||||
button.style.color = colors[currentColorIndex].buttonTextColor;
|
||||
});
|
||||
|
||||
// Using darker dpad center color
|
||||
dpadCenter.style.backgroundColor = colors[currentColorIndex].dpadCenterColor;
|
||||
dpadCenter.style.color = colors[currentColorIndex].buttonTextColor;
|
||||
// Using darker dpad center color
|
||||
dpadCenter.style.backgroundColor = colors[currentColorIndex].dpadCenterColor;
|
||||
dpadCenter.style.color = colors[currentColorIndex].buttonTextColor;
|
||||
|
||||
actionButtons.forEach(button => {
|
||||
button.style.backgroundColor = colors[currentColorIndex].buttonColor;
|
||||
button.style.color = colors[currentColorIndex].buttonTextColor;
|
||||
});
|
||||
actionButtons.forEach((button) => {
|
||||
button.style.backgroundColor = colors[currentColorIndex].buttonColor;
|
||||
button.style.color = colors[currentColorIndex].buttonTextColor;
|
||||
});
|
||||
}
|
||||
|
||||
aBtn.addEventListener('click', () => {
|
||||
currentColorIndex = (currentColorIndex - 1 + colors.length) % colors.length;
|
||||
localStorage.setItem('gameboyColorIndex', currentColorIndex);
|
||||
updateGameBoyColor();
|
||||
aBtn.addEventListener("click", () => {
|
||||
currentColorIndex = (currentColorIndex - 1 + colors.length) % colors.length;
|
||||
localStorage.setItem("gameboyColorIndex", currentColorIndex);
|
||||
updateGameBoyColor();
|
||||
});
|
||||
|
||||
bBtn.addEventListener('click', () => {
|
||||
currentColorIndex = (currentColorIndex + 1) % colors.length;
|
||||
localStorage.setItem('gameboyColorIndex', currentColorIndex);
|
||||
updateGameBoyColor();
|
||||
bBtn.addEventListener("click", () => {
|
||||
currentColorIndex = (currentColorIndex + 1) % colors.length;
|
||||
localStorage.setItem("gameboyColorIndex", currentColorIndex);
|
||||
updateGameBoyColor();
|
||||
});
|
||||
|
||||
updateGameBoyColor();
|
||||
|
|
|
@ -1,141 +1,145 @@
|
|||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Courier New', Courier, monospace;
|
||||
background-color: #0d0d0d;
|
||||
color: #b0b0b0;
|
||||
margin: 0;
|
||||
line-height: 1.6;
|
||||
background-image: url('images/background.jpg');
|
||||
background-size: cover; /* Adjust size for tape appearance */
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
background-color: #0d0d0d;
|
||||
color: #b0b0b0;
|
||||
margin: 0;
|
||||
line-height: 1.6;
|
||||
background-image: url("images/background.jpg");
|
||||
background-size: cover; /* Adjust size for tape appearance */
|
||||
}
|
||||
|
||||
header {
|
||||
background-color: #222; /* Fully opaque background */
|
||||
color: #b0b0b0;
|
||||
text-align: center;
|
||||
padding: 1em 0;
|
||||
font-size: 2rem;
|
||||
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.7);
|
||||
animation: neonFlicker 1.5s infinite;
|
||||
background-color: #222; /* Fully opaque background */
|
||||
color: #b0b0b0;
|
||||
text-align: center;
|
||||
padding: 1em 0;
|
||||
font-size: 2rem;
|
||||
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.7);
|
||||
animation: neonFlicker 1.5s infinite;
|
||||
}
|
||||
|
||||
/* Create the flickering neon light effect */
|
||||
@keyframes neonFlicker {
|
||||
0% {
|
||||
text-shadow: 0 0 5px #ffcc00, 0 0 10px #ffcc00, 0 0 15px #ffcc00, 0 0 20px #ffcc00, 0 0 30px #ffcc00, 0 0 40px #ffcc00, 0 0 50px #ffcc00;
|
||||
}
|
||||
20% {
|
||||
text-shadow: 0 0 3px #ffcc00, 0 0 7px #ffcc00, 0 0 10px #ffcc00, 0 0 15px #ffcc00, 0 0 20px #ffcc00;
|
||||
}
|
||||
40% {
|
||||
text-shadow: 0 0 5px #ffcc00, 0 0 15px #ffcc00, 0 0 25px #ffcc00;
|
||||
}
|
||||
60% {
|
||||
text-shadow: 0 0 5px #ffcc00, 0 0 10px #ffcc00, 0 0 15px #ffcc00, 0 0 20px #ffcc00, 0 0 30px #ffcc00;
|
||||
}
|
||||
80% {
|
||||
text-shadow: 0 0 3px #ffcc00, 0 0 7px #ffcc00, 0 0 10px #ffcc00;
|
||||
}
|
||||
100% {
|
||||
text-shadow: 0 0 5px #ffcc00, 0 0 10px #ffcc00, 0 0 15px #ffcc00, 0 0 20px #ffcc00, 0 0 30px #ffcc00, 0 0 40px #ffcc00;
|
||||
}
|
||||
0% {
|
||||
text-shadow: 0 0 5px #ffcc00, 0 0 10px #ffcc00, 0 0 15px #ffcc00,
|
||||
0 0 20px #ffcc00, 0 0 30px #ffcc00, 0 0 40px #ffcc00, 0 0 50px #ffcc00;
|
||||
}
|
||||
20% {
|
||||
text-shadow: 0 0 3px #ffcc00, 0 0 7px #ffcc00, 0 0 10px #ffcc00,
|
||||
0 0 15px #ffcc00, 0 0 20px #ffcc00;
|
||||
}
|
||||
40% {
|
||||
text-shadow: 0 0 5px #ffcc00, 0 0 15px #ffcc00, 0 0 25px #ffcc00;
|
||||
}
|
||||
60% {
|
||||
text-shadow: 0 0 5px #ffcc00, 0 0 10px #ffcc00, 0 0 15px #ffcc00,
|
||||
0 0 20px #ffcc00, 0 0 30px #ffcc00;
|
||||
}
|
||||
80% {
|
||||
text-shadow: 0 0 3px #ffcc00, 0 0 7px #ffcc00, 0 0 10px #ffcc00;
|
||||
}
|
||||
100% {
|
||||
text-shadow: 0 0 5px #ffcc00, 0 0 10px #ffcc00, 0 0 15px #ffcc00,
|
||||
0 0 20px #ffcc00, 0 0 30px #ffcc00, 0 0 40px #ffcc00;
|
||||
}
|
||||
}
|
||||
|
||||
footer {
|
||||
background-color: #111;
|
||||
color: #b0b0b0;
|
||||
text-align: center;
|
||||
padding: 1em 0;
|
||||
margin-top: 20px;
|
||||
background-color: #111;
|
||||
color: #b0b0b0;
|
||||
text-align: center;
|
||||
padding: 1em 0;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.grid-container {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 20px;
|
||||
padding: 20px;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 20px;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.item {
|
||||
position: relative;
|
||||
background-color: #1a1a1a;
|
||||
border-radius: 10px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.8);
|
||||
transition: transform 0.3s ease, box-shadow 0.3s ease, filter 0.3s ease;
|
||||
width: 100%;
|
||||
height: 400px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
background-color: #1a1a1a;
|
||||
border-radius: 10px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.8);
|
||||
transition: transform 0.3s ease, box-shadow 0.3s ease, filter 0.3s ease;
|
||||
width: 100%;
|
||||
height: 400px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.item img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
filter: brightness(0.6);
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
filter: brightness(0.6);
|
||||
}
|
||||
|
||||
.item .description {
|
||||
padding: 30px;
|
||||
font-size: 1rem;
|
||||
color: #ccc;
|
||||
background-color: rgba(0, 0, 0, 0.8);
|
||||
border-radius: 0 0 10px 10px;
|
||||
flex-grow: 1;
|
||||
padding: 30px;
|
||||
font-size: 1rem;
|
||||
color: #ccc;
|
||||
background-color: rgba(0, 0, 0, 0.8);
|
||||
border-radius: 0 0 10px 10px;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
p {
|
||||
text-decoration: none;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.item:hover {
|
||||
transform: scale(1.05);
|
||||
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.9);
|
||||
filter: brightness(1.1);
|
||||
transform: scale(1.05);
|
||||
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.9);
|
||||
filter: brightness(1.1);
|
||||
}
|
||||
|
||||
.item:hover img {
|
||||
transform: scale(1.1);
|
||||
filter: brightness(1.1);
|
||||
transform: scale(1.1);
|
||||
filter: brightness(1.1);
|
||||
}
|
||||
|
||||
.item h2 {
|
||||
position: absolute;
|
||||
top: 10%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
color: #ffffff;
|
||||
font-size: 1.8rem;
|
||||
background-color: rgba(0, 0, 0, 0.9);
|
||||
padding: 5px 15px;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease, transform 0.3s ease;
|
||||
position: absolute;
|
||||
top: 10%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
color: #ffffff;
|
||||
font-size: 1.8rem;
|
||||
background-color: rgba(0, 0, 0, 0.9);
|
||||
padding: 5px 15px;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease, transform 0.3s ease;
|
||||
}
|
||||
|
||||
.item:hover h2 {
|
||||
opacity: 1;
|
||||
transform: translateX(-50%) translateY(-10px);
|
||||
opacity: 1;
|
||||
transform: translateX(-50%) translateY(-10px);
|
||||
}
|
||||
|
||||
@media(max-width: 800px) {
|
||||
header {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
@media (max-width: 800px) {
|
||||
header {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.item {
|
||||
height: auto;
|
||||
width: auto;
|
||||
}
|
||||
.item {
|
||||
height: auto;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.grid-container {
|
||||
grid-template-columns: repeat(1, 1fr);
|
||||
}
|
||||
.grid-container {
|
||||
grid-template-columns: repeat(1, 1fr);
|
||||
}
|
||||
}
|
||||
|
|
27
styles.css
27
styles.css
|
@ -206,7 +206,8 @@ article ul a li {
|
|||
margin-bottom: 10px;
|
||||
border-radius: var(--border-radius);
|
||||
padding: 10px;
|
||||
transition: background-color var(--transition-speed), box-shadow var(--transition-speed);
|
||||
transition: background-color var(--transition-speed),
|
||||
box-shadow var(--transition-speed);
|
||||
}
|
||||
|
||||
article ul a li:hover {
|
||||
|
@ -214,7 +215,7 @@ article ul a li:hover {
|
|||
box-shadow: 0 0 10px var(--accent-color);
|
||||
}
|
||||
|
||||
article ul a li{
|
||||
article ul a li {
|
||||
text-decoration: none;
|
||||
color: var(--accent-color);
|
||||
font-weight: bold;
|
||||
|
@ -263,7 +264,12 @@ section .card a {
|
|||
section .card {
|
||||
text-align: center;
|
||||
list-style: none;
|
||||
background: linear-gradient(180deg, rgba(0, 0, 50, 0.9), rgba(10, 10, 100, 0.9), rgba(30, 30, 150, 0.9));
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
rgba(0, 0, 50, 0.9),
|
||||
rgba(10, 10, 100, 0.9),
|
||||
rgba(30, 30, 150, 0.9)
|
||||
);
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 5px 20px rgba(0, 0, 50, 0.8), 0 0 10px rgba(255, 255, 255, 0.1);
|
||||
border: 1px solid #2e3a60;
|
||||
|
@ -278,7 +284,12 @@ section .card {
|
|||
/* Hover effect */
|
||||
section .card:hover {
|
||||
transform: translateY(-8px);
|
||||
background: linear-gradient(180deg, rgba(30, 30, 150, 0.9), rgba(40, 0, 100, 0.9), rgba(100, 0, 150, 0.9));
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
rgba(30, 30, 150, 0.9),
|
||||
rgba(40, 0, 100, 0.9),
|
||||
rgba(100, 0, 150, 0.9)
|
||||
);
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 100, 0.7), 0 0 20px rgba(255, 221, 85, 0.8);
|
||||
}
|
||||
|
||||
|
@ -314,7 +325,11 @@ section .card::before {
|
|||
width: 60px;
|
||||
height: 60px;
|
||||
border-radius: 50%;
|
||||
background: radial-gradient(circle, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.02));
|
||||
background: radial-gradient(
|
||||
circle,
|
||||
rgba(255, 255, 255, 0.1),
|
||||
rgba(255, 255, 255, 0.02)
|
||||
);
|
||||
box-shadow: 0 0 50px rgba(255, 255, 255, 0.5);
|
||||
animation: spin 8s linear infinite;
|
||||
}
|
||||
|
@ -411,7 +426,7 @@ footer {
|
|||
width: 60px;
|
||||
}
|
||||
|
||||
.project-name{
|
||||
.project-name {
|
||||
font-size: 1.3em;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,120 +1,120 @@
|
|||
/* Reset and box-sizing */
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
/* General Styles */
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
background-color: #282c34;
|
||||
color: #ffffff;
|
||||
margin: 0;
|
||||
font-family: Arial, sans-serif;
|
||||
background-color: #282c34;
|
||||
color: #ffffff;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
header {
|
||||
background-color: #4CAF50;
|
||||
color: white;
|
||||
text-align: center;
|
||||
padding: 1em 0;
|
||||
font-size: 1.5rem;
|
||||
background-color: #4caf50;
|
||||
color: white;
|
||||
text-align: center;
|
||||
padding: 1em 0;
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
footer {
|
||||
background-color: #333;
|
||||
color: white;
|
||||
text-align: center;
|
||||
padding: 1em 0;
|
||||
margin-top: 20px;
|
||||
background-color: #333;
|
||||
color: white;
|
||||
text-align: center;
|
||||
padding: 1em 0;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/* Grid Styles */
|
||||
.grid-container {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 20px; /* Space between items */
|
||||
padding: 20px; /* Space around the grid */
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 20px; /* Space between items */
|
||||
padding: 20px; /* Space around the grid */
|
||||
}
|
||||
|
||||
/* Game Item */
|
||||
.item {
|
||||
position: relative;
|
||||
background-color: #444;
|
||||
border-radius: 10px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||
transition: transform 0.3s ease, box-shadow 0.3s ease, filter 0.3s ease;
|
||||
width: 100%; /* Ensure it takes full width of the column */
|
||||
height: 400px; /* Set a fixed height for all items */
|
||||
display: flex;
|
||||
flex-direction: column; /* Stack children vertically */
|
||||
position: relative;
|
||||
background-color: #444;
|
||||
border-radius: 10px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||
transition: transform 0.3s ease, box-shadow 0.3s ease, filter 0.3s ease;
|
||||
width: 100%; /* Ensure it takes full width of the column */
|
||||
height: 400px; /* Set a fixed height for all items */
|
||||
display: flex;
|
||||
flex-direction: column; /* Stack children vertically */
|
||||
}
|
||||
|
||||
/* Ensure the image takes the top part of the card */
|
||||
.item img {
|
||||
width: 100%;
|
||||
height: 100%; /* Set a height for the image */
|
||||
object-fit: cover;
|
||||
width: 100%;
|
||||
height: 100%; /* Set a height for the image */
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.item .description {
|
||||
padding: 30px;
|
||||
font-size: 1rem;
|
||||
color: #ddd;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
border-radius: 0 0 10px 10px;
|
||||
flex-grow: 1; /* Allow description to take remaining space */
|
||||
padding: 30px;
|
||||
font-size: 1rem;
|
||||
color: #ddd;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
border-radius: 0 0 10px 10px;
|
||||
flex-grow: 1; /* Allow description to take remaining space */
|
||||
}
|
||||
|
||||
p {
|
||||
text-decoration: none;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Hover effect for scaling and glowing */
|
||||
.item:hover {
|
||||
transform: scale(1.05);
|
||||
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.4);
|
||||
filter: brightness(1.2);
|
||||
transform: scale(1.05);
|
||||
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.4);
|
||||
filter: brightness(1.2);
|
||||
}
|
||||
|
||||
.item:hover img {
|
||||
transform: scale(1.1); /* Slight zoom-in effect for the image */
|
||||
filter: brightness(1.1); /* Increase image brightness */
|
||||
transform: scale(1.1); /* Slight zoom-in effect for the image */
|
||||
filter: brightness(1.1); /* Increase image brightness */
|
||||
}
|
||||
|
||||
.item h2 {
|
||||
position: absolute;
|
||||
top: 10%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
color: white;
|
||||
font-size: 1.5rem;
|
||||
background-color: rgba(0, 0, 0, 0.6);
|
||||
padding: 5px 15px;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease, transform 0.3s ease;
|
||||
position: absolute;
|
||||
top: 10%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
color: white;
|
||||
font-size: 1.5rem;
|
||||
background-color: rgba(0, 0, 0, 0.6);
|
||||
padding: 5px 15px;
|
||||
border-radius: 5px;
|
||||
text-align: center;
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease, transform 0.3s ease;
|
||||
}
|
||||
|
||||
.item:hover h2 {
|
||||
opacity: 1;
|
||||
transform: translateX(-50%) translateY(-10px); /* Move the title upwards with hover */
|
||||
opacity: 1;
|
||||
transform: translateX(-50%) translateY(-10px); /* Move the title upwards with hover */
|
||||
}
|
||||
|
||||
/* Mobile Optimization */
|
||||
@media(max-width: 600px) {
|
||||
header {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
header {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.item {
|
||||
height: auto; /* Allow auto height on mobile for better responsiveness */
|
||||
width: auto;
|
||||
}
|
||||
.item {
|
||||
height: auto; /* Allow auto height on mobile for better responsiveness */
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.grid-container {
|
||||
grid-template-columns: repeat(1, 1fr);
|
||||
}
|
||||
.grid-container {
|
||||
grid-template-columns: repeat(1, 1fr);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue