JavaScriptでゲームを作ってみたいと思ったことはありませんか。
でも、
- 難しそうで何から始めればいいか分からない
- 作り始めても途中で動かなくなって挫折した
- サンプルコードをコピペしただけで終わってしまった
そんな経験がある方も多いと思います。
この記事では、とにかくシンプルなテトリスを題材にして、
「最後まで動くゲームを完成させる」ことを目標にします。
難しい理論やライブラリは使いません。
JavaScriptの基本だけで、実際に遊べるゲームを一緒に作っていきましょう。
まずは完成版で遊んでみよう
この記事のコードを使うと、次のようなゲームが完成します。
- ブロックが上から落ちてくる
- ← → キーで左右に移動できる
- ↓ キーで落下を速められる
- 横一列そろうと消える
- スコアが増える
- 上まで詰まるとゲームオーバー
記事を読みながら「今どこを作っているのか」を意識できるよう、
完成イメージを先に確認してから読み進めるのがおすすめです。
下の画像をクリックすると、今回のシンプルテトリスが実際にプレイ出来ます(PC推奨)。

今回作る「シンプルテトリス」の仕様
今回は初心者向けに、機能をかなり絞っています。
できること
- 盤面サイズ:10×20
- ブロック:1マスのみ(ワンブロック)
- 操作:
- ← →:左右移動
- ↓:落下加速
- 着地したブロックは固定される
- 横1列がそろうと消える
- 1ライン消すごとにスコア +10
あえてやらないこと
- ブロックの回転
- 複数マスの複雑な形
- レベルや演出
最初から全部入りのテトリスを作ろうとすると、
ほぼ確実に途中で挫折します。
まずは
「小さく作って、理解できる形で完成させる」
これが一番の近道です。
ファイル構成
今回使うファイルは、たったの3つです。
- index.html
- style.css
- main.js
それぞれ役割を分けることで、
「どこに何を書いているのか」が分かりやすくなります。
HTML:ゲーム画面を作る(index.html)
まずは画面を作ります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>シンプルテトリス(ワンブロック)</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<main class="wrap">
<h1>シンプルテトリス(ワンブロック)</h1>
<div class="hud">
<div>Score: <b id="score">0</b></div>
<div>Lines: <b id="lines">0</b></div>
<button id="restart" type="button">Restart</button>
</div>
<canvas id="game" width="300" height="600"></canvas>
<p class="help">操作:← → 移動 / ↓ 落下加速</p>
</main>
<script src="main.js"></script>
</body>
</html>
ここで重要なのは canvas 要素です。
この中に、JavaScriptでブロックや盤面を描画します。
また、script タグは bodyの一番下 に置いています。
これは「HTMLが読み込まれてからJavaScriptを実行する」ための、
初心者がつまずきにくい書き方です。
CSS:最低限の見た目を整える(style.css)
次に、見た目を少しだけ整えます。
body{
margin:0;
font-family: system-ui, -apple-system, "Hiragino Kaku Gothic ProN", "Noto Sans JP", sans-serif;
background:#0b1020;
color:#e5e7eb;
}
.wrap{
max-width:720px;
margin:0 auto;
padding:20px;
text-align:center;
}
canvas{
background:#111;
border:2px solid #333;
border-radius:12px;
display:block;
margin:14px auto;
}
.hud{
display:flex;
justify-content:center;
gap:16px;
align-items:center;
flex-wrap:wrap;
margin-top:8px;
color:#cbd5e1;
}
button{
padding:8px 12px;
border-radius:10px;
border:1px solid rgba(255,255,255,.15);
background: rgba(255,255,255,.06);
color:#e5e7eb;
cursor:pointer;
}
.help{
color:#94a3b8;
font-size:13px;
}
黒背景と枠線があるだけで、
それっぽい「ゲーム画面」になります。
CSSはこのくらいで十分です。
JavaScript:ゲームの本体を作る(main.js)
ここからが一番大事な部分です。
盤面を2次元配列で管理する
テトリス系のゲームは、
盤面を 2次元配列 で管理するのが基本です。
const COLS = 10;
const ROWS = 20;
const BLOCK_SIZE = 30;
let board = Array.from(
{ length: ROWS },
() => Array(COLS).fill(0)
);
0は空きマス1はブロックが置かれているマス
この配列が、ゲームの世界そのものになります。
落下中のブロックを用意する
今回は1マスだけのブロックです。
function spawnBlock() {
return {
x: Math.floor(COLS / 2),
y: 0
};
}
画面の中央上からスタートさせています。
ブロックを描画する
Canvasに四角形を描くことで、ブロックを表現します。
function drawCell(x, y, color) {
ctx.fillStyle = color;
ctx.fillRect(
x * BLOCK_SIZE,
y * BLOCK_SIZE,
BLOCK_SIZE,
BLOCK_SIZE
);
}
座標に BLOCK_SIZE を掛けることで、
マス目として表示される仕組みです。
ブロックを落とす仕組み
時間が経つごとに y を1増やせば、
ブロックが下に落ちて見えます。
function canMoveTo(nx, ny) {
if (nx < 0 || nx >= COLS) return false;
if (ny < 0 || ny >= ROWS) return false;
if (board[ny][nx]) return false;
return true;
}
これで、
- 画面外に出ない
- すでに置かれたブロックに重ならない
という判定ができます。
着地したら固定する
下に動けなくなったら、盤面に固定します。
function fixBlock() {
board[block.y][block.x] = 1;
}
固定後は、新しいブロックを出します。
ラインを消す処理
横一列がすべて 1 なら、その行を消します。
function clearLines() {
for (let y = ROWS - 1; y >= 0; y--) {
if (board[y].every(v => v === 1)) {
board.splice(y, 1);
board.unshift(Array(COLS).fill(0));
lines++;
score += 10;
y++;
}
}
}
これが「テトリスらしさ」の正体です。
キーボード操作
document.addEventListener("keydown", (e) => {
if (e.key === "ArrowLeft") {
if (canMoveTo(block.x - 1, block.y)) block.x--;
}
if (e.key === "ArrowRight") {
if (canMoveTo(block.x + 1, block.y)) block.x++;
}
if (e.key === "ArrowDown") {
if (canMoveTo(block.x, block.y + 1)) {
block.y++;
}
}
});
キーを押して反応するだけで、
一気に「ゲームを操作している感覚」が出ます。
ゲームオーバー判定
新しいブロックを出した瞬間に、
すでにそこが埋まっていたらゲームオーバーです。
if (board[block.y][block.x]) {
gameOver = true;
}
これでテトリスとして最低限成立します。
よくある「動かない」原因
初心者がよくつまずくポイントをまとめておきます。
main.jsの読み込みパスが違う- ファイルが別のフォルダにある
- Consoleにエラーが出ている
動かないときは、
まずブラウザの開発者ツール(Console)を確認しましょう。
次にやってみよう
このシンプルテトリスをベースに、
次のような改造ができます。
- 落下スピードを徐々に速くする
- ブロックを2×2にする
- スコア表示を派手にする
- 効果音を追加する
まとめ
- JavaScriptだけでゲームは作れる
- 完璧を目指さなくていい
- 小さく作って、理解して、完成させる
それが、ゲーム制作を続ける一番のコツです。
このシンプルテトリスが、
あなたの「最初の1本」になれば嬉しいです。


