状態管理
ゲーム状態をローカルストレージで保存・復元し、ユーザー操作とゲーム進行を同期。状態遷移を明確に管理し、堅牢な体験を提供します。
設計思想
状態は`gameState`(menu, countdown, playing, flipping, ended)、盤面(`board`)、現在のプレイヤー(`currentPlayer`)、プレイヤーの色(`playerColor`)、AIレベル(`aiLevel`)で構成。ローカルストレージにJSONで保存し、ページリロード時に復元。状態遷移はイベント駆動で、`canvas`クリックやボタン操作で制御。
サンプルコード
function saveBoard() {
const gameData = { board, currentPlayer, playerColor, aiLevel };
localStorage.setItem('othelloGame', JSON.stringify(gameData));
}
function loadBoard() {
const savedData = localStorage.getItem('othelloGame');
if (savedData) {
const data = JSON.parse(savedData);
board = data.board;
currentPlayer = data.currentPlayer;
playerColor = data.playerColor;
aiLevel = data.aiLevel;
drawBoard();
}
}
document.getElementById('backButton').addEventListener('click', () => {
gameState = 'menu';
document.getElementById('menu').style.display = 'block';
document.getElementById('backButton').style.display = 'none';
document.getElementById('message').textContent = '';
initBoard();
flippingPieces = [];
animationFrame = 0;
drawBoard();
localStorage.removeItem('othelloGame');
});
解説
`saveBoard`はゲーム状態をJSONにシリアライズし、ローカルストレージに保存。`loadBoard`は復元時に盤面を再描画。状態遷移は`gameState`で管理し、例えば`flipping`中にクリックを無効化。`backButton`の処理は状態をリセットし、ストレージをクリア。イベントリスナーは非同期操作(例:AIの`setTimeout`)と同期し、ユーザー体験を安定化。ストレージ使用量は約1KBで、軽量かつ効率的。