ゲームロジック
オセロのコアロジックは、有効手の計算とコマの反転処理です。プレイヤーとAIが交互に手を打ち、ルールに基づいて盤面を更新します。
設計思想
有効手は、相手のコマを少なくとも1つ挟めるマスを探索。8方向(上下左右、斜め)をチェックし、効率的なループで計算。反転処理は、実際にコマを置く前にシミュレーション可能に設計。盤面は2次元配列で管理し、状態変更を最小限に抑えます。
サンプルコード
function getValidMoves(boardState, player) {
const moves = [];
const opponent = player === 'black' ? 'white' : 'black';
for (let row = 0; row < boardSize; row++) {
for (let col = 0; col < boardSize; col++) {
if (!boardState[row][col] && canFlip(boardState, row, col, player, opponent)) {
moves.push({ row, col });
}
}
}
return moves;
}
function canFlip(boardState, row, col, player, opponent) {
const directions = [
[-1, 0], [1, 0], [0, -1], [0, 1],
[-1, -1], [-1, 1], [1, -1], [1, 1]
];
for (const [dr, dc] of directions) {
let r = row + dr, c = col + dc;
let toFlip = [];
while (r >= 0 && r < boardSize && c >= 0 && c < boardSize && boardState[r][c] === opponent) {
toFlip.push([r, c]);
r += dr;
c += dc;
}
if (r >= 0 && r < boardSize && c >= 0 && c < boardSize && boardState[r][c] === player && toFlip.length > 0) {
return true;
}
}
return false;
}
解説
`getValidMoves`は盤面全体を走査し、`canFlip`で各マスの有効性を判定。`canFlip`は8方向を探索し、相手のコマを挟めるか確認。挟める場合、座標を記録し、有効手リストを構築。時間計算量はO(64*8*L)で、Lは方向ごとの最大探索長(最大7)。実際の反転は`flipPieces`や`simulateFlip`で同様のロジックを使用し、ゲームと試行で共有可能。