GPT-4oでjavascriptオセロゲーム作ってみた

X
     この記事はプロモーションを含みます
Content

GPT-4oでコーディングしてみる実験

じぴ子

GPT-4oでjavascriptだけで動くオセロをつくってみましたよ

マコト

まぁまぁふつうにうごくやん おもしろいねw

Turn: Black

Score: Black 2 – White 2

ソース
<div id="game">
    <div id="board"></div>
    <div id="info">
        <p id="turn">Turn: <span id="turnPlayer">Black</span></p>
        <p id="score">Score: Black <span id="blackScore">2</span> - White <span id="whiteScore">2</span></p>
    </div>
</div>
<style>
    #game {
        display: flex;
        flex-direction: column;
        align-items: center;
        margin-top: 20px;
    }
    #board {
        display: grid;
        grid-template-columns: repeat(8, 50px);
        grid-template-rows: repeat(8, 50px);
        gap: 2px;
    }
    .cell {
        width: 50px;
        height: 50px;
        background-color: green;
        display: flex;
        justify-content: center;
        align-items: center;
        cursor: pointer;
    }
    .black {
        background-color: black;
        border-radius: 50%;
        width: 40px;
        height: 40px;
    }
    .white {
        background-color: white;
        border-radius: 50%;
        width: 40px;
        height: 40px;
    }
    #info {
        margin-top: 10px;
    }
</style>

<script>
    document.addEventListener('DOMContentLoaded', function () {
        const board = document.getElementById('board');
        const turnPlayer = document.getElementById('turnPlayer');
        const blackScore = document.getElementById('blackScore');
        const whiteScore = document.getElementById('whiteScore');
        let cells = [];
        let currentPlayer = 'black';
        let scores = { black: 2, white: 2 };

        const directions = [
            [0, 1], [1, 0], [0, -1], [-1, 0],
            [1, 1], [-1, -1], [1, -1], [-1, 1]
        ];

        function createBoard() {
            for (let row = 0; row < 8; row++) {
                cells[row] = [];
                for (let col = 0; col < 8; col++) {
                    const cell = document.createElement('div');
                    cell.classList.add('cell');
                    cell.dataset.row = row;
                    cell.dataset.col = col;
                    cell.addEventListener('click', () => handleCellClick(row, col));
                    board.appendChild(cell);
                    cells[row][col] = cell;
                }
            }
            initializeBoard();
        }

        function initializeBoard() {
            placeDisc(3, 3, 'white');
            placeDisc(3, 4, 'black');
            placeDisc(4, 3, 'black');
            placeDisc(4, 4, 'white');
        }

        function placeDisc(row, col, color) {
            const disc = document.createElement('div');
            disc.classList.add(color);
            cells[row][col].appendChild(disc);
            cells[row][col].dataset.color = color;
        }

        function handleCellClick(row, col) {
            if (!isValidMove(row, col, currentPlayer)) {
                return;
            }
            makeMove(row, col, currentPlayer);
            currentPlayer = currentPlayer === 'black' ? 'white' : 'black';
            turnPlayer.textContent = currentPlayer.charAt(0).toUpperCase() + currentPlayer.slice(1);
            updateScore();
            if (currentPlayer === 'white') {
                setTimeout(aiMove, 500);
            }
        }

        function isValidMove(row, col, color) {
            if (cells[row][col].dataset.color) {
                return false;
            }
            return directions.some(([dx, dy]) => {
                return canFlip(row, col, dx, dy, color);
            });
        }

        function canFlip(row, col, dx, dy, color) {
            let x = row + dx;
            let y = col + dy;
            let hasOpponentDisc = false;
            while (isInBounds(x, y)) {
                if (!cells[x][y].dataset.color) {
                    return false;
                } else if (cells[x][y].dataset.color !== color) {
                    hasOpponentDisc = true;
                } else if (hasOpponentDisc) {
                    return true;
                } else {
                    return false;
                }
                x += dx;
                y += dy;
            }
            return false;
        }

        function isInBounds(x, y) {
            return x >= 0 && x < 8 && y >= 0 && y < 8;
        }

        function makeMove(row, col, color) {
            placeDisc(row, col, color);
            directions.forEach(([dx, dy]) => {
                if (canFlip(row, col, dx, dy, color)) {
                    flipDiscs(row, col, dx, dy, color);
                }
            });
        }

        function flipDiscs(row, col, dx, dy, color) {
            let x = row + dx;
            let y = col + dy;
            while (cells[x][y].dataset.color !== color) {
                cells[x][y].dataset.color = color;
                cells[x][y].firstChild.className = color;
                x += dx;
                y += dy;
            }
        }

        function updateScore() {
            let black = 0;
            let white = 0;
            for (let row = 0; row < 8; row++) {
                for (let col = 0; col < 8; col++) {
                    if (cells[row][col].dataset.color === 'black') {
                        black++;
                    } else if (cells[row][col].dataset.color === 'white') {
                        white++;
                    }
                }
            }
            scores.black = black;
            scores.white = white;
            blackScore.textContent = black;
            whiteScore.textContent = white;
        }

        function aiMove() {
            let validMoves = [];
            for (let row = 0; row < 8; row++) {
                for (let col = 0; col < 8; col++) {
                    if (isValidMove(row, col, currentPlayer)) {
                        validMoves.push([row, col]);
                    }
                }
            }
            if (validMoves.length > 0) {
                const [row, col] = validMoves[Math.floor(Math.random() * validMoves.length)];
                makeMove(row, col, currentPlayer);
                currentPlayer = currentPlayer === 'black' ? 'white' : 'black';
                turnPlayer.textContent = currentPlayer.charAt(0).toUpperCase() + currentPlayer.slice(1);
                updateScore();
            }
        }

        createBoard();
    });
</script>
  • URLをコピーしました!

この記事を書いた人

makotoのアバター makoto Blogger&YouTuber

サーバー管理者として17年ほど仕事でサーバー触ってました。
www,mail,dns,sql各鯖をすべてFreeBSDで運用してましたが現世ではかなりレアなタイプになるみたいですね笑

viやシェルスクリプトとかperlとかgccとかFreeBSDとか実はbashよりtcshが好きとか時々寝ぼけるのは
その名残でしょう。

今まで縁の下の力持ち的な他人のためにプログラムを書き他人のためにサーバー構築し他人のためにWEBサイトを創る的な世界から
自分の好きなことに集中できる環境は実に気持ち良いですね。
現役は引退済みなので難しいことはやりませんしやれません。

現在 ほぼ自由人。

Content