五子棋

完整的五子棋游戏的HTML页面代码,满足你所有的要求。这个页面包括一个400×400像素的画布,玩家可以通过点击画布下棋,黑棋先行,并且会在一方连成五个相同的棋子时显示获胜信息。

设计说明:

  1. HTML结构:
    • 包含一个 canvas 元素,用于绘制五子棋棋盘和棋子。
    • 包含一个 div 元素 (id="message"),用于显示游戏消息(如获胜信息)。
  2. CSS样式:
    • 设置了页面的基本样式,包括背景颜色、字体和布局。
    • 使用 flex 布局使内容居中对齐。
    • 为 canvas 添加了背景颜色和阴影效果。
    • 设置了提示信息的字体大小和居中显示。
  3. JavaScript功能:
    • 绘制15×15的棋盘网格。
    • 使用 arc 方法在棋盘交界处绘制圆形棋子。
    • 处理用户点击事件,根据当前玩家放置棋子。
    • 检查是否有玩家连成五个相同的棋子,如果有则显示获胜信息并结束游戏。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>五子棋游戏</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            background-color: #f0f0f0;
            font-family: Arial, sans-serif;
        }
        .game-container {
            text-align: center;
        }
        canvas {
            background-color: #f3d2b5;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
        }
        #message {
            font-size: 20px;
            margin-top: 20px;
        }
    </style>
</head>
<body>
    <div class="game-container">
        <canvas id="goBoard" width="400" height="400"></canvas>
        <div id="message"></div>
    </div>

    <script>
        const canvas = document.getElementById('goBoard');
        const ctx = canvas.getContext('2d');
        const boardSize = 15; // 15x15 棋盘
        const cellSize = canvas.width / (boardSize - 1);
        let currentPlayer = 'black'; // 黑棋先行
        let board = Array.from({ length: boardSize }, () => Array(boardSize).fill(null));
        let gameEnded = false;

        function drawBoard() {
            for (let i = 0; i < boardSize; i++) {
                ctx.beginPath();
                ctx.moveTo(i * cellSize, 0);
                ctx.lineTo(i * cellSize, canvas.height);
                ctx.stroke();

                ctx.beginPath();
                ctx.moveTo(0, i * cellSize);
                ctx.lineTo(canvas.width, i * cellSize);
                ctx.stroke();
            }
        }

        function drawStone(x, y, color) {
            ctx.beginPath();
            ctx.arc(x, y, cellSize / 2 - 5, 0, Math.PI * 2);
            ctx.fillStyle = color;
            ctx.fill();
        }

        function getCellPosition(event) {
            const rect = canvas.getBoundingClientRect();
            const x = event.clientX - rect.left;
            const y = event.clientY - rect.top;
            return {
                row: Math.round(y / cellSize),
                col: Math.round(x / cellSize)
            };
        }

        function checkWin(row, col, player) {
            const directions = [
                { dx: 1, dy: 0 },  // 水平
                { dx: 0, dy: 1 },  // 垂直
                { dx: 1, dy: 1 },  // 斜线 /
                { dx: 1, dy: -1 }  // 斜线 \
            ];

            for (const direction of directions) {
                let count = 1;
                for (let i = 1; i < 5; i++) {
                    const newRow = row + direction.dy * i;
                    const newCol = col + direction.dx * i;
                    if (newRow >= 0 && newRow < boardSize && newCol >= 0 && newCol < boardSize && board[newRow][newCol] === player) {
                        count++;
                    } else {
                        break;
                    }
                }
                for (let i = 1; i < 5; i++) {
                    const newRow = row - direction.dy * i;
                    const newCol = col - direction.dx * i;
                    if (newRow >= 0 && newRow < boardSize && newCol >= 0 && newCol < boardSize && board[newRow][newCol] === player) {
                        count++;
                    } else {
                        break;
                    }
                }
                if (count >= 5) {
                    return true;
                }
            }
            return false;
        }

        function placeStone(row, col) {
            if (board[row][col] !== null || gameEnded) return;

            board[row][col] = currentPlayer;
            drawStone((col + 0.5) * cellSize, (row + 0.5) * cellSize, currentPlayer);

            if (checkWin(row, col, currentPlayer)) {
                document.getElementById('message').innerText = `${currentPlayer === 'black' ? '黑棋' : '白棋'} 获胜!`;
                gameEnded = true;
                return;
            }

            currentPlayer = currentPlayer === 'black' ? 'white' : 'black';
        }

        canvas.addEventListener('click', function(event) {
            const { row, col } = getCellPosition(event);
            placeStone(row, col);
        });

        drawBoard();
    </script>
</body>
</html>

No responses yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注