[转载] 中国象棋软件-引擎实现(一)概述

mane 2021-10-27 原文

2005年6月我系第二批科技小组的项目正式确定为实现一款中国象棋对弈软件。基本功能包括人机对战、网络对战。我负责开发人机对战的引擎部分,也就是让计算机下棋。经过了暑假整整两个月的学习与实践,我终于初步完成了程序,虽然电脑的下棋水平实在不敢恭维,但好歹也是我心血所成,所以就苟且将其命名为scCChess1.0版本,整理一下发到blog上来。(本程序在8月底就完工了,之所以现在才贴上来是因为我本想在这个学期对它进行改善,力求让电脑的下棋水平再上一个层次之后再贴出来,免得众老鸟笑话。结果这个学期实在是比较忙,而且现在又找不到人做界面,我不得不转去给我的引擎做界面。唉,说来惭愧啊,小生对做界面至今仍未入门,当你看这篇blog时,说不定我正在痛苦的学着MFC……再加上其他一些乱七八糟的事恐怕年前是不会有空修改引擎了。所以干脆先贴了,以后若有大改再贴新的。如果有哪位朋友耐住性子、牺牲了宝贵时间看了小生的东西,还望多提宝贵意见。谢谢、谢谢……

好了,说了这么多废话现在转入正题。

程序的基本框架:
从程序的结构上讲,大体上可以将本程序划分为四大部分:
棋局表示、 着法生成、 搜索算法、 局面评估

程序的大概的思想是:
首先使用一个数据结构来描述棋局信息,对某一特定的棋局信息由着法生成器生成当前下棋方所有合法的着法并依次存入着法队列。然后通过搜索算法来逐一读取着法并调用局面评估函数对该着法所产生的后继局面进行评估打分,从中选出一个最有可能导致走棋方取胜的着法。在搜索的过程中还可以采用一些辅助手段来提高搜索的效率。其过程如下图所示:

chess_liuchen.gif

在搜索算法上我采用了Alpha-Beta搜索。此外,为了提高搜索的效率,我还加进了历史启发以及归并排序等以辅助搜索。这些用的都是前人的东西。本程序最具创造性的地方在于局面评估部分(请允许我用“创造性”这个词,尽管我设计的算法可能很幼稚——从目前电脑的下棋水平来看我不得不这么说,但毕竟耗费了我好多脑细胞啊)。搜索算法和局面评估是整个程序的核心。其中局面评估对计算机的下棋水平起着至关重要的影响。也是今后我的程序想要提高机器“智能”所要着重改进的地方。呵呵,既然如此重要这个就放在最后再讲了。

程序项目的构成:
我为程序建了一个win32控制台项目,这意味着我的程序用了一个DOS的界面(在界面开发出来之前,我通过在DOS窗口中输入坐标、电脑反馈坐标的方式来和电脑下棋,以此测试我的引擎)。
我将各个模块分别写成头文件,最后再包进一个主的cpp文件。我知道这样似乎有点外行,但对像我一样的初学者来说这种方法简单易懂:)

整个项目包含如下文件:
scCChess.cpp
——程序主文件。负责游戏的开始。
scCChess.h
——主头文件。定义了初始化游戏、开始游戏等基本函数。
CChessDef.h
——象棋相关定义。包括棋子棋盘的表示,行棋的基本结构类型等定义。
CChessEvaluate.h
——局面评估。为某一特定局面进行评分。
CChessMove.h
——着法生成器。就当前局面生成某一方所有合法着法。
CChessSearch.h
——搜索部分。对着法队列进行搜索,求出最佳着法。
HistoryHeuristic.h
——历史启发。Alpha-Beta搜索之补充,以提高搜索效率。
SortMove.h
——着法排序。对着法按其历史得分进行降序排序,以提高搜索效率。

参考资料:
在写本程序时我参考学习了以下资料:
*《PC 游戏编程(人机博弈)》 作者:王小春 重庆大学出版社
* 象棋百科全书 ElephantBoard的主页 http://www.elephantbase.net/ 站长邮箱: webmaster@elephantbase.NET
*《Visual C++.NET 小游戏开发时尚编程百例》 作者:网冠科技 机械工业出版社
* 以及众多其它无名作者的源程序
它们对我最终能够顺利完成程序起了巨大的帮助作用。在此,谨向以上所列表示感谢!
此外,我还要感谢我们的指导老师——蒋德茂老师和陈宇老师,他们给了我们科技小组很大的支持和帮助。在此,也向两位老师表示感谢!

下面将陆续介绍程序各部分的实现……

版权声明:本文为mane原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/mane/p/6257877.html

[转载] 中国象棋软件-引擎实现(一)概述的更多相关文章

  1. 在windows右键菜单中加入自己的程序 [转载] – 小林觉

    在windows右键菜单中加入自己的程序 [转载] 原文链接: http://blog.csdn.net/ma […]...

  2. [转载] 蒲慕明教授的eMail – burellow

    [转载] 蒲慕明教授的eMail 【大约在十年前,著名的华人生物学家蒲慕明先生曾经有一封非常著名的email在 […]...

  3. [转载] UTC时间,GMT时间,EST时间,CST时间的区别 – 中道学友

    [转载] UTC时间,GMT时间,EST时间,CST时间的区别 有关时间的几个缩写放在一起,容易混淆,所以转载 […]...

  4. iOS App 性能检测 (转载)

    明确性能检测都需要关注哪些指标,列举了以下几个主要的,后面会详细说:启动时间内存占用量,内存告警次数CPU使用率页面渲染时间,刷新帧率网络请求时间,流量消耗UI阻塞次数,不可操作时长,主线程阻塞超过400毫秒次数耗电功率对于静...

  5. 开发和常用工具推荐清单 转载

    常说”工欲善其事必先利其器”, 下面的一些工具软件,必能提高你的工作效率。 开发相关 Resharper(收费 […]...

  6. eclipse 中的注释 快捷键 多行注释快捷键 单行注释快捷键 转载

    Eclipse 中的两种注释方法: (1)多行注释(2)单行注释 一、 多行注释快捷键 1:添加注释Ctrl+ […]...

  7. C#通过模板导出Word(文字,表格,图片) 转载 – Poison_heng

    C#通过模板导出Word(文字,表格,图片) 转载 转载地址:https://www.cnblogs.com/ […]...

  8. 卡尔曼滤波器 Kalman Filter (转载) – GladsomeBoy

    卡尔曼滤波器 Kalman Filter (转载) 在学习卡尔曼滤波器之前,首先看看为什么叫“卡尔曼”。跟其他 […]...

随机推荐

  1. 用户画像大数据环境搭建——从零开始搭建实时用户画像(四)

    ​ 本章我们开始正式搭建大数据环境,目标是构建一个稳定的可以运维监控的大数据环境。我们将采用Ambari搭建底 […]...

  2. mysql自定义排序

    场景 业务需要,优惠券列表要求按类型进行排序,但是,类型并不是顺序的,即order by是解决不了问题的 建表 […]...

  3. 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用枚举?

    还使用枚举类型作为返回值,罗老师就白打脸了! 在阅读《阿里巴巴Java开发手册》时,发现有一条关于二方库依赖中 […]...

  4. mysql-5.7.37-winx64解压版安装超详细图文教程

    1.下载: 地址:http://dev.mysql.com/downloads/mysql/ 官网下载较慢,可 […]...

  5. Android WebSocket实现即时通讯功能

    最近做这个功能,分享一下。即时通讯(Instant Messaging)最重要的毫无疑问就是即时,不能有明显的 […]...

  6. 2019年超融合将飞速发展 三大趋势不容错过

    “超融合”这个词语本身听起来像是未来主义。超融合不再只是支持同质虚拟桌面基础设施(VDI)环境的基础架构,如今 […]...

  7. centos终端显示字母重叠

    在使用VMware虚拟机安装linux之后,之后调整了中文显示,但是后来不知道怎么回事在终端显示的字母很多都是 […]...

  8. 深入理解static关键字

    在开始讲static之前,我想让各位看一段有意思的代码: public class Test { static […]...

展开目录

目录导航