我的决战黑白棋从开始编写到现在已经大约经历了1年的时间,其中有几次是重大改编,可以说整个数据结构完全重写了。
    决战黑白棋刚开始的时候使用的是二维数组棋盘,估值函数基于棋子位置价值加行动力、潜在行动力,搜索深度大约是中局6层+终局15层。棋力很不理想,如禁止它进行终局搜索,我自己可以不费太大精力取胜。可见其估值函数是很差的。
    其后的一次重大改写是将二维棋盘改成了一维棋盘,是速度提高了20%左右,但由于估值函数的问题,棋力并没有加强,直到我改写估值函数。
    其后的估值函数在相当长的一段时间内都是棋子位置价值+行动力+潜在行动力+稳定子。这个估值函数可以说是比较强的,加上对终局搜索的改写,终局搜索加入奇偶搜索后速度大大加快。这时的决战黑白棋可以中局搜索8、9层,终局可以达到18-20层。这样的棋力已经非常强了。人要取胜几乎是没有可能的,我下载了国内的十多个著名的黑白棋软件,只有《伤心黑白棋3.1》和shines的《黑白棋世界1.0》能够战胜我的决战黑白棋。其中《黑白棋世界1.0》和《决战黑白棋》的棋力相差无几,但《伤心黑白棋3.1》要强很多。
    很早就听说《伤心黑白棋3.1》是基于模板估值的,并且据说搜索深度最大达到了中局18层+终局20层,终局20层对我来说到没什么,但中局18层却是无法想象。想必一定采用了前期剪枝。但无论是前期剪枝还是模板估值我那时都还不懂,对于这个号称国内第一强的《伤心黑白棋3.1》一点办法都没有。
    于是开始研究模板估值的论文,期待着能够大幅度的提高棋力。关于模板估值的文档很少,中文的更是没有。只找到一篇,英文的,而且讲的也不是很详细。断断续续的看了很久也没能掌握到要领,一直也没能付诸实践。后来用了一套简单的模板估值方法,基本思想是用各个模板的胜率来估值。但是实践效果非常差,8层搜索的棋力和我自己差不多。最后只好作罢。
    不久前,在stkim的blog上看到说有Booby Reversi的算法,当时很是吃惊,Booby Reversi是一个日本人编写的,棋力虽比不上《伤心黑白棋3.1》,但比我的决战黑白棋要强很多了。但是并没见过Booby Reversi公开算法或代码之类的。后来才知道是Booby Reversi有个Java版本的,可以反编译。于是我也反编译了一次,很复杂,又没有注释,完全看不懂。不过没费多大劲就把他改编成了C语言的,试了一下棋力,和预想的差不多,比《伤心黑白棋3.1》要差,但比我原来的决战黑白棋要强。现在我拿这个算法在GGS上可以打到1600分左右,原来只有1400多分。
    但当时毕竟没看懂这个算法,很遗憾。现在看来,他可能也是统计了大量的棋局,然后分析、逼近。只是不清楚他用了哪些参数来估值的。但由于对这个程序的分析,我几乎是突然间明白了模板估值的参数计算,就是通过统计大量的棋局,然后分析、逼近。当时真的很高兴,只用了周末的一天就把程序编写出来了。当时预计这个程序要连续运行4天左右,于是满怀期待的等待……2天后,程序结束了,比我预计的快,后来分析其原因,大概是因为模板中有很多在统计的棋局中从来没有遇到过,这样速度会快很多,但同时会导致模板参数计算精确度下降。后来试验了棋力,很失望,比Booby Reversi要差很多,比shines的《黑白棋世界1.0》也要差。没想到从未遇到的模板会如此大的影响整体棋力。第一次模板估值就这样失败了。
    目前我正在进行第二次模板参数的计算,主要区别是每个阶段的模板参数要和前后两个阶段的局面相关,估计效果会好一些,但计算还没结束,只能等待……但预计棋力也不会有大幅度的提高,因为我已经知道这个方法的弱点,并想到了新的方法。

编写强力黑白棋的历程相关推荐

  1. c语言写的黑白棋游戏代码,C语言编写的黑白棋游戏源代码..doc

    C语言编写的黑白棋游戏源代码. C语言编写的黑白棋游戏/*3.3.4 源程序*/ #include "graphics.h" /*图形系统头文件*/ #define LEFT 0x ...

  2. 黑白棋代码Linux程序,C语言编写的黑白棋游戏源代码.doc

    PAGE PAGE 1 C语言编写的黑白棋游戏源代码 /*3.3.4 源程序*/ #include "graphics.h" /*图形系统头文件*/ #define LEFT 0x ...

  3. 沙洋有几个微服务群_QQ群控系统强力黑科技,助力你实现自动化获客

    聚合群控,可以说是目前最热门的群控系统了,以为聚合群控系统的功能性非常强大而受到欢迎,在工作上不仅能够给大家带来巨大的方便,还能帮助人们实现批量化操作,因此聚合群控系统成为很多人一直梦寐以求的群控软件 ...

  4. c语言编黑白棋游戏,怎样编制黑白棋(2)

    剪枝 Alpha-Beta剪枝(Alpha-Beta Purning) 新的问题出现了:对于一般的最大最小搜索,即使每一步只有很少的下法,搜索位置的数目也会随着搜索深度呈级数级增长.在大多数的中局棋形 ...

  5. c语言大作业黑白棋,C语言编写黑白棋游戏源代码.doc

    C语言编写的黑白棋游戏源代码 /*3.3.4 源程序*/ #include "graphics.h" /*图形系统头文件*/ #define LEFT 0x4b00 /*光标左键值 ...

  6. 网络游戏——强联网游戏

    转自:http://note.youdao.com/share/?id=7aa4edb9034c543d0db12c32425fd649&type=note 在强联网这几章中,我们要介绍一些非 ...

  7. 用C++编写我的第一个CGI程序

    文章目录 前言 一.CGI 二.使用步骤 1.安装Apache 2.编写我的第一个CGI程序 3.访问我的第一个CGI程序 4.补充 4.1 URL的含义 4.2 我的第一个CGI程序为什么这么写 4 ...

  8. 代码“可读性”到底有多重要?

    嵌入式处理器发展到今天,速度已经很可观了.而产品的快速迭代,要求技术积累和技术细分,代码可继承性,即"可读性"的要求会越来越高. 易读!易读!易读!! 倘若对自己代码有要求,你会发 ...

  9. 数据库设计思想深究----Mysql(图文)

    在探索开始前,我们先试想一个问题:存储为什么要分缓存与磁盘? 一.为什么要区分缓存与磁盘? 我们利用高级语言,编写逻辑,最终被解释为指令集合,委托CPU去处理. 根据计算机组成原理,我们知道CPU在执 ...

最新文章

  1. win2003辅助域服务器相关几个错误日志的解决办法
  2. (iOS)sqlcipher和FMDB的使用总结(原创)
  3. 为了缅怀Borland Delphi!!!
  4. breakout room at teams
  5. Android.自定义控件的实现 (转载)
  6. ECCV18 Oral | CornerNet目标检测开启预测“边界框”到预测“点对”的新思路
  7. python3 urlencode及urldecode
  8. [20141124]sql server密码过期,通过SSMS修改策略报错
  9. Java一次跳出多重循环
  10. mysql 接收中文字符,MYSQL匹配中文字符
  11. K8S你知道,K9S你可能也知道,那Lens呢?
  12. C# winform中使窗体最小化(NotifyIcon)
  13. 华为云数据容灾方案助力中小企业发展
  14. X1000代码烧写配置
  15. CentOS在ssh远程重装系统的步骤
  16. pmp复习资料链接-2021.06.20考试(中培)
  17. 腾讯小程序 java编写_微信小程序 使用腾讯地图SDK详解及实现步骤
  18. 一文讲透智慧农业,一滴水也没有的超级干货
  19. 如何运用VR3d模型线上展示构建博物馆展厅与展馆
  20. 【好工具】Sourcegraph助你网页端快速浏览项目代码

热门文章

  1. 【imx6ull】视频监控项目(usb摄像头+ffmepeg)
  2. 纤亿通带你去看空分复用光纤技术突破
  3. 如何运行一个web程序
  4. 44所高校入选!分布式智能计算项目名单公示
  5. latex 引用公式
  6. LPC1788单沿pwm原理和配置
  7. 计算机考研面试------简历的制作
  8. css兼容 IE浏览器字号太小
  9. android串口编程实例_PLC编程由浅到深 | 如何搞懂西门子PLC脉冲输出
  10. 计算机分析建筑风,武汉城住宅小区风环境计算机模拟分析-图学学报.PDF