我爱围棋html在线围棋源码

“我爱围棋”是一款基于 Web 的围棋人机对战应用,采用纯前端技术实现(HTML + CSS + JavaScript)。它提供了完整的围棋规则实现(提子、打劫、9/13/19 路棋盘)以及强力 AI 对手。AI 使用启发式评分 + 深度限制的前瞻搜索(Minimax 简化版),具备打吃优先、连贯追击、边缘扣气、防止自填等智能行为。此外,平台还集成了“数目”功能,可实时显示双方目数并让 AI 决定是否同意数目。

图片[1]-我爱围棋html在线围棋源码-小卒博客
图片[2]-我爱围棋html在线围棋源码-小卒博客
图片[3]-我爱围棋html在线围棋源码-小卒博客

2. 技术栈

 前端框架:无(原生 JavaScript)

 样式:CSS3(Flex / Grid / 媒体查询)

 图标库:Font Awesome 6(CDN 引入)

 绘图:Canvas 2D(棋盘绘制、棋子渲染)

 输入适配:鼠标 / 触摸事件 / 键盘快捷键

 打包部署:单 HTML 文件,无需构建工具

 

3. 项目架构

项目采用单页面应用(SPA)模式,所有 UI 和逻辑都在一个 HTML 文件中。代码组织分为以下几大块:

 HTML:模式选择遮罩、主容器(棋盘、信息面板)、弹窗

 JavaScript:常量与配置、游戏状态管理、围棋规则函数、AI 引擎、数目系统、界面绘制、交互事件、辅助函数

 

4. 功能模块

4.1 棋盘与规则

 棋盘尺寸:支持 9×9、13×13、19×19(通过模式选择遮罩切换)

 落子规则:黑先白后,禁止在已有棋子的位置落子

 提子:自动检测并移除无气的棋子

 打劫:禁止立即回提(仅一个子时检测)

 终局:通过“认输”按钮结束对局,也可用 AI 判定功能判断胜负

 

4.2 AI 对手

AI 执白(可切换为双人对弈模式),其决策过程如下:

1. 基础评分:对每个候选位置调用 rawScore,计算包括提子、打吃、连接、救援、眼位、星位、边缘扣气等得分。

2. 候选筛选:按基础评分降序,取前 10~25 个候选点(取决于难度)。

3. 深度搜索(第 7 手后启用):

    中等难度:3 层前瞻,每层分支数递减(20→12→8→6)

    困难难度:5 层前瞻,同上

    简单难度:不使用前瞻

4. 搜索算法:简化 Minimax,当前层最大化自身得分,下一层最小化(即对方最佳应手的影响)

 

4.3 评分函数(rawScore)主要项

 提子:+100/每子

 打吃(敌方气=1):+100/每个敌人

 双重打吃:+180

 2→1 气奖励:+50/每个敌人

 3→2 气威胁:+10/每个敌人

 救援己方(气=1):+90;气=2:+50

 连接己方:+15/相邻己方

 威胁对方:+8/相邻敌方

 集体作战(≥3 己方棋子):+15;极密集(≥5):再 +10

 眼位潜力(相邻空点):+3/个

 星位(前15手):+15;小目:+10

 中央区域:+4;边缘:10

 新子气数=1:70;气数=2:40

 自填领地(≥3己方且气≤2):60

 

4.4 边缘扣气(AdjLib)

AI 评估时使用 adjLib 函数替代真实气数 realLib。如果棋子位于棋盘边缘(行=0 或 N1,或列=0 或 N1),且真实气数>0,则扣 1 气。使 AI 更积极处理边角棋子。

 

4.5 数目系统

基于区域填充算法计算空点归属。最终目数 = 棋子数 + 围空数(中国规则简化)。“目数”按钮仅显示目数;“AI 判定”按钮显示目数并让 AI 根据自身是否领先决定同意或拒绝数目。

 

4.6 界面与交互

 确认落子:二次点击确认,防误触

 暂停/继续:暂停时 AI 不响应,玩家也无法落子

 认输/重开:弹出确认对话框

 键盘快捷键:

  P – 暂停/继续;R – 重新开始;M – 切换模式;A – 切换双人/人机

  C – 确认落子开关;T – 查看目数;J – AI 判定;ESC – 关闭弹窗

 移动端适配:棋盘自适应,触屏优化,横屏左右布局

 

5. 配置与扩展

 难度配置:下拉菜单选择简单/中等/困难

 棋盘尺寸:通过模式选择按钮调用 setSize(n)

 添加新规则或评分项:修改 rawScore 函数,增加权重

 替换 AI 引擎:替换 aiMove 函数,返回 {r, c} 格式落子位置

 

6. 二次修改提示(详细)

如果您打算对代码进行二次开发或深度定制,请务必注意以下细节:

 

6.1 修改 AI 评分权重

 所有评分项都在 rawScore 函数中,直接修改数值即可。例如将提子奖励从 100 改为 120 会让 AI 更激进地提子。

 注意:修改后需要重新测试,确保不会出现异常行为(如过度自填或忽视防守)。

 

6.2 调整搜索深度与分支数

 搜索深度由 aiMove 中的 depth 变量控制(当前根据难度和 moveCnt 决定)。

 每层候选点数量在 deepAssess 中通过 limit 确定。可以增大 limit 换取更精准的搜索,但会降低速度(尤其 19 路棋盘)。

 建议:如果电脑性能较好,可将 limit 最大值从 20 提高到 30 或 40;手机端保持较低值。

 

6.3 添加新的评分特征

 在 rawScore 中添加新的加分或扣分项。例如增加“连环劫”检测、“厚势”奖励等。

 新特征必须基于当前棋盘状态(brd)和候选落子点 (r,c),不能使用未来信息。

 注意:如果新特征需要计算量较大,最好只在候选点筛选完成后对 topN 个点执行,以免拖慢 AI 响应。

 

6.4 修改围棋规则

 真实气数使用 realLib 函数,adjLib 是 AI 评估用的调整气数。如果希望改变提子条件(例如废除打劫),需修改 capture 函数中的劫检测逻辑。

 严禁修改 realLib 或 group 函数,它们是围棋规则的基础。

 

6.5 界面与交互定制

 棋盘样式、颜色在 CSS 中修改;棋子绘制在 drawStonePos 函数中。

 按钮文字、图标可以直接修改 HTML 中的内容。

 如果想增加新的快捷键,在 document.addEventListener(‘keydown’) 中添加分支即可。

 

6.6 性能优化建议

 困难模式 + 19 路棋盘时,AI 思考时间可能较长。可采取以下优化:

   降低候选点总数(maxCand 从 25 减小到 15)。

   减少每层候选数(limit 从 20 减小到 10)。

   在 deepAssess 中只对前 5 个候选进行深度搜索,其余直接使用 rawScore。

 对于 9 路或 13 路棋盘,可适当增加深度(例如中等改为 4 层,困难改为 6 层)。

 

6.7 联机对战建议

 本项目当前为单机人机对战,若要实现联机对战,建议采用以下方案:

  a) WebSocket + Node.js 服务器:前后端通过 WebSocket 通信,服务器负责转发双方落子指令及时间控制。棋盘逻辑可放在服务端校验,或全放在客户端但互信。

  b) 使用现成游戏框架(如 PeerJS、Socket.io)快速搭建点对点或房间制对战。

  c) 保持现有界面,增加“创建房间”和“加入房间”功能,棋盘复用,但需处理 AI 禁用逻辑(联机时双方均为人类)。

  d) 时间规则:增加计时器倒计时,使用 setTimeout/setInterval 实现读秒。

  e) 对战状态同步:每次落子后,将完整棋谱(SGF 格式或自定义 JSON)同步给对方,确保双方棋盘一致。

 注意:联机后需去除 AI 自动落子逻辑,并增加“结束对局”按钮供双方协商认输。

 

6.8 测试策略

 每次修改后,至少进行以下测试:

   在不同棋盘尺寸下各下 10 步,观察 AI 是否出现非法落子(如填眼、自杀)。

   故意制造打吃、提子场景,验证规则正确性。

   使用“数目”按钮检查目数计算是否准确。

   在移动设备和桌面端分别测试触屏和鼠标交互。

 

6.9 版本管理

 建议在修改前备份原文件,或使用 Git 进行版本控制。

 每次修改后记录改动内容和效果,便于回滚。

 

7. 开发指南

 本地运行:直接打开 HTML 文件,无服务器要求

 调试建议:查看 console.log,使用 drawBoard() 重绘

 测试要点:提子/打劫正确性、AI 数目判断、移动端触摸流畅性

8, 

20260518 v1.7 增加详细二次修改提示,完善开发指引,项目更名为“我爱围棋”,添加版权声明

 

版权说明:

 本文档及对应软件受著作权法保护,仅用于学习和研究目的。

 允许个人自由使用、修改和分享,但不得用于商业用途未经授权。

 任何分发必须保留完整的版权声明和本开发文档。

 作者不对因使用本软件造成的任何损失承担责任。

 

我爱围棋丨下载地址:

 

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
1353753647的头像-小卒博客钻石会员
评论 抢沙发

请登录后发表评论

    暂无评论内容