オセロ開発解説 - ゲームロジック

ゲームロジック

オセロのコアロジックは、有効手の計算とコマの反転処理です。プレイヤーと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`で同様のロジックを使用し、ゲームと試行で共有可能。