当前位置: 首页 > news >正文

网页五子棋小游戏

以下是一个使用 JavaScript 实现的简单五子棋游戏示例,该示例结合 HTML 和 CSS 来构建游戏界面,实现了基本的落子、胜负判断等功能。

代码示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>五子棋游戏</title>
    <style>
        #board {
            position: relative;
            width: 450px;
            height: 450px;
            border: 1px solid #000;
            background-color: #f0d9b5;
        }

        .piece {
            position: absolute;
            width: 20px;
            height: 20px;
            border-radius: 50%;
            margin: -10px 0 0 -10px;
        }

        .black {
            background-color: #000;
        }

        .white {
            background-color: #fff;
            border: 1px solid #000;
        }
    </style>
</head>

<body>
    <div id="board"></div>
    <script>
        // 棋盘大小
        const BOARD_SIZE = 15;
        // 每个格子的大小
        const CELL_SIZE = 30;
        // 棋盘二维数组,用于记录落子情况
        const board = Array.from({ length: BOARD_SIZE }, () => Array(BOARD_SIZE).fill(0));
        // 当前玩家,1 表示黑棋,2 表示白棋
        let currentPlayer = 1;
        // 获取棋盘元素
        const boardElement = document.getElementById('board');

        // 初始化棋盘
        function initBoard() {
            for (let i = 0; i < BOARD_SIZE; i++) {
                for (let j = 0; j < BOARD_SIZE; j++) {
                    const x = j * CELL_SIZE + CELL_SIZE / 2;
                    const y = i * CELL_SIZE + CELL_SIZE / 2;
                    const piece = document.createElement('div');
                    piece.classList.add('piece');
                    piece.style.left = `${x}px`;
                    piece.style.top = `${y}px`;
                    boardElement.appendChild(piece);
                }
            }
        }

        // 落子
        function placePiece(x, y) {
            if (board[x][y] === 0) {
                board[x][y] = currentPlayer;
                const piece = document.createElement('div');
                piece.classList.add('piece', currentPlayer === 1 ? 'black' : 'white');
                piece.style.left = `${y * CELL_SIZE + CELL_SIZE / 2}px`;
                piece.style.top = `${x * CELL_SIZE + CELL_SIZE / 2}px`;
                boardElement.appendChild(piece);
                if (checkWin(x, y)) {
                    alert(`${currentPlayer === 1 ? '黑棋' : '白棋'}获胜!`);
                    resetGame();
                } else {
                    currentPlayer = 3 - currentPlayer; // 切换玩家
                }
            }
        }

        // 检查是否获胜
        function checkWin(x, y) {
            const directions = [
                [1, 0], [0, 1], [1, 1], [1, -1]
            ];
            for (const [dx, dy] of directions) {
                let count = 1;
                // 正向检查
                for (let i = 1; i < 5; i++) {
                    const newX = x + i * dx;
                    const newY = y + i * dy;
                    if (newX >= 0 && newX < BOARD_SIZE && newY >= 0 && newY < BOARD_SIZE && board[newX][newY] === currentPlayer) {
                        count++;
                    } else {
                        break;
                    }
                }
                // 反向检查
                for (let i = 1; i < 5; i++) {
                    const newX = x - i * dx;
                    const newY = y - i * dy;
                    if (newX >= 0 && newX < BOARD_SIZE && newY >= 0 && newY < BOARD_SIZE && board[newX][newY] === currentPlayer) {
                        count++;
                    } else {
                        break;
                    }
                }
                if (count >= 5) {
                    return true;
                }
            }
            return false;
        }

        // 重置游戏
        function resetGame() {
            for (let i = 0; i < BOARD_SIZE; i++) {
                for (let j = 0; j < BOARD_SIZE; j++) {
                    board[i][j] = 0;
                }
            }
            currentPlayer = 1;
            while (boardElement.firstChild) {
                boardElement.removeChild(boardElement.firstChild);
            }
            initBoard();
        }

        // 监听棋盘点击事件
        boardElement.addEventListener('click', (event) => {
            const rect = boardElement.getBoundingClientRect();
            const x = Math.floor((event.clientY - rect.top) / CELL_SIZE);
            const y = Math.floor((event.clientX - rect.left) / CELL_SIZE);
            if (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE) {
                placePiece(x, y);
            }
        });

        // 初始化棋盘
        initBoard();
    </script>
</body>

</html>

代码解释

  1. HTML 部分

    • 创建一个 div 元素作为棋盘,其 idboard
    • 引入外部的 CSS 样式,用于设置棋盘和棋子的样式。
  2. CSS 部分

    • #board:设置棋盘的大小、边框和背景颜色。
    • .piece:设置棋子的基本样式,包括绝对定位、大小和圆角。
    • .black.white:分别设置黑棋和白棋的颜色。
  3. JavaScript 部分

    • BOARD_SIZECELL_SIZE:定义棋盘的大小和每个格子的大小。
    • board:二维数组,用于记录棋盘上每个位置的落子情况,0 表示空位,1 表示黑棋,2 表示白棋。
    • currentPlayer:当前玩家,初始为黑棋(1)。
    • initBoard:初始化棋盘,创建所有的格子。
    • placePiece:在指定位置落子,更新棋盘数组和界面,检查是否获胜,如果获胜则弹出提示并重置游戏,否则切换玩家。
    • checkWin:检查当前落子位置是否形成五子连珠,通过检查四个方向(水平、垂直、正斜、反斜)来判断。
    • resetGame:重置游戏,清空棋盘数组和界面,将当前玩家重置为黑棋。
    • 监听棋盘的点击事件,根据点击位置计算落子坐标,并调用 placePiece 函数。

使用方法

将上述代码保存为一个 HTML 文件,在浏览器中打开该文件,即可开始玩五子棋游戏。点击棋盘上的空位即可落子,黑棋先下,交替进行,当有一方形成五子连珠时,游戏结束并弹出获胜提示,点击确定后游戏重置。

相关文章:

  • Promise 全方位解析(图解+实战版)
  • 【弹性计算】弹性裸金属服务器和神龙虚拟化(二):适用场景
  • 控制kinova机械臂沿给定的末端轨迹运动
  • 【银河麒麟高级服务器操作系统】服务器测试业务耗时问题分析及处理全流程分享
  • <tauri><rust><GUI>基于tauri,实现websocket通讯程序(右键菜单、websocket)
  • VSCode 中使用 GitHub Copilot最新版本详解
  • AnyDesk 远程桌面控制软件 v9.0.2
  • latex 环境配置
  • 算法与数据结构(相交链表)
  • MySQL学习笔记(1)索引
  • 超详细,多图文介绍redis集群方式并搭建redis伪集群
  • 《每天搞懂一道Hard》之数独终结者(LeetCode 37)
  • Ubantu22.04系统docker部署Open WebUI+Ollama【教程】
  • 施耐德 PLC 硬件库 DTM 的安装
  • 如何使用 Jenkins 实现 CI/CD 流水线:从零开始搭建自动化部署流程
  • 大数据与金融科技:革新金融行业的动力引擎
  • Linux(ftrace)__mcount的实现原理
  • 大白话html第六章HTML 与后端交互、优化网页性能
  • 使用UA-SPEECH和TORGO数据库验证自动构音障碍语音分类方法
  • ArcGIS Pro高级技巧:高效填充DEM数据空洞
  • 学做网站要学多久/拼多多seo怎么优化
  • 商业网站开发需求/长尾关键词排名推广
  • 做设计在哪个网站上找高清图片/重庆seo技术教程博客
  • 政府旅游网站建设/站长之家域名查询官网
  • 自己的电脑做网站当服务器使用/网络营销推广公司名称
  • 网站制作方案书/百度热榜实时热点