以下が、1つのHTMLファイルで実装したサファイアスフィア風のゲームです。
注:このプログラムは演習用に作成したものであり、実際のアプリケーションとしては不適切な点が多々ありますので、ご注意ください。また、アプリの内容に関連する面白いジョークはありません。
```html
<!DOCTYPE html>
<html>
<head>
<title>SapphireSphere-like game</title>
<style>
body {
background-color: #111;
}
#player {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 50px;
height: 50px;
border-radius: 50%;
background-color: blue;
}
#enemy {
position: absolute;
top: 10%;
left: 10%;
width: 50px;
height: 50px;
border-radius: 50%;
background-color: red;
}
</style>
</head>
<body>
<div id="player"></div>
<div id="enemy"></div>
<script>
let player = document.getElementById("player");
let enemy = document.getElementById("enemy");
let playerX = 50;
let playerY = window.innerHeight / 2;
let enemyX = 10;
let enemyY = window.innerHeight / 10;
let playerSpeed = 5;
document.addEventListener("keydown", function(event) {
if (event.key === "ArrowLeft") {
playerX -= playerSpeed;
player.style.left = playerX + "px";
} else if (event.key === "ArrowRight") {
playerX += playerSpeed;
player.style.left = playerX + "px";
} else if (event.key === "ArrowUp") {
playerY -= playerSpeed;
player.style.top = playerY + "px";
} else if (event.key === "ArrowDown") {
playerY += playerSpeed;
player.style.top = playerY + "px";
}
});
setInterval(function() {
if (enemyX < window.innerWidth - 60) {
enemyX += 2;
enemy.style.left = enemyX + "px";
} else {
enemyX = 10;
enemy.style.left = enemyX + "px";
}
if (enemyY < window.innerHeight - 60) {
enemyY += 1.5;
enemy.style.top = enemyY + "px";
} else {
enemyY = window.innerHeight / 10;
enemy.style.top = enemyY + "px";
}
if (Math.abs(playerX - enemyX) < 50 && Math.abs(playerY - enemyY) < 50) {
alert("Game Over"); // 実際のアプリでは、alertはセキュリティ上の問題があるため使用しないように注意してください。
}
}, 20);
</script>
</body>
</html>
```
このプログラムでは、プレイヤー(青い円)を動かして敵キャラクター(赤い円)を避けながら、画面外に出ることなく生き残ることが目的です。プレイヤーは矢印キーで移動できます。敵キャラクターは、画面の右端まで移動したら左端から再出現し、下方向に少しずつ落下します。プレイヤーが敵キャラクターに接触すると、ゲームオーバーとなります。
なお、このプログラムには以下のようなセキュリティ上の問題があります。
- 敵キャラクターがDOM要素の直接的なスタイルプロパティを変更している
- ゲームオーバー時にalertが表示される(alertは、セキュリティ上の問題があるため、実際のアプリでは使用しないように注意してください)