返回作品列表

网友作品 #000032 · 提交于 2026/08/04

五子棋人机对战桌面游戏:WPF自绘棋盘与启发式AI

★★★★★零基础dotnet

作品作者

Mustang零基础
使用 Skill
dotnet
提交你的作品

作品简介

这是一个基于 .NET 8 + WPF 的桌面五子棋游戏,玩家与内置 AI 在标准 15×15 棋盘对弈。界面用 Canvas 自绘棋盘与星位,核心逻辑(棋盘模型、胜负判定、AI 算法)放在独立的 Gomoku.Core 纯逻辑层,与界面层完全解耦,可独立测试与复用。整体经 dotnet publish 打包为单文件 exe,双击即可开始对局。

核心亮点

  • 标准棋盘:15×15 网格自动绘制,含天元与四角星位,鼠标点击落子
  • 三级 AI 策略:自己一步能成五连直接取胜;玩家一步能成五连立即封堵;其余落点按攻防综合评分选取
  • 棋形评分模型:按“连子数 × 开放端数”赋值,五连、活四、冲四、活三、眠三分级清晰,仅评估已有棋子周围 2 格内的空位以加速决策
  • 完整对局功能:执黑/执白一键切换、悔棋(同时撤销电脑与玩家各一步)、随时重新开局
  • 实时胜负判定:以最后一手为端点,沿横、竖、斜四个方向统计连子判定五连与平局
  • 流畅不卡顿:AI 落子用异步延时让出 UI 线程,界面响应顺畅
  • 单文件发布:publish 目录输出 exe,安装 .NET 8 运行时即可运行

技术与工具

  • 技术栈:.NET 8、WPF、C#
  • 项目分层:Gomoku.Core(棋盘模型 Board、启发式 AI GomokuAi)+ Gomoku.App(Canvas 棋盘绘制与交互调度)
  • 发布方式:dotnet publish 打包 Windows 单文件 exe

适用场景

  • 休闲对弈:随时来一局人机五子棋
  • 编程入门参考:界面交互、逻辑分层、启发式 AI 的完整小型案例
  • 方案迁移:评分式 AI 与棋盘交互思路可复用到其他棋类或益智休闲游戏
原始提交内容(点开查看,可复制全文去问 AI)

README.md。

markdown

五子棋(Gomoku)· 人机对战

基于 .NET 8 + WPF 的桌面五子棋游戏,玩家与内置 AI 对弈。界面用 Canvas 自绘棋盘, 核心逻辑与 AI 算法完全解耦,可独立测试与复用。

特性

  • 标准 15×15 棋盘,鼠标点击落子,自动绘制网格与星位(天元 + 四角星)
  • 人机对战:玩家执黑先手(可一键切换执白),电脑自动应对
  • 启发式 AI:优先取胜 必堵活四 攻防评分选点,响应快
  • 悔棋:撤销最近一回合(电脑 + 玩家各一步),重新决策
  • 重新开始 / 换先手:随时重置或交换黑白先手
  • 胜负判定:实时检测横、竖、斜四个方向的五连与平局

运行

需要本机安装 .NET 8 运行时。

双击 publish/Gomoku.exe 即可开始对局。

项目结构

Gomoku/ Gomoku.sln src/ Gomoku.Core/ # 纯逻辑层(无 UI 依赖) Board.cs # 棋盘模型、落子/悔棋、胜负判定 GomokuAi.cs # 人机对战 AI(启发式评分) Gomoku.App/ # WPF 界面层 MainWindow.xaml.cs # 棋盘绘制、交互、回合调度 MainWindow.xaml # 窗口与按钮布局 app.ico # 程序图标 publish/ # 发布产物(Gomoku.exe)

code

核心设计

1. 棋盘与胜负判定 —— Board

  • Stone 枚举表示空位 / 黑 / 白
  • 内部用 Stone[15,15] 二维数组存储,Stack<(x,y,s)> 记录落子历史以支持悔棋
  • Place / Undo / Reset 管理状态变更
  • CheckWin(x, y) 仅以「最后一手」为端点,沿四个方向统计连子数 5 即胜
int[][] dirs =
{
    new[] { 1, 0 },   // 横
    new[] { 0, 1 },   // 竖
    new[] { 1, 1 },   // 斜 \
    new[] { 1, -1 }   // 斜 /
};
2. 人机 AI —— GomokuAi
落子决策分三级(见 ComputeMove):

取胜优先:若自己一步能成五连,直接落子取胜(FindWinningMove)
防守必堵:若玩家一步能成五连,立即封堵该点
启发式搜索:仅评估「已有棋子周围 2 格」内的空位(候选剪枝),对每个候选点
attack = ScorePoint(x, y, 我方):我方在此落子的进攻价值
defend = ScorePoint(x, y, 对方):对方在此落子的威胁
综合评分 total = attack * 10 + defend,取最高者
LineScore 按「连子数 × 开放端数」赋值,体现棋形强弱:

棋形	评分
五连	1,000,000
活四	100,000
冲四	10,000
活三	5,000
眠三	500
3. 界面与交互 —— MainWindow
DrawBoard:清空 Canvas,重绘网格线、星位与已有棋子
BoardCanvas_MouseLeftButtonDown:将鼠标坐标映射到棋盘交叉点,校验后落子
AiMoveAsync:await Task.Delay(300) 让出 UI 线程,避免界面卡顿
悔棋同时撤销「电脑 + 玩家」两步,保证轮到玩家重新决策
构建与发布
bash
# 构建
dotnet build src/Gomoku.App/Gomoku.App.csproj -c Release

# 发布为 Windows 单文件 exe
dotnet publish src/Gomoku.App/Gomoku.App.csproj -c Release \
  -r win-x64 --self-contained false -p:PublishSingleFile=true -o publish
后续可扩展
难度分级(限制 AI 搜索深度 / 引入博弈树 Minimax + α-β 剪枝)
禁手规则(黑棋三三、四四、长连禁手)
双人对战模式与网络对战

</details>

<script type="application/json" data-raw-detail>"README.md。\n\nmarkdown\n# 五子棋(Gomoku)· 人机对战\n\n基于 .NET 8 + WPF 的桌面五子棋游戏,玩家与内置 AI 对弈。界面用 `Canvas` 自绘棋盘,\n核心逻辑与 AI 算法完全解耦,可独立测试与复用。\n\n## 特性\n\n- **标准 15×15 棋盘**,鼠标点击落子,自动绘制网格与星位(天元 + 四角星)\n- **人机对战**:玩家执黑先手(可一键切换执白),电脑自动应对\n- **启发式 AI**:优先取胜  必堵活四  攻防评分选点,响应快\n- **悔棋**:撤销最近一回合(电脑 + 玩家各一步),重新决策\n- **重新开始 / 换先手**:随时重置或交换黑白先手\n- **胜负判定**:实时检测横、竖、斜四个方向的五连与平局\n\n## 运行\n\n> 需要本机安装 [.NET 8 运行时](https://dotnet.microsoft.com/download/dotnet/8.0)。\n\n双击 `publish/Gomoku.exe` 即可开始对局。\n\n## 项目结构\n\nGomoku/  Gomoku.sln  src/   Gomoku.Core/ # 纯逻辑层(无 UI 依赖)    Board.cs # 棋盘模型、落子/悔棋、胜负判定    GomokuAi.cs # 人机对战 AI(启发式评分)   Gomoku.App/ # WPF 界面层   MainWindow.xaml.cs # 棋盘绘制、交互、回合调度   MainWindow.xaml # 窗口与按钮布局   app.ico # 程序图标  publish/ # 发布产物(Gomoku.exe)\n\ncode\n\n## 核心设计\n\n### 1. 棋盘与胜负判定 —— `Board`\n\n- `Stone` 枚举表示空位 / 黑 / 白\n- 内部用 `Stone[15,15]` 二维数组存储,`Stack\u003c(x,y,s)>` 记录落子历史以支持悔棋\n- `Place` / `Undo` / `Reset` 管理状态变更\n- `CheckWin(x, y)` 仅以「最后一手」为端点,沿四个方向统计连子数  5 即胜\n\n```csharp\nint[][] dirs =\n{\n    new[] { 1, 0 },   // 横\n    new[] { 0, 1 },   // 竖\n    new[] { 1, 1 },   // 斜 \\\n    new[] { 1, -1 }   // 斜 /\n};\n2. 人机 AI —— GomokuAi\n落子决策分三级(见 ComputeMove):\n\n取胜优先:若自己一步能成五连,直接落子取胜(FindWinningMove)\n防守必堵:若玩家一步能成五连,立即封堵该点\n启发式搜索:仅评估「已有棋子周围 2 格」内的空位(候选剪枝),对每个候选点\nattack = ScorePoint(x, y, 我方):我方在此落子的进攻价值\ndefend = ScorePoint(x, y, 对方):对方在此落子的威胁\n综合评分 total = attack * 10 + defend,取最高者\nLineScore 按「连子数 × 开放端数」赋值,体现棋形强弱:\n\n棋形\t评分\n五连\t1,000,000\n活四\t100,000\n冲四\t10,000\n活三\t5,000\n眠三\t500\n3. 界面与交互 —— MainWindow\nDrawBoard:清空 Canvas,重绘网格线、星位与已有棋子\nBoardCanvas_MouseLeftButtonDown:将鼠标坐标映射到棋盘交叉点,校验后落子\nAiMoveAsync:await Task.Delay(300) 让出 UI 线程,避免界面卡顿\n悔棋同时撤销「电脑 + 玩家」两步,保证轮到玩家重新决策\n构建与发布\nbash\n# 构建\ndotnet build src/Gomoku.App/Gomoku.App.csproj -c Release\n\n# 发布为 Windows 单文件 exe\ndotnet publish src/Gomoku.App/Gomoku.App.csproj -c Release \\\n  -r win-x64 --self-contained false -p:PublishSingleFile=true -o publish\n后续可扩展\n难度分级(限制 AI 搜索深度 / 引入博弈树 Minimax + α-β 剪枝)\n禁手规则(黑棋三三、四四、长连禁手)\n双人对战模式与网络对战"</script>