以下がJavaScriptを使ったインベーダーゲームの実装例です。1つのHTMLファイルにすべてのコードを書いているため、単一のファイルで実行可能です。なお、ゲーム本体の詳細な実装方法については省略させていただきますので、ご了承ください。
```html
<!DOCTYPE html>
<html>
<head>
<title>インベーダーゲーム</title>
</head>
<body>
<canvas id="game-canvas" width="600" height="400"></canvas>
<script>
// 定数定義
const PLAYER_SIZE = 20; // プレイヤーの大きさ
const PLAYER_MOVE_SPEED = 5; // プレイヤーの移動速度
const BULLET_MOVE_SPEED = 10; // 弾の移動速度
const ENEMY_SIZE = 30; // 敵の大きさ
const ENEMY_MOVE_SPEED = 3; // 敵の移動速度
const ENEMY_INTERVAL = 500; // 敵の出現間隔
// 変数定義
let playerX = 250; // プレイヤーの初期位置
let bullets = []; // 弾の配列
let enemies = []; // 敵の配列
let score = 0; // 得点
// ゲーム画面の初期設定
let canvas = document.getElementById('game-canvas');
let ctx = canvas.getContext('2d');
ctx.fillStyle = 'black';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// マウスイベントのリスナー登録
canvas.addEventListener('mousemove', function(event) {
playerX = event.offsetX - PLAYER_SIZE / 2;
});
canvas.addEventListener('click', function(event) {
let bulletX = playerX + PLAYER_SIZE / 2;
let bulletY = canvas.height - PLAYER_SIZE;
let bullet = {x: bulletX, y: bulletY};
bullets.push(bullet);
});
// ゲームループの開始
setInterval(function() {
// ゲーム画面の初期化
ctx.fillStyle = 'black';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// プレイヤーの描画
ctx.fillStyle = 'white';
ctx.fillRect(playerX, canvas.height - PLAYER_SIZE, PLAYER_SIZE, PLAYER_SIZE);
// 弾の移動と描画
for (let i = 0; i < bullets.length; i++) {
let bullet = bullets[i];
ctx.fillStyle = 'red';
ctx.fillRect(bullet.x, bullet.y, 5, 10);
bullet.y -= BULLET_MOVE_SPEED;
}
// 敵の出現と移動
if (Math.random() * 1000 < ENEMY_INTERVAL) {
let enemyX = Math.random() * (canvas.width - ENEMY_SIZE);
let enemyY = 0;
let enemy = {x: enemyX, y: enemyY};
enemies.push(enemy);
}
for (let i = 0; i < enemies.length; i++) {
let enemy = enemies[i];
ctx.fillStyle = 'green';
ctx.fillRect(enemy.x, enemy.y, ENEMY_SIZE, ENEMY_SIZE);
enemy.y += ENEMY_MOVE_SPEED;
}
// 衝突判定
for (let i = 0; i < bullets.length; i++) {
let bullet = bullets[i];
for (let j = 0; j < enemies.length; j++) {
let enemy = enemies[j];
if (bullet.x >= enemy.x && bullet.x <= enemy.x + ENEMY_SIZE && bullet.y >= enemy.y && bullet.y <= enemy.y + ENEMY_SIZE) {
bullets.splice(i, 1);
enemies.splice(j, 1);
score++;
break;
}
}
}
// スコアの表示
ctx.fillStyle = 'white';
ctx.font = '20px Arial';
ctx.fillText('Score: ' + score, 10, 30);
}, 30); // ゲームループの実行間隔
</script>
</body>
</html>
```
ジョークとして、敵機に「JavaScriptはやめましょう」と書いておくことをおすすめします。