人机版五子棋是很有挑战性的。至今好像没有保证可以取胜的算法,但已经有不少写的很专业的五子棋程序了。我在编写五子棋的过程中参考了不少资料,发现人机五子棋大致有两种策略。在这儿总结一下,与大家共享。先说两种算法,然后介绍一点五子棋的专业知识。有些地方表述不清,望见谅,如有表述不清的地方,可以回帖讨论。

此类算法有一点是相同的,就是要对整个棋局或其中的有效位置进行评价。往往会使用一个分表。而评分表却很难确定,也没有所谓最好的,有人根据经验和测试,总结了不错的评分表,我在程序中都是用的别人的评分表。

第一种方法是很简单的,但是效果也是很好的。从运行结果看,这么简单的方法达到如此的水平,着实让我吃了一惊。当然,这是跟第二种算法比较的感觉。大致思路如下:

评估当前棋局中,哪个位置的得分最高。五子棋要赢,必然要有五个棋子在一起成线,那么我们就可以计算棋盘中每一个五格相连的线,一下称之为五元组。一般情况(包括专业五子棋)下棋盘是15*15的。那么应该是572个五元组。同时,针对五元组中黑子和白子的数量(可以不考虑相对位置)的不同,给该五元组评不同的分。然后每一个位置的得分就是包含这个位置的所有五元组的得分之和。 下面是我的程序中用的表示方法及其评分表。

说明:当五元组为空,分数为7,不为零的原因是,还有跟糟的情况:五元组中既有黑子又有白子,五元组也就是无效了,这时才给0分。这个评分表是我在一个老外的程序中找到的,这是我见到的几个评分表中最出色的。

[c-sharp] view plain copy
  1. // tuple is empty
  2. Blank,
  3. // tuple contains a black chess
  4. B,
  5. // tuple contains two black chesses
  6. BB,
  7. // tuple contains three black chesses
  8. BBB,
  9. // tuple contains four black chesses
  10. BBBB,
  11. // tuple contains a white chess
  12. W,
  13. // tuple contains two white chesses
  14. WW,
  15. // tuple contains three white chesses
  16. WWW,
  17. // tuple contains four white chesses
  18. WWWW,
  19. // tuple does not exist
  20. Virtual,
  21. // tuple contains at least one black and at least one white
  22. Polluted
  23. tupleScoreTable[0] = 7;
  24. tupleScoreTable[1] = 35;
  25. tupleScoreTable[2] = 800;
  26. tupleScoreTable[3] = 15000;
  27. tupleScoreTable[4] = 800000;
  28. tupleScoreTable[5] = 15;
  29. tupleScoreTable[6] = 400;
  30. tupleScoreTable[7] = 1800;
  31. tupleScoreTable[8] = 100000;
  32. tupleScoreTable[9] = 0;
  33. tupleScoreTable[10] = 0;

至于如何有效统计这么多五元组的得分,就自己想吧,我在写的一个程序中第一次写为了便于自己和朋友理解,居然计算了两遍,但是条理清晰。这就是在可读性和效率之间来个折中了。

就这种算法,我写了一个程序,供大家参考:https://github.com/zhijie/Gobang

===============更新=========================

同时还有个中国象棋的源码 https://github.com/zhijie/ChineseChess vc版

后来学习android时,写了个android版的中国象棋,源码如下:

https://github.com/zhijie/ChineseChess4Android

第二种算法是使用正规军中的博弈算法。在极大极小值搜索中应用alpha-beta剪枝。

使用这种算法,就是估计几步之内(步数越多,时间越长,自己根据实际情况决定)放在哪个位置最有利。根据当前局面,评估每一个可以落子的位置,看看在这儿落子后的得分怎样。极大极小值搜索就是在估计自己走的时候,选得分高的,估计别人走的时候,选得分低的,这儿的低是对自己而言的,也就是假设对手选了对他最有利的位置,淡然就是让我们得分最低的位置了。然后这样假设几步,选最好的。因为这样的搜索控件往往太大了,就是用剪枝,对没有必要的走步就不用分析了。

这种算法的评分方式跟第一种不同,第一种方法是评估当前棋局的每一个位置的得分,找最优的。而这里是对假设的每一种走步的局面进行评估,选能够到达最优局面的位置落子。

这种算法属于经典的而且应用很广的算法。很多书上都有介绍。我就不多次一举了。而且我也不一定能说清。

这里给出山东师范大学董红安在2005年的硕士毕业论文中使用的的评分表

有时间我会把这种算法的五子棋写一下

下面提一下五子棋的专业知识

国内已有一些编程比赛是针对博弈的

那么就有了一些规定;在五子棋方面,比赛多使用专业五子棋比赛规则。主要是禁手,为了尽量公平,对先落子的一方(先手)下禁手,就是一些技术不能再用,用则为输。我找了一个禁手的图示

另外一点,为了使自己的程序更智能,先手一般会使用经典开局

因为根据经验,先手的某些开局赢的可能性更大。这种可能性的来源是,这种局面要有尽量多的两个子在一起的情况。这是26种经典开局,可以应用到自己的程序中

人机版五子棋两种算法概述相关推荐

  1. 深度优先搜索(DFS)和广度优先搜索(BFS)两种算法c++

    1.BFS和DFS介绍 深度优先搜索(DFS)和广度优先搜索(BFS)是一种用于遍历或搜索树图的一种算法,在这个过程中保证图或数的每个结点被访问且仅被访问一次,再按照每个结点访问的顺序不同分为深搜和广 ...

  2. 剪拼子字符串——常规、另类两种算法解CSDN竞赛第八期第一小题

    [点击此处跳转笔记正文] Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基 ...

  3. “斐波那契数列”的两种算法

    "斐波那契数列"的两种算法 斐波那契数列有个规律:从第三个数开始,每个数是前两个数之和,比如: 1 1 2 3 5 8 13 21 34 55...... 现在通过两种方式(递归与 ...

  4. ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能

    ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 estimator = PC ...

  5. ML之RFDT:利用RF(RFR)、DT(DTR)两种算法实现对boston(波士顿房价)数据集进行训练并预测

    ML之RF&DT:利用RF(RFR).DT(DTR)两种算法实现对boston(波士顿房价)数据集进行训练并预测 目录 输出结果 实现代码 输出结果 1.两种算法的预测结果 2.回归树的可视化 ...

  6. 在.Net framework下遍历XML文挡树的两种算法

    在阅读ASP.NET_XML深入编程技术 (PDF格式)一书的时候,发现遍历树的两种算法:深度优先和广度优先遍历文挡树,前一种需要使用递归,后者则不需要,本人大学时期数据结构学的不好,每每涉及到树,总 ...

  7. Fletcher-Reevers Conjugate Descent和Steepest Descent两种算法中伪代码的区别

    本文主要用来比较两个算法到底差别在哪里 step Fletcher-Reevers Conjugate Descent Steepest Descent 1st1st1st 选择初始点x(1)选择初始 ...

  8. java进程调度怎么画图,[Java教程]进程调度的两种算法JAVA实现

    [Java教程]进程调度的两种算法JAVA实现 0 2015-10-21 12:00:08 (SJF分为preemptive shortest job first(抢占式)和non-preemptiv ...

  9. 在一个请求分页系统中,假定系统分配给一个作业的物理块数为 3,并且此作业的页面走向为 2、3、2、1、5、2、4、5、3、2、5、2。试用 FIFO和 LRU 两种算法分别计算出程序访问过程中所发生

    页面置换算法 题目: 在一个请求分页系统中,假定系统分配给一个作业的物理块数为 3,并且此作业的页面走向为 2.3.2.1.5.2.4.5.3.2.5.2.试用 FIFO和 LRU 两种算法分别计算出 ...

最新文章

  1. 微软2013暑期实习笔试题目第5题分析
  2. 直播报名 | 官方解读NVIDIA黑科技:StyleGAN的架构与实现
  3. 06_NoSQL数据库之Redis数据库:Redis的高级应用之登录授权和主从复制
  4. java ajax定义_Ajax的定义
  5. 排序算法Java代码实现(二)—— 冒泡排序
  6. 《C和指针》——宏中容易出现的错误
  7. 2-2:python之控制结构
  8. 架构之路 参考MySpace
  9. 技术领导者 第44讲|空降技术高管的“择业七计”
  10. Tenor 和numpy array 相互转换
  11. 电脑远程桌面连接怎么操作?
  12. 实习期运维工程师一些日常问题的汇总
  13. 13.3 跳格子游戏
  14. 一个有趣的反病毒软件测试
  15. thinkphp更新mysql数据库表_ThinkPHP 创建新表、创建数据库讲解
  16. 虚拟空间+AI设计是锦上添花吗?|​聊聊虚拟空间设计
  17. VS2003遇到问题,无法打开d3d9.h
  18. win7 下jlink v8固件修复
  19. 记录我的大疆无人机消费体验
  20. 在对象内部尽量直接访问实例变量 --Effictive Objective-C 抄书

热门文章

  1. iOS 15增加更多新的小组件
  2. Nginx Web 基础入门
  3. 图情论文笔记 | 图书情报档案机构如何助力乡村振兴?
  4. [推荐](穆穆推荐)如果你现在不成功,请看看你是不是选错了老板
  5. MATLAB 最小二乘法
  6. ROC:Receiver operating characteristic Curve接受者操作特征的理解
  7. 高配云计算机平台,云电脑真的来了!小破本也能秒变高配
  8. 43-高级路由:BGP 起源属性:修改为e
  9. 使用eagle导出PCB制造商可用的gerber文件
  10. BigDecimal ROUND_HALF_DOWN精度问题