五子棋算法详解——解决方案之一
2007-10-27 16:01
274 查看
这里讲述棋盘大小为10×10的人机对战五子棋实现方法,要看完整代码请看Java做的五子棋
1. 概述
玩家每走一步,对于玩家和计算机,都根据获胜表对棋盘各个空棋位进行评分,每个位置的分数与下面这句话有关:该位置所在的每一种获胜组合中已经拥有的棋子数,然后对玩家和计算机产生的分数均衡,以判断计算机是进攻还是防守。
2. 数据结构
10×10的数据,用来记录棋盘状态;
两个获胜表([10][10][192]),也就是获胜组合,因为五个子一线则胜,不在一线上的五个子就不在一个组合中,对于10×10的棋盘获胜的组合有192种,下面将会详细说明,获胜表用来表示棋盘上的每个位置是否在玩家或计算机的获胜组合中;
一个二维数组([2][192]),记录玩家与计算机在各种获胜组合中填入了多少棋子;
两个10×10的数组,用来记录玩家与计算机在各个棋盘位置上的分数,分数高的将是计算机下一步的着法。
3. 计算获胜组合
上图是一个10×10的五子棋棋盘,我们可以得出垂直方向上的获胜组合是10×6=60,同理,水平方向的获胜组合也是60,而两个倾斜方向上的获胜组合是(1+2+3+4+5)×2+6=36,即:
60*2+36*2=192。
4. 评分
用两个数组存储每个棋位的分数,一个是计算机的,另一个是玩家的,表示该位置对于各方是最佳着法的肯定程度,对一个位置的评分就是:遍历该位置所在的每一种获胜组合,根据这个组合中已经拥有的己方棋子数1到4分别加不同分数,最后将这些所有的获胜组合所得出的分数相加就是该位置的分数,下图是对于黑方各棋位的评分(其中的1,2,3,4这几个值要根据实际需要来确定)。
5. 思路
1. 概述
玩家每走一步,对于玩家和计算机,都根据获胜表对棋盘各个空棋位进行评分,每个位置的分数与下面这句话有关:该位置所在的每一种获胜组合中已经拥有的棋子数,然后对玩家和计算机产生的分数均衡,以判断计算机是进攻还是防守。
2. 数据结构
10×10的数据,用来记录棋盘状态;
两个获胜表([10][10][192]),也就是获胜组合,因为五个子一线则胜,不在一线上的五个子就不在一个组合中,对于10×10的棋盘获胜的组合有192种,下面将会详细说明,获胜表用来表示棋盘上的每个位置是否在玩家或计算机的获胜组合中;
一个二维数组([2][192]),记录玩家与计算机在各种获胜组合中填入了多少棋子;
两个10×10的数组,用来记录玩家与计算机在各个棋盘位置上的分数,分数高的将是计算机下一步的着法。
3. 计算获胜组合
● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
● | ● | ● | ● | ● | ● | ● | ● | ● | ● |
60*2+36*2=192。
4. 评分
用两个数组存储每个棋位的分数,一个是计算机的,另一个是玩家的,表示该位置对于各方是最佳着法的肯定程度,对一个位置的评分就是:遍历该位置所在的每一种获胜组合,根据这个组合中已经拥有的己方棋子数1到4分别加不同分数,最后将这些所有的获胜组合所得出的分数相加就是该位置的分数,下图是对于黑方各棋位的评分(其中的1,2,3,4这几个值要根据实际需要来确定)。
0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
0 | 0 | 2 | 0 | 0 | 1 | 0 | 0 | 2 | 0 |
0 | 0 | 0 | 3 | 0 | 1 | 0 | 3 | 0 | 0 |
0 | 0 | 0 | 0 | 4 | 1 | 4 | 0 | 0 | 0 |
0 | 1 | 2 | 3 | 4 | ● | 4 | 3 | 2 | 1 |
0 | 0 | 0 | 0 | 4 | ● | 4 | 0 | 0 | 0 |
0 | 0 | 0 | 3 | 0 | 0 | 0 | 3 | 0 | 0 |
0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 2 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
相关文章推荐
- 五子棋算法详解——解决方案之二
- 嵌入式小波零树(EZW)算法的过程详解和Matlab代码(2)编码过程(081227-补充quantifier程序)
- JPEG图像压缩算法流程详解
- VC6.0找不到SHSQL.dll解决方案详解
- shadow mapping阴影图的算法详解
- 多级树集合分裂(SPIHT)算法的过程详解与Matlab实现(6)解码过程——主程序
- Redis 缓存过期(maxmemory) 配置/算法 详解
- QT五子棋详解之八:min-max优化的负极大值算法兼谈qt内存泄露
- VIM中文乱码原理详解及终极解决方案
- Bootstrap弹出框(modal)垂直居中的问题及解决方案详解
- hadoop的LZO压缩算法配置详解
- 深入串的模式匹配算法(普通算法和KMP算法)的详解
- 算法详解【快速排序】
- 快速幂取模算法详解
- TLD算法详解(一)前言
- 算法之排列算法与组合算法详解
- SIFT算法详解
- 数据挖掘十大经典算法(详解)
- 今日头条推荐算法原理全文详解
- 超级账本PBFT(拜占庭容错)算法详解