ブロック崩し

操作方法

マウスを動かすことで、パドルがカーソルに追従します。ボールを跳ね返してブロックを壊してください。


ここから↓

<!DOCTYPE html>

<html lang="ja">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>ブロック崩しゲーム</title>

<style>

body { font-family: Arial, sans-serif; text-align: center; }

canvas { background: #eee; display: block; margin: 0 auto; }

#score { font-size: 20px; margin: 20px; }

</style>

</head>

<body>

<h1>ブロック崩しゲーム</h1>

<canvas id="gameCanvas" width="480" height="320"></canvas>

<div id="score">スコア: 0</div>

<button onclick="startGame()">再スタート</button>

<script>

const canvas = document.getElementById("gameCanvas");

const ctx = canvas.getContext("2d");


let ballRadius = 10;

let x = canvas.width / 2;

let y = canvas.height - 30;

let dx = 2;

let dy = -2;

let paddleHeight = 10;

let paddleWidth = 75;

let paddleX;

let rightPressed = false;

let leftPressed = false;

let brickRowCount = 5;

let brickColumnCount = 3;

let brickWidth = 75;

let brickHeight = 20;

let brickPadding = 10;

let brickOffsetTop = 30;

let brickOffsetLeft = 30;

let score = 0;

let bricks = [];


// ブロックの初期化

for (let c = 0; c < brickColumnCount; c++) {

bricks[c] = [];

for (let r = 0; r < brickRowCount; r++) {

bricks[c][r] = { x: 0, y: 0, status: 1 };

}

}


function startGame() {

document.getElementById("score").innerText = "スコア: 0";

score = 0;

x = canvas.width / 2;

y = canvas.height - 30;

dx = 2;

dy = -2;


// パドルの初期位置

paddleX = (canvas.width - paddleWidth) / 2;


// イベントリスナーの追加

document.addEventListener("mousemove", mouseMoveHandler);

draw();

}


function drawBall() {

ctx.beginPath();

ctx.arc(x, y, ballRadius, 0, Math.PI * 2);

ctx.fillStyle = "#0095DD";

ctx.fill();

ctx.closePath();

}


function drawPaddle() {

ctx.beginPath();

ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);

ctx.fillStyle = "#0095DD";

ctx.fill();

ctx.closePath();

}


function drawBricks() {

for (let c = 0; c < brickColumnCount; c++) {

for (let r = 0; r < brickRowCount; r++) {

if (bricks[c][r].status === 1) {

const brickX = c * (brickWidth + brickPadding) + brickOffsetLeft;

const 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 = "#0095DD";

ctx.fill();

ctx.closePath();

}

}

}

}


function collisionDetection() {

for (let c = 0; c < brickColumnCount; c++) {

for (let r = 0; r < brickRowCount; r++) {

const b = bricks[c][r];

if (b.status === 1) {

if (x > b.x && x < b.x + brickWidth && y > b.y && y < b.y + brickHeight) {

dy = -dy;

b.status = 0; // ブロックを消す

score++;

document.getElementById("score").innerText = "スコア: " + score;

if (score === brickRowCount * brickColumnCount) {

alert("おめでとうございます!すべてのブロックを壊しました!");

document.location.reload();

}

}

}

}

}

}


function draw() {

ctx.clearRect(0, 0, canvas.width, canvas.height);

drawBricks();

drawBall();

drawPaddle();

collisionDetection();


if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {

dx = -dx;

}

if (y + dy < ballRadius) {

dy = -dy;

} else if (y + dy > canvas.height - ballRadius) {

if (x > paddleX && x < paddleX + paddleWidth) {

dy = -dy;

} else {

alert("ゲームオーバー");

document.location.reload();

}

}


x += dx;

y += dy;


requestAnimationFrame(draw);

}


function mouseMoveHandler(e) {

const relativeX = e.clientX - canvas.getBoundingClientRect().left;

if (relativeX > 0 && relativeX < canvas.width) {

paddleX = relativeX - paddleWidth / 2;

}

}


window.onload = startGame;

</script>

</body>

</html>

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る