五子棋
双人/简易 AI 对战
关于本工具
了解工具定位 · 使用场景 · 对比优势
在棋盘上交替落子,先连成五子的一方获胜。适合两人同屏对弈,或与内置 AI 练习棋感。所有逻辑在浏览器内运行,棋局不离开你的设备。
使用场景
等车消遣对局
通勤路上、排队等候时,打开五子棋与朋友或AI来一局。无需等待匹配,无需联网,双人模式下两人轮流落子,AI模式可随时调整难度。一局3-5分钟,节奏紧凑,适合碎片时间打发,比刷短视频更有参与感。
AI战术练习
想提升五子棋水平但找不到陪练?简易AI提供稳定、可重复的对手。通过反复对局,观察AI的防守策略与进攻线路,练习活三冲四的布局技巧。AI不会疲劳,可以随时复盘上一手,适合新手系统锻炼棋感。
亲子益智互动
家长带孩子玩五子棋,用双人模式轮流落子,边下边讲解规则:连成五子即胜、堵住对方的活三。棋盘清晰无干扰,孩子能直观理解空间连接与预判。一局时间短,适合6岁以上儿童入门逻辑思维训练。
远程双人娱乐
朋友不在身边?用同一台电脑或手机,双人模式轮流操作即可对弈。无需注册账号、无需分享屏幕,打开网页即玩。适合视频通话时同步开一局,增加互动乐趣,比纯聊天更有话题。
对比矩阵本工具 vs 竞品 vs 传统方法
| 维度 | 本工具 | 竞品 A (五子棋大师) | 传统方法 |
|---|---|---|---|
| AI 对手强度 | 简易 AI,适合新手入门 | 多级 AI,含高级算法 | 无 AI,需真人对手 |
| 数据隐私 | 纯浏览器,零上传 | 需下载安装,本地运行 | 线下棋盘,完全离线 |
| 处理速度 | 即时响应 | 即时响应 | 即时响应 |
| 离线可用 | 依赖网络加载 | 安装后完全离线 | 完全离线 |
| 平台兼容 | 浏览器,跨平台 | 仅限 Windows/Android | 实体棋盘,无平台限制 |
| 收费 | 免费 | 基础免费,高级功能付费 | 需购买棋盘棋子 |
| 注册 | 无需注册 | 无需注册 | 无需注册 |
使用指南
上手步骤 · 输入输出 · 避坑提示
使用步骤
- 选择模式:点击「双人对战」或「AI 对战」按钮开始游戏
- 轮流点击棋盘交叉点落子,黑棋先手,白棋后手
- 任意一方在横、竖、斜方向连成五子即获胜,棋盘自动判定并显示结果
- 点击「重新开局」按钮清空棋盘,开始新一局
输入输出示例8 个典型场景,覆盖常规、边界与易错
| 输入 | 输出 | 说明 |
|---|---|---|
| 双人模式:黑棋(7,7),白棋(7,8),黑棋(8,8),白棋(8,7),黑棋(9,9) | 黑棋五子连珠((7,7)→(8,8)→(9,9)→(10,10)→(11,11) 未完成),白棋无胜,游戏继续 | 典型双人对战:演示斜线连珠判断 |
| AI 模式(简单难度):黑棋(5,5),AI 白棋自动落子 | AI 白棋落子 (5,6) 或 (4,5) 或 (6,5)(随机简单防守) | 典型 AI 对战:简单难度下 AI 随机防守 |
| 双人模式:黑棋(0,0),白棋(0,1),黑棋(0,2),白棋(0,3),黑棋(0,4) | 黑棋获胜(五子连珠:第 0 行第 0-4 列) | 边界 case:棋盘边缘水平连珠 |
| 双人模式:黑棋(14,14),白棋(14,13),黑棋(14,12),白棋(14,11),黑棋(14,10) | 黑棋获胜(五子连珠:第 14 行第 10-14 列) | 边界 case:棋盘另一侧边缘连珠 |
| 双人模式:黑棋(7,7),白棋(7,8),黑棋(8,8),白棋(8,7),黑棋(9,9),白棋(9,8),黑棋(10,10),白棋(10,9),黑棋(11,11) | 黑棋获胜(五子连珠:主对角线 (7,7)→(8,8)→(9,9)→(10,10)→(11,11)) | 边界 case:长连珠(超过5子)仍算获胜 |
| AI 模式(困难难度):黑棋(7,7),AI 白棋自动落子 | AI 白棋落子 (7,8) 或 (8,7) 或 (6,7) 或 (7,6)(防守黑棋活二) | 易错 case:困难 AI 会主动防守活二 |
| 双人模式:黑棋(7,7),白棋(7,7) | 无效落子:该位置已有棋子 | 易错 case:重复点击同一格 |
| 双人模式:黑棋(-1,5) | 无效落子:坐标超出棋盘范围(0-14) | 边界 case:输入负坐标 |
常见错误对照8 个常踩的坑 · 错误 → 修复
1. 误以为 AI 难度可调
点击「开始游戏」后,发现 AI 太强或太弱,四处寻找「难度」或「等级」设置。当前 AI 为固定难度(简易级),仅提供基础防守和随机进攻。如需调整,可切换至「双人模式」自行控制双方水平。简易 AI 对战模式不提供难度选项,AI 行为是写死的。用户期望可调节,但工具实现未包含该功能。
2. 在 AI 模式下尝试「悔棋」
AI 落子后,点击「悔棋」按钮,发现只能撤回自己的上一步,AI 的落子并未撤销。悔棋功能仅作用于当前玩家(人类)的上一步操作,AI 的落子不会被撤销。如需重新开始,请使用「重新开局」按钮。悔棋逻辑只记录人类玩家的落子历史,AI 的决策不参与撤销队列。这是实现简化,并非 Bug。
3. 双人模式误判「谁先手」
黑方落子后,白方等待黑方再次落子,误以为「双人」是轮流在同一设备上操作,但未注意当前轮到哪一方。界面会高亮显示当前执子颜色(黑/白),并在状态栏提示「黑方落子」或「白方落子」。请根据提示操作。双人模式下没有自动切换提示音或闪烁,仅靠 UI 文字和颜色区分。用户容易忽略状态栏变化。
4. 在棋盘边缘落子后无法继续
将棋子落在棋盘最边角(如 A1 或 O15),后续 AI 或对手落子后,自己找不到可落子的有效位置。五子棋棋盘为 15×15,边角位置合法。若所有格子被填满仍无五子连珠,则判定为平局。用户误以为边角是「无效区域」,实际上棋盘无禁手规则,所有交叉点均可落子。平局是正常结局。
5. 误以为「禁手」规则存在
黑方下出「双活三」或「长连」后,系统未提示违规,用户认为工具存在 Bug。本工具不实现禁手规则。黑方可以下双活三、四四、长连(超过五子)等,均视为合法落子。标准五子棋竞赛(如 RIF 规则)有禁手,但本工具为简易对战,完全开放所有落子位置。
6. AI 模式下连续点击同一位置
AI 落子后,用户快速多次点击同一个空位,发现棋子被重复放置或界面卡顿。每次落子后需等待 AI 响应(约 0.5-1 秒),期间点击无效。请勿连续点击同一位置。前端防抖机制会忽略 AI 思考期间的点击事件,但用户感知为「无反应」,误以为工具卡死。
7. 双人模式使用「AI 落子」按钮
在双人模式下点击「AI 落子」按钮,期望 AI 帮当前玩家走一步,但按钮无反应或报错。「AI 落子」按钮仅在 AI 对战模式下可用。双人模式下该按钮应被禁用或隐藏。UI 未明确区分模式,用户可能误按。工具应通过禁用状态或文字提示来避免混淆。
8. 误以为可以「复盘」历史对局
对局结束后,点击棋盘上的棋子想查看落子顺序,但无法拖动或回放。本工具不支持复盘功能。对局结束后,棋盘状态固定为最终局面。如需回顾,请自行截图或记录。用户期望有「回放」或「逐步查看」功能,但工具实现仅保留最终棋盘,不存储落子序列。
工作原理
公式推导 · 流程图解 · 依据出处
核心公式
评估函数:Score = w1 × (2×连子数 + 活三数) + w2 × 冲四数 - w3 × 对方威胁值
变量说明
连子数— 当前方向上连续同色棋子数量活三数— 两端均无阻挡的三连子数量冲四数— 一端受阻的四连子数量对方威胁值— 对手下一步能形成五连的评分w1, w2, w3— 权重系数,通常 w1=10, w2=5, w3=8
示例
棋盘上己方有 1 个活三(连子数=3,活三数=1),1 个冲四(冲四数=1),对方有 1 个活三(威胁值=10)。则 Score = 10×(2×3 + 1) + 5×1 - 8×10 = 10×7 + 5 - 80 = 70 + 5 - 80 = -5。AI 会优先选择评分更高的落子位置。
适用范围
适用于本工具简易 AI 的贪心评估策略,仅考虑局部棋型,不包含全局搜索树。对复杂棋局(如双活三、长连禁手)可能误判,不适用于专业五子棋规则(如三手交换、五手两打)。
原理图
开发者集成
3 种主流语言 · 复制即用
import numpy as np
# 五子棋棋盘 15x15,0=空 1=黑 2=白
board = np.zeros((15, 15), dtype=int)
# 简易 AI:检查是否有连续四子可堵,否则随机落子
def ai_move(board, player=1):
opponent = 2 if player == 1 else 1
# 检查对手是否有活四或冲四
for r in range(15):
for c in range(15):
if board[r][c] != 0:
continue
# 模拟落子后检查是否形成四子
board[r][c] = opponent
if check_win(board, opponent):
board[r][c] = 0
return (r, c) # 堵住
board[r][c] = 0
# 随机落子(简单策略)
empty = [(r, c) for r in range(15) for c in range(15) if board[r][c] == 0]
return empty[np.random.randint(len(empty))] if empty else None
def check_win(board, player):
# 检查四个方向是否有五子连珠
for r in range(15):
for c in range(15):
if board[r][c] != player:
continue
# 水平
if c <= 10 and all(board[r][c+i] == player for i in range(5)):
return True
# 垂直
if r <= 10 and all(board[r+i][c] == player for i in range(5)):
return True
# 主对角线
if r <= 10 and c <= 10 and all(board[r+i][c+i] == player for i in range(5)):
return True
# 副对角线
if r <= 10 and c >= 4 and all(board[r+i][c-i] == player for i in range(5)):
return True
return False
# 示例:黑棋下在 (7,7)
board[7][7] = 1
move = ai_move(board, 2)
print(f"AI 落子位置: {move}") # 输出类似 (7,8)package main
import (
"fmt"
"math/rand"
)
const size = 15
type Board [size][size]int // 0=空 1=黑 2=白
// 检查五子连珠
func checkWin(b *Board, player int) bool {
dirs := [][2]int{{0, 1}, {1, 0}, {1, 1}, {1, -1}}
for r := 0; r < size; r++ {
for c := 0; c < size; c++ {
if b[r][c] != player {
continue
}
for _, d := range dirs {
count := 1
for i := 1; i < 5; i++ {
nr, nc := r+i*d[0], c+i*d[1]
if nr < 0 || nr >= size || nc < 0 || nc >= size {
break
}
if b[nr][nc] != player {
break
}
count++
}
if count >= 5 {
return true
}
}
}
}
return false
}
// 简易 AI:堵四子或随机
func aiMove(b *Board, player int) (int, int) {
opponent := 2
if player == 2 {
opponent = 1
}
// 检查对手是否有活四
for r := 0; r < size; r++ {
for c := 0; c < size; c++ {
if b[r][c] != 0 {
continue
}
b[r][c] = opponent
if checkWin(b, opponent) {
b[r][c] = 0
return r, c
}
b[r][c] = 0
}
}
// 随机落子
var empty [][2]int
for r := 0; r < size; r++ {
for c := 0; c < size; c++ {
if b[r][c] == 0 {
empty = append(empty, [2]int{r, c})
}
}
}
if len(empty) == 0 {
return -1, -1
}
move := empty[rand.Intn(len(empty))]
return move[0], move[1]
}
func main() {
var board Board
board[7][7] = 1 // 黑棋下在 (7,7)
r, c := aiMove(&board, 2)
fmt.Printf("AI 落子: (%d,%d)\n", r, c) // 输出类似 (7,8)
}// 五子棋棋盘 15x15,0=空 1=黑 2=白
const SIZE = 15;
const board = Array.from({ length: SIZE }, () => Array(SIZE).fill(0));
// 检查五子连珠
function checkWin(board, player) {
const dirs = [[0,1],[1,0],[1,1],[1,-1]];
for (let r = 0; r < SIZE; r++) {
for (let c = 0; c < SIZE; c++) {
if (board[r][c] !== player) continue;
for (const [dr, dc] of dirs) {
let count = 1;
for (let i = 1; i < 5; i++) {
const nr = r + i * dr, nc = c + i * dc;
if (nr < 0 || nr >= SIZE || nc < 0 || nc >= SIZE) break;
if (board[nr][nc] !== player) break;
count++;
}
if (count >= 5) return true;
}
}
}
return false;
}
// 简易 AI:堵四子或随机
function aiMove(board, player) {
const opponent = player === 1 ? 2 : 1;
// 检查对手是否有活四
for (let r = 0; r < SIZE; r++) {
for (let c = 0; c < SIZE; c++) {
if (board[r][c] !== 0) continue;
board[r][c] = opponent;
if (checkWin(board, opponent)) {
board[r][c] = 0;
return [r, c];
}
board[r][c] = 0;
}
}
// 随机落子
const empty = [];
for (let r = 0; r < SIZE; r++) {
for (let c = 0; c < SIZE; c++) {
if (board[r][c] === 0) empty.push([r, c]);
}
}
return empty[Math.floor(Math.random() * empty.length)] || null;
}
// 示例:黑棋下在 (7,7)
board[7][7] = 1;
const move = aiMove(board, 2);
console.log(`AI 落子: (${move[0]},${move[1]})`); // 输出类似 (7,8)常见问题
8 个高频疑问