race
🧩 Syntax:
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
// Player car
const carWidth = 50;
const carHeight = 100;
const car = {
x: canvas.width / 2 - carWidth / 2,
y: canvas.height - carHeight,
width: carWidth,
height: carHeight,
speed: 5,
color: "red"
};
// Enemy cars
let enemies = [];
const enemyWidth = 50;
const enemyHeight = 100;
const maxEnemies = 10;
const enemySpeed = 5;
const spawnRate = 1000; // Spawn an enemy every 1 second
let lastSpawn = 0;
// Keyboard controls
const keys = {};
document.addEventListener("keydown", (event) => {
keys[event.code] = true;
});
document.addEventListener("keyup", (event) => {
keys[event.code] = false;
});
function update() {
// Move player car
if (keys["ArrowLeft"] && car.x > 0) {
car.x -= car.speed;
}
if (keys["ArrowRight"] && car.x < canvas.width - car.width) {
car.x += car.speed;
}
// Move enemy cars
enemies.forEach((enemy) => {
enemy.y += enemySpeed;
});
// Spawn new enemy cars
if (Date.now() - lastSpawn > spawnRate && enemies.length < maxEnemies) {
const enemy = {
x: Math.random() * (canvas.width - enemyWidth),
y: -enemyHeight,
width: enemyWidth,
height: enemyHeight,
color: "blue"
};
enemies.push(enemy);
lastSpawn = Date.now();
}
// Check for collision
enemies.forEach((enemy, index) => {
if (car.x < enemy.x + enemy.width &&
car.x + car.width > enemy.x &&
car.y < enemy.y + enemy.height &&
car.y + car.height > enemy.y) {
// Game over
alert("Game over!");
location.reload();
}
// Remove enemy if it's offscreen
if (enemy.y > canvas.height) {
enemies.splice(index, 1);
}
});
// Clear canvas and draw cars
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = car.color;
ctx.fillRect(car.x, car.y, car.width, car.height);
enemies.forEach((enemy) => {
ctx.fillStyle = enemy.color;
ctx.fillRect(enemy.x, enemy.y, enemy.width, enemy.height);
});
// Call update function again
requestAnimationFrame(update);
}
// Start game
u