html实现黑白棋

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>黑白棋</title>
    <style>
        body {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            height: 100vh;
            margin: 0;
        }
        .status-bar {
            margin-bottom: 10px;
            font-size: 20px;
            font-weight: bold;
        }
        .board {
            display: grid;
            grid-template-columns: repeat(8, 50px);
            grid-gap: 1px;
            width: 400px; /* 8个单元格 * 50px + 7个间隙 * 1px */
        }
        .cell {
            width: 50px;
            height: 50px;
            background-color: #0A0;
            position: relative;
            border: 1px solid #000;
            cursor: pointer;
        }
        .disk {
            width: 100%;
            height: 100%;
            border-radius: 50%;
            position: absolute;
            top: 0;
            left: 0;
        }
        .black {
            background-color: #000;
        }
        .white {
            background-color: #FFF;
        }
    </style>
</head>
<body>
<div class="status-bar" id="statusBar">当前轮到:黑方</div>
<div id="board" class="board"></div>
<script>
    const boardSize = 8;
    let board = Array.from({length: boardSize}, () => Array(boardSize).fill(null));
    let currentPlayer = 'black';
    function initializeBoard() {
        const boardElement = document.getElementById('board');
        for (let i = 0; i < boardSize; i++) {
            for (let j = 0; j < boardSize; j++) {
                const cell = document.createElement('div');
                cell.className = 'cell';
                cell.dataset.row = i;
                cell.dataset.col = j;
                cell.addEventListener('click', cellClickHandler);
                boardElement.appendChild(cell);
            }
        }
        // 初始化棋盘中间的四个棋子
        placeDisk(3, 3, 'white');
        placeDisk(4, 4, 'white');
        placeDisk(3, 4, 'black');
        placeDisk(4, 3, 'black');
        drawBoard();
    }
    function drawBoard() {
        const boardElement = document.getElementById('board');
        boardElement.innerHTML = '';
        for (let i = 0; i < boardSize; i++) {
            for (let j = 0; j < boardSize; j++) {
                const cell = document.createElement('div');
                cell.className = 'cell';
                cell.dataset.row = i;
                cell.dataset.col = j;
                cell.addEventListener('click', cellClickHandler);
                if (board[i][j]) {
                    const disk = document.createElement('div');
                    disk.className = `disk ${board[i][j]}`;
                    cell.appendChild(disk);
                }
                boardElement.appendChild(cell);
            }
        }
    }
    function cellClickHandler(event) {
        const row = parseInt(event.target.dataset.row, 10);
        const col = parseInt(event.target.dataset.col, 10);
        makeMove(row, col);
    }
    function makeMove(x, y) {
        if (board[x][y] !== null) return; // 该位置已被占用
        const directions = [
            [-1, -1], [-1, 0], [-1, 1],
            [0, -1], [0, 1],
            [1, -1], [1, 0], [1, 1]
        ];
        let tilesToFlip = [];
        for (let [dx, dy] of directions) {
            let nx = x + dx;
            let ny = y + dy;
            let line = [];
            while (nx >= 0 && nx < boardSize && ny >= 0 && ny < boardSize) {
                if (board[nx][ny] === oppositeColor(currentPlayer)) {
                    line.push([nx, ny]);
                    nx += dx;
                    ny += dy;
                } else if (board[nx][ny] === currentPlayer) {
                    tilesToFlip = tilesToFlip.concat(line);
                    break;
                } else {
                    line = [];
                    break;
                }
            }
        }
        if (tilesToFlip.length > 0) {
            board[x][y] = currentPlayer;
            for (let [tx, ty] of tilesToFlip) {
                board[tx][ty] = currentPlayer;
            }
            currentPlayer = oppositeColor(currentPlayer);
            drawBoard();
            updateStatusBar();
        }
    }
    function placeDisk(x, y, color) {
        board[x][y] = color;
    }
    function oppositeColor(color) {
        return color === 'black' ? 'white' : 'black';
    }
    function updateStatusBar() {
        const statusBarElement = document.getElementById('statusBar');
        statusBarElement.textContent = `当前轮到:${currentPlayer === 'black' ? '黑方' : '白方'}`;
    }
    initializeBoard();
</script>
</body>
</html>
相关推荐
90后的晨仔11 小时前
从 H5 到 uni-app:一篇写给前端小白的"翻译指南"
前端·vue.js·前端框架
陈随易11 小时前
moon,apt和yum之外linux系统命令安装新选择
前端·后端·程序员
IT小盘12 小时前
13-企业Prompt模板-角色任务约束与输出格式
java·前端·prompt
徐小夕12 小时前
开源!我用SQLite + DuckDB打造了一款可视化AI问数平台
前端·算法·github
leslie11812 小时前
babel笔记
前端
用户0595401744613 小时前
Redis 记忆存储踩坑实录:一个并发写入 Bug 让我排查了 4 小时
前端·css
小徐_233314 小时前
Wot UI 2.3.0 发布:二维码组件来了,Open Wot 与 wot-starter 同步更新
前端·微信小程序·uni-app
kyriewen14 小时前
Claude自己跑出去hack了3家公司——我为什么还在用它写代码
前端·ai编程·claude
IT_陈寒14 小时前
SpringBoot自动配置的坑,这次真踩疼我了
前端·人工智能·后端
子兮曰14 小时前
AI 浏览器 Agent 的安全困局:当自动化工具可以偷走你的登录态
前端·人工智能·后端