const canvas = document.getElementById("gameCanvas");
const ctx = canvas.getContext("2d");
canvas.width = 800;
canvas.height = 600;
const player = {
x: canvas.width / 2,
y: canvas.height - 50,
width: 50,
height: 50,
color: "blue",
speed: 5,
bullets: []
};
const enemies = [];
let score = 0;
function drawPlayer() {
ctx.fillStyle = player.color;
ctx.fillRect(player.x, player.y, player.width, player.height);
}
function drawBullets() {
ctx.fillStyle = "red";
player.bullets.forEach((bullet, index) => {
ctx.fillRect(bullet.x, bullet.y, 5, 10);
bullet.y -= 5;
if (bullet.y < 0) player.bullets.splice(index, 1);
});
}
function drawEnemies() {
ctx.fillStyle = "green";
enemies.forEach((enemy, index) => {
ctx.fillRect(enemy.x, enemy.y, enemy.width, enemy.height);
enemy.y += 2;
if (enemy.y > canvas.height) {
enemies.splice(index, 1);
}
});
}
function spawnEnemy() {
enemies.push({
x: Math.random() * (canvas.width - 50),
y: 0,
width: 50,
height: 50
});
}
setInterval(spawnEnemy, 1000);
function checkCollision() {
player.bullets.forEach((bullet, bIndex) => {
enemies.forEach((enemy, eIndex) => {
if (
bullet.x < enemy.x + enemy.width &&
bullet.x + 5 > enemy.x &&
bullet.y < enemy.y + enemy.height &&
bullet.y + 10 > enemy.y
) {
player.bullets.splice(bIndex, 1);
enemies.splice(eIndex, 1);
score += 10;
}
});
});
}
function drawScore() {
ctx.fillStyle = "black";
ctx.font = "20px Arial";
ctx.fillText("Score: " + score, 10, 30);
}
document.addEventListener("keydown", (event) => {
if (event
.key === "ArrowLeft" && player
.x
> 0) player
.x
-= player
.speed
; if (event
.key === "ArrowRight" && player
.x
< canvas
.width
- player
.width
) player
.x
+= player
.speed
; if (event
.key === " ") player
.bullets
.push
({ x
: player
.x
+ 22, y
: player
.y
}); });
function update() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawPlayer();
drawBullets();
drawEnemies();
checkCollision();
drawScore();
requestAnimationFrame(update);
}
update();
Y29uc3QgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWVDYW52YXMiKTsKY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CmNhbnZhcy53aWR0aCA9IDgwMDsKY2FudmFzLmhlaWdodCA9IDYwMDsKCmNvbnN0IHBsYXllciA9IHsKICAgIHg6IGNhbnZhcy53aWR0aCAvIDIsCiAgICB5OiBjYW52YXMuaGVpZ2h0IC0gNTAsCiAgICB3aWR0aDogNTAsCiAgICBoZWlnaHQ6IDUwLAogICAgY29sb3I6ICJibHVlIiwKICAgIHNwZWVkOiA1LAogICAgYnVsbGV0czogW10KfTsKCmNvbnN0IGVuZW1pZXMgPSBbXTsKbGV0IHNjb3JlID0gMDsKCmZ1bmN0aW9uIGRyYXdQbGF5ZXIoKSB7CiAgICBjdHguZmlsbFN0eWxlID0gcGxheWVyLmNvbG9yOwogICAgY3R4LmZpbGxSZWN0KHBsYXllci54LCBwbGF5ZXIueSwgcGxheWVyLndpZHRoLCBwbGF5ZXIuaGVpZ2h0KTsKfQoKZnVuY3Rpb24gZHJhd0J1bGxldHMoKSB7CiAgICBjdHguZmlsbFN0eWxlID0gInJlZCI7CiAgICBwbGF5ZXIuYnVsbGV0cy5mb3JFYWNoKChidWxsZXQsIGluZGV4KSA9PiB7CiAgICAgICAgY3R4LmZpbGxSZWN0KGJ1bGxldC54LCBidWxsZXQueSwgNSwgMTApOwogICAgICAgIGJ1bGxldC55IC09IDU7CiAgICAgICAgaWYgKGJ1bGxldC55IDwgMCkgcGxheWVyLmJ1bGxldHMuc3BsaWNlKGluZGV4LCAxKTsKICAgIH0pOwp9CgpmdW5jdGlvbiBkcmF3RW5lbWllcygpIHsKICAgIGN0eC5maWxsU3R5bGUgPSAiZ3JlZW4iOwogICAgZW5lbWllcy5mb3JFYWNoKChlbmVteSwgaW5kZXgpID0+IHsKICAgICAgICBjdHguZmlsbFJlY3QoZW5lbXkueCwgZW5lbXkueSwgZW5lbXkud2lkdGgsIGVuZW15LmhlaWdodCk7CiAgICAgICAgZW5lbXkueSArPSAyOwogICAgICAgIGlmIChlbmVteS55ID4gY2FudmFzLmhlaWdodCkgewogICAgICAgICAgICBlbmVtaWVzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgfQogICAgfSk7Cn0KCmZ1bmN0aW9uIHNwYXduRW5lbXkoKSB7CiAgICBlbmVtaWVzLnB1c2goewogICAgICAgIHg6IE1hdGgucmFuZG9tKCkgKiAoY2FudmFzLndpZHRoIC0gNTApLAogICAgICAgIHk6IDAsCiAgICAgICAgd2lkdGg6IDUwLAogICAgICAgIGhlaWdodDogNTAKICAgIH0pOwp9CnNldEludGVydmFsKHNwYXduRW5lbXksIDEwMDApOwoKZnVuY3Rpb24gY2hlY2tDb2xsaXNpb24oKSB7CiAgICBwbGF5ZXIuYnVsbGV0cy5mb3JFYWNoKChidWxsZXQsIGJJbmRleCkgPT4gewogICAgICAgIGVuZW1pZXMuZm9yRWFjaCgoZW5lbXksIGVJbmRleCkgPT4gewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBidWxsZXQueCA8IGVuZW15LnggKyBlbmVteS53aWR0aCAmJgogICAgICAgICAgICAgICAgYnVsbGV0LnggKyA1ID4gZW5lbXkueCAmJgogICAgICAgICAgICAgICAgYnVsbGV0LnkgPCBlbmVteS55ICsgZW5lbXkuaGVpZ2h0ICYmCiAgICAgICAgICAgICAgICBidWxsZXQueSArIDEwID4gZW5lbXkueQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIHBsYXllci5idWxsZXRzLnNwbGljZShiSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgZW5lbWllcy5zcGxpY2UoZUluZGV4LCAxKTsKICAgICAgICAgICAgICAgIHNjb3JlICs9IDEwOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9KTsKfQoKZnVuY3Rpb24gZHJhd1Njb3JlKCkgewogICAgY3R4LmZpbGxTdHlsZSA9ICJibGFjayI7CiAgICBjdHguZm9udCA9ICIyMHB4IEFyaWFsIjsKICAgIGN0eC5maWxsVGV4dCgiU2NvcmU6ICIgKyBzY29yZSwgMTAsIDMwKTsKfQoKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIChldmVudCkgPT4gewogICAgaWYgKGV2ZW50LmtleSA9PT0gIkFycm93TGVmdCIgJiYgcGxheWVyLnggPiAwKSBwbGF5ZXIueCAtPSBwbGF5ZXIuc3BlZWQ7CiAgICBpZiAoZXZlbnQua2V5ID09PSAiQXJyb3dSaWdodCIgJiYgcGxheWVyLnggPCBjYW52YXMud2lkdGggLSBwbGF5ZXIud2lkdGgpIHBsYXllci54ICs9IHBsYXllci5zcGVlZDsKICAgIGlmIChldmVudC5rZXkgPT09ICIgIikgcGxheWVyLmJ1bGxldHMucHVzaCh7IHg6IHBsYXllci54ICsgMjIsIHk6IHBsYXllci55IH0pOwp9KTsKCmZ1bmN0aW9uIHVwZGF0ZSgpIHsKICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKICAgIGRyYXdQbGF5ZXIoKTsKICAgIGRyYXdCdWxsZXRzKCk7CiAgICBkcmF3RW5lbWllcygpOwogICAgY2hlY2tDb2xsaXNpb24oKTsKICAgIGRyYXdTY29yZSgpOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZSk7Cn0KdXBkYXRlKCk7
const canvas = document.getElementById("gameCanvas");
const ctx = canvas.getContext("2d");
canvas.width = 800;
canvas.height = 600;
const player = {
x: canvas.width / 2,
y: canvas.height - 50,
width: 50,
height: 50,
color: "blue",
speed: 5,
bullets: []
};
const enemies = [];
let score = 0;
function drawPlayer() {
ctx.fillStyle = player.color;
ctx.fillRect(player.x, player.y, player.width, player.height);
}
function drawBullets() {
ctx.fillStyle = "red";
player.bullets.forEach((bullet, index) => {
ctx.fillRect(bullet.x, bullet.y, 5, 10);
bullet.y -= 5;
if (bullet.y < 0) player.bullets.splice(index, 1);
});
}
function drawEnemies() {
ctx.fillStyle = "green";
enemies.forEach((enemy, index) => {
ctx.fillRect(enemy.x, enemy.y, enemy.width, enemy.height);
enemy.y += 2;
if (enemy.y > canvas.height) {
enemies.splice(index, 1);
}
});
}
function spawnEnemy() {
enemies.push({
x: Math.random() * (canvas.width - 50),
y: 0,
width: 50,
height: 50
});
}
setInterval(spawnEnemy, 1000);
function checkCollision() {
player.bullets.forEach((bullet, bIndex) => {
enemies.forEach((enemy, eIndex) => {
if (
bullet.x < enemy.x + enemy.width &&
bullet.x + 5 > enemy.x &&
bullet.y < enemy.y + enemy.height &&
bullet.y + 10 > enemy.y
) {
player.bullets.splice(bIndex, 1);
enemies.splice(eIndex, 1);
score += 10;
}
});
});
}
function drawScore() {
ctx.fillStyle = "black";
ctx.font = "20px Arial";
ctx.fillText("Score: " + score, 10, 30);
}
document.addEventListener("keydown", (event) => {
if (event.key === "ArrowLeft" && player.x > 0) player.x -= player.speed;
if (event.key === "ArrowRight" && player.x < canvas.width - player.width) player.x += player.speed;
if (event.key === " ") player.bullets.push({ x: player.x + 22, y: player.y });
});
function update() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawPlayer();
drawBullets();
drawEnemies();
checkCollision();
drawScore();
requestAnimationFrame(update);
}
update();