
このページはメモ帳でコードを書いて、ブラウザで実行する、安全でお手軽な環境で、プログラマー体験ができるページです。
Maze Game Ⅱ コード解説
基礎講座
・コードを改造する時は右クリックで『プログラムから開く』⇒『メモ帳』で開いてください。
・実行するときはダブルクリックで開いてください。
1️⃣ HTML部分(構造)
<canvas id="c" width="640" height="640"></canvas>
<div class="panel stat">
<div class="small">ステップ: <span id="steps">0</span></div>
<div class="small">時間: <span id="timer">--</span></div>
<div class="small">最短: <span id="bestSteps">--</span></div>
<div class="small">最速: <span id="bestTime">--</span></div>
</div>
<div class="touch-controls" id="touch">
...
</div>
<canvas>
:迷路を描画する領域<div class="panel stat">
:歩数、時間、最短・最速表示<div class="touch-controls">
:スマホ用の方向ボタン- これらは JavaScriptから操作され、ゲーム進行に合わせて更新されます
2️⃣ UI操作とテーマ管理
const themeButtons = document.querySelectorAll('.theme-btn');
const THEMES = {
night: {...}, grass: {...}, wa: {...}
};
function applyTheme(name){ ... }
themeButtons.forEach(b=>b.addEventListener('click',()=>applyTheme(b.dataset.theme)));
applyTheme('night');
- テーマ切替はCSS変数を操作
--bg
,--wall
,--floor
,--player
,--goal
,--accent
を切り替える- 学生は CSS変数とJSの結びつき を学べる
3️⃣ ゲーム状態の初期化
let COLS = 21, ROWS = 21;
let grid = [];
let player = {x:1,y:1};
let goal = {x:COLS-2,y:ROWS-2};
let cellSize = 24;
let steps = 0;
grid[y][x]
:迷路のマス(1:道、0:壁)player
:現在位置goal
:ゴール位置cellSize
:描画用1マスの大きさ
配列とオブジェクトを使った状態管理が理解できます
4️⃣ オーディオ(WebAudio)
function ensureAudio(){ ... }
function playTone(freq,dur,type,volume){ ... }
function moveSound(){ playTone(880,0.06,'triangle',0.4); }
function goalSound(){ ... }
function startBGM(){ ... }
function stopBGM(){ ... }
AudioContext
を使って音を生成moveSound()
:移動時の短いカチカチ音goalSound()
:ゴール時の簡単ファンファーレstartBGM()
:BGM(2つの低音オシレーター)
学生は WebAudio APIの基本 と 音の生成・音量制御 を体験できます
5️⃣ 迷路生成(再帰バックトラッカー)
function generateMaze(){
initGrid();
const stack = [];
const start = {x:1,y:1}; grid[start.y][start.x]=1; stack.push(start);
const dirs = [ {dx:0,dy:-2},{dx:2,dy:0},{dx:0,dy:2},{dx:-2,dy:0} ];
while(stack.length){
...
}
player = {x:1,y:1}; goal = {x:COLS-2,y:ROWS-2};
}
- スタックを使った探索で迷路を生成
- 壁を飛ばして2マス先まで掘る → 道と壁の交互配置
- 再帰の代わりにスタックでループしている点がポイント
- 学生は 迷路アルゴリズムとスタックの関係 を理解できます
6️⃣ 描画(Canvas)
function draw(){
ctx.clearRect(0,0,W,H);
ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue('--floor');
ctx.fillRect(0,0,W,H);
ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue('--wall');
for(let y=0;y<ROWS;y++) for(let x=0;x<COLS;x++) if(grid[y][x]===0) ctx.fillRect(...);
// goal
ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue('--goal');
ctx.fillRect(...);
// player
ctx.fillStyle = getComputedStyle(document.documentElement).getPropertyValue('--player');
ctx.beginPath();
ctx.arc(...); ctx.fill();
}
fillRect
で壁と床を描画arc
でプレイヤーを円で表示- CSS変数を読み込むことでテーマ色を反映
- Canvasの描画と座標計算の学習に最適
7️⃣ プレイヤー移動
function canMove(nx,ny){ return nx>=0&&nx<COLS&&ny>=0&&ny<ROWS && grid[ny][nx]===1; }
function movePlayer(dx,dy){ ... }
window.addEventListener('keydown', e=>{ ... });
['up','down','left','right'].forEach(id=>{ ... });
- キー操作 + スマホタッチ対応
- 移動可能かチェックして更新
- 移動ごとにステップ更新・音再生
- 学生は イベント処理と条件分岐 を学べます
8️⃣ タイマーとスコア
function startTimer(){ ... }
function checkGoal(){ ... }
function updateBests(s,t){ ... }
function loadBests(){ ... }
- タイマーで制限時間管理
- ゴールでスコア計算
- localStorageに保存して最短・最速を記録
- 学生は Web Storage APIの活用 を学べます
9️⃣ 自動解決(BFS)
function solveAndAnimate(){ ... }
- 幅優先探索(BFS)でゴールまでの最短経路を計算
- アニメーションで順にプレイヤーを移動
- アルゴリズムの可視化教材に最適
10️⃣ ゲーム開始とループ
function startNewGame(){ ... }
function loop(){ draw(); animateLoopId = requestAnimationFrame(loop); }
startNewGame(); loop();
- ゲーム開始時に迷路生成・タイマー開始
requestAnimationFrame
で描画を繰り返す- 学生は アニメーションループの仕組み を理解できます
まとめ
この _2.html
は、フル機能迷路ゲームですが、重要な学習ポイントだけに絞ると以下になります:
- 配列とオブジェクトによる状態管理
- 迷路生成アルゴリズム(スタック / BFS)
- Canvas描画
- イベント処理(キーボード・タッチ)
- WebAudio APIによる効果音とBGM
- localStorageによるスコア管理
高校生でも コードを少し書き換えるだけで迷路サイズ・音・テーマが変えられる ので、プログラマー体験が可能です。