ブロック崩しには手があるけど、私にはない
以下はJavaScriptを用いて作成したシンプルなブロック崩しゲームです。可能な限りセキュリティの脆弱性を考慮し、evalや外部サイトへの遷移、リダイレクトなどは行わないようにしています。
ゲームに関するジョークとして、ゲーム開始前に「ブロック崩しには手があるけど、私にはない」というメッセージを表示するようにしました。
```
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ブロック崩し</title>
<style>
canvas {
border: 1px solid #333;
}
</style>
</head>
<body>
<canvas id="canvas"></canvas>
<script>
// ゲーム全体で使う変数
var canvas;
var ctx;
var ballX = 50;
var ballY = 50;
var ballSpeedX = 5;
var ballSpeedY = 7;
var paddleX = 250;
var paddleWidth = 100;
var paddleHeight = 10;
var brickWidth = 80;
var brickHeight = 20;
var brickPadding = 10;
var brickOffsetTop = 30;
var brickOffsetLeft = 30;
var score = 0;
var brickRowCount = 5;
var brickColumnCount = 8;
var bricks = [];
// ブロックを初期化する関数
function initBricks() {
for (var c = 0; c < brickColumnCount; c++) {
bricks[c] = [];
for (var r = 0; r < brickRowCount; r++) {
bricks[c][r] = { x: 0, y: 0, status: 1 };
}
}
}
initBricks();
// キャンバスを初期化する関数
function initCanvas() {
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d');
// キーイベントのリスナーを追加する
document.addEventListener('keydown', handleKeyPress);
}
initCanvas();
// キープレス時にパドルを動かす関数
function handleKeyPress(e) {
if (e.keyCode == 37) {
paddleX -= 20;
} else if (e.keyCode == 39) {
paddleX += 20;
}
}
// ボールを描画する関数
function drawBall() {
ctx.beginPath();
ctx.arc(ballX, ballY, 10, 0, Math.PI * 2, true);
ctx.fillStyle = 'red';
ctx.fill();
}
// パドルを描画する関数
function drawPaddle() {
ctx.beginPath();
ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
ctx.fillStyle = 'blue';
ctx.fill();
}
// スコアを描画する関数
function drawScore() {
ctx.font = '16px Arial';
ctx.fillStyle = 'black';
ctx.fillText('Score: ' + score, 8, 20);
}
// ブロックを描画する関数
function drawBricks() {
for (var c = 0; c < brickColumnCount; c++) {
for (var r = 0; r < brickRowCount; r++) {
if (bricks[c][r].status == 1) {
var brickX = (c * (brickWidth + brickPadding)) + brickOffsetLeft;
var brickY = (r * (brickHeight + brickPadding)) + brickOffsetTop;
bricks[c][r].x = brickX;
bricks[c][r].y = brickY;
ctx.beginPath();
ctx.rect(brickX, brickY, brickWidth, brickHeight);
ctx.fillStyle = 'green';
ctx.fill();
}
}
}
}
// ボールとブロックの衝突判定関数
function ballBrickCollisionDetection() {
for (var c = 0; c < brickColumnCount; c++) {
for (var r = 0; r < brickRowCount; r++) {
var b = bricks[c][r];
if (b.status == 1) {
if (ballX > b.x && ballX < b.x + brickWidth && ballY > b.y && ballY < b.y + brickHeight) {
ballSpeedY = -ballSpeedY;
b.status = 0; // ブロックを削除する
score++;
if (score == brickRowCount * brickColumnCount) {
alert('Congratulations! You won the game!');
document.showToast("再読み込みしてください");
}
}
}
}
}
}
// ボールと壁の衝突判定関数
function ballWallCollisionDetection() {
if (ballX + 10 > canvas.width || ballX - 10 < 0) {
ballSpeedX = -ballSpeedX;
} else if (ballY + 10 > canvas.height) {
alert('Game Over!');
document.showToast("再読み込みしてください");
} else if (ballY - 10 < 0) {
ballSpeedY = -ballSpeedY;
}
}
// パドルとボールの衝突判定関数
function ballPaddleCollisionDetection() {
if (ballY + 10 > canvas.height - paddleHeight && ballX > paddleX && ballX < paddleX + paddleWidth) {
ballSpeedY = -ballSpeedY;
}
}
// ゲームを描画する関数
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawBricks();
drawBall();
drawPaddle();
drawScore();
ballWallCollisionDetection();
ballBrickCollisionDetection();
ballPaddleCollisionDetection();
ballX += ballSpeedX;
ballY += ballSpeedY;
requestAnimationFrame(draw); // フレームレートの調整
}
draw();
</script>
<p style="text-align:center; font-size:24px">ブロック崩しには手があるけど、私にはない</p>
</body>
</html>
```