一款采用WPF开发的开源中国象棋软件

一个采用WPF开发的中国象棋软件,软件全部开源,可用于二次开发与学习,软件设计上,借鉴了国内知名象棋软件通行的设计思想,具有友好的操作界面,符合大众使用习惯。



软件特点


  1. 全部源码,开箱即用。

  2. 代码中含有大量注释,能够快速理解程序流程。

  3. 提供预览版可执行文件,下载解压即可使用,无需安装。预览版不定期更新。



主要功能


  1. 人机对战,测试自己的象棋水平。

  2. 电脑对战,观看电脑控制红黑双方棋子如何攻杀。

  3. 自由打谱,练习各种变化,添加着法注释,并能够全部保存。

  4. 具有复盘功能,所有保存的棋谱及其着法变化,都可以随时打开进行温习。

  5. 残局破解,测试残局能力。系统自带30个残局,有视频破解教程。

  6. 残局设计,可不断收集、扩展残局库。



已具备的其他功能


  • 棋盘可上下翻转,红方可在下方,也可以在上方。运行期间可随意翻转棋盘。

  • 走棋具备动画效果,有悔棋功能。

  • 可显示棋子移动的有效位置,非法目标位置将不可走到。

  • 红方先走棋,非走棋方的棋子选中无效。

  • 将军时有提示,且下一步必须走解将的棋子,其他走棋无效。

  • 走棋错误时,自动取消走棋,棋子返回到走棋前位置。

  • 有绝杀判断功能。判断是否绝杀的算法比较复杂,费了不少脑细胞。

  • 有记谱功能,可在单独窗口同步显示。

  • 点“开局”按钮,可恢复到初始状态。

  • 仿天天象棋界面,严格遵循象棋走棋规则。

  • 使用SQLite在本地保存棋谱,具体增加、删除、修改功能。

  • 完善的变招数据存储结构,可保存所有变化。

  • 遇到变招时,显示箭头提示。显示箭头数量可进行设置,以便保存界面清洁。

  • 电脑提示下一步最佳着法,显示局面分。

  • 电脑走棋速度可人为设置。

  • 窗口可任意缩放,棋盘、棋子、按钮等同步缩放。

  • 窗口背景可任意更换。

  • 具备界面主题选择功能,可选择个人喜好的主题。

  • 自动保存用户设置,下次打开软件时,自动使用上次保存的设置。


软件构架


编程环境:Visual Studio 2019/2022 C#,NET5.0/6.0,WPF,SQLite3.0 随着功能扩展,代码量快速增长,模块间耦合度过高问题越来越严重。下一步打算使用Prism框架对代码进行重构,重构为MVVM模式,以降低模块间的耦合度,增强可扩展性。


代码示例
for (int i = 0; i < 9; i++)
   for (int j = 0; j < 10; j++)
   {
       int qizi = GlobalValue.qiPan[i, j]; // 从棋盘上找到存活的本方棋子
       if (gongJiQiZi > 15 && qizi > 0 && qizi <= 15) // 黑方被将军时
       {
           thispoints = MoveCheck.GetPathPoints(qizi, GlobalValue.qiPan); // 获得本方棋子的可移动路径
           foreach (int[] point in jieShaPoints) // 逐个取出可解除将军的点位坐标
           {
               if (thispoints[point[0], point[1]] == true) // 本方棋子的可移动路径是否包含解除攻击点
               {
                   if (!MoveCheck.AfterMoveWillJiangJun(qizi, point[0], point[1], GlobalValue.qiPan))
                       returntrue;  // true=能够解杀
               }
           }
       }
       if (gongJiQiZi <= 15 && qizi > 16 && qizi <= 31) // 红方被将军时
       {
           thispoints = MoveCheck.GetPathPoints(qizi, GlobalValue.qiPan); // 获得本方棋子的可移动路径
           foreach (int[] point in jieShaPoints) // 逐个取出可解除将军的点位坐标
           {
               if (thispoints[point[0], point[1]] == true) // 本方棋子的可移动路径是否包含解除攻击点
               {
                   if (!MoveCheck.AfterMoveWillJiangJun(qizi, point[0], point[1], GlobalValue.qiPan))
                       returntrue;  // true=能够解杀
               }
           }
       }
   }


绝杀算法流程图

将军绝杀算法流程图


软件截图

主菜单界面 着法提示与打分 棋谱库 残局破解


下载地址:https://gitee.com/cygsd/Chess