ignacio-ave's picture
creemos un sitio web o una pagina de html con css con un juego clasico a jugar para demostrar mis habilidades en html y css PURO
8b38cc9 verified
// Game variables
let ball = {
x: 400,
y: 250,
dx: 5,
dy: 5,
radius: 10
};
let leftPaddle = {
y: 200,
height: 100,
width: 15,
speed: 8
};
let rightPaddle = {
y: 200,
height: 100,
width: 15,
speed: 8
};
let score = {
left: 0,
right: 0
};
let gameRunning = false;
let animationId;
// DOM elements
const ballElement = document.getElementById('ball');
const paddleLeftElement = document.getElementById('paddle-left');
const paddleRightElement = document.getElementById('paddle-right');
const scoreElement = document.getElementById('score');
const gameContainer = document.getElementById('game-container');
const startButton = document.getElementById('start-btn');
const resetButton = document.getElementById('reset-btn');
// Initialize game elements
function initGame() {
const containerRect = gameContainer.getBoundingClientRect();
// Ball position
ball.x = containerRect.width / 2;
ball.y = containerRect.height / 2;
// Random initial direction
ball.dx = Math.random() > 0.5 ? 5 : -5;
ball.dy = (Math.random() * 4) - 2;
// Paddle positions
leftPaddle.y = (containerRect.height - leftPaddle.height) / 2;
rightPaddle.y = (containerRect.height - rightPaddle.height) / 2;
updateElements();
}
// Update DOM elements positions
function updateElements() {
ballElement.style.left = `${ball.x}px`;
ballElement.style.top = `${ball.y}px`;
paddleLeftElement.style.top = `${leftPaddle.y}px`;
paddleLeftElement.style.left = '20px';
paddleRightElement.style.top = `${rightPaddle.y}px`;
paddleRightElement.style.right = '20px';
scoreElement.textContent = `${score.left} - ${score.right}`;
}
// Game loop
function gameLoop() {
if (!gameRunning) return;
const containerRect = gameContainer.getBoundingClientRect();
// Move ball
ball.x += ball.dx;
ball.y += ball.dy;
// Ball collision with top and bottom
if (ball.y - ball.radius <= 0 || ball.y + ball.radius >= containerRect.height) {
ball.dy = -ball.dy;
ballElement.classList.add('ball-hit');
setTimeout(() => ballElement.classList.remove('ball-hit'), 200);
}
// Ball collision with paddles
if (
(ball.x - ball.radius <= 35 &&
ball.y >= leftPaddle.y &&
ball.y <= leftPaddle.y + leftPaddle.height) ||
(ball.x + ball.radius >= containerRect.width - 35 &&
ball.y >= rightPaddle.y &&
ball.y <= rightPaddle.y + rightPaddle.height)
) {
ball.dx = -ball.dx * 1.05; // Increase speed slightly on hit
ball.dy += (Math.random() * 2) - 1; // Add slight randomness
ballElement.classList.add('ball-hit');
setTimeout(() => ballElement.classList.remove('ball-hit'), 200);
}
// Score points
if (ball.x - ball.radius <= 0) {
score.right++;
resetBall();
} else if (ball.x + ball.radius >= containerRect.width) {
score.left++;
resetBall();
}
// Update elements
updateElements();
// Continue game loop
animationId = requestAnimationFrame(gameLoop);
}
// Reset ball to center
function resetBall() {
const containerRect = gameContainer.getBoundingClientRect();
ball.x = containerRect.width / 2;
ball.y = containerRect.height / 2;
ball.dx = score.right > score.left ? -5 : 5; // Direction towards losing player
ball.dy = (Math.random() * 4) - 2;
// Pause briefly before continuing
gameRunning = false;
setTimeout(() => {
gameRunning = true;
gameLoop();
}, 1000);
}
// Keyboard controls
const keys = {
w: false,
s: false,
ArrowUp: false,
ArrowDown: false
};
document.addEventListener('keydown', (e) => {
if (['w', 's', 'ArrowUp', 'ArrowDown'].includes(e.key)) {
keys[e.key] = true;
}
});
document.addEventListener('keyup', (e) => {
if (['w', 's', 'ArrowUp', 'ArrowDown'].includes(e.key)) {
keys[e.key] = false;
}
});
// Paddle movement
function movePaddles() {
const containerRect = gameContainer.getBoundingClientRect();
// Left paddle (W/S keys)
if (keys.w && leftPaddle.y > 0) {
leftPaddle.y -= leftPaddle.speed;
}
if (keys.s && leftPaddle.y < containerRect.height - leftPaddle.height) {
leftPaddle.y += leftPaddle.speed;
}
// Right paddle (Up/Down arrows)
if (keys.ArrowUp && rightPaddle.y > 0) {
rightPaddle.y -= rightPaddle.speed;
}
if (keys.ArrowDown && rightPaddle.y < containerRect.height - rightPaddle.height) {
rightPaddle.y += rightPaddle.speed;
}
updateElements();
}
// Start game
startButton.addEventListener('click', () => {
if (!gameRunning) {
gameRunning = true;
startButton.disabled = true;
initGame();
gameLoop();
// Paddle movement interval
setInterval(movePaddles, 16);
}
});
// Reset game
resetButton.addEventListener('click', () => {
gameRunning = false;
cancelAnimationFrame(animationId);
score.left = 0;
score.right = 0;
startButton.disabled = false;
initGame();
updateElements();
});
// Initialize game on load
document.addEventListener('DOMContentLoaded', () => {
initGame();
});