1 | 3 | 4 | 10 | 11 |
2 | 5 | 9 | 12 |
19 |
6 | 8 | 13 | 18 | 20 |
7 | 14 | 17 | 21 | 24 |
15 | 16 | 22 | 23 | 25 |
W?l?br /> W?l?br /> W?l?br /> W?l?br /> W?l?br /> W?l?br /> W?l?br /> W?l?br /> W?l?br /> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
(0,0) (1,0) (0,1) (0,2) (1,1) (2,0) (3,0) (2,1) (1,2) (0,3) (0,4) (1,3) (2,2) (3,1) (4,0) (4,1) (3,2) (2,3) (1,4) (2,4) (3,3) (4,2) (4,3) (3,4) (4,4) |
1 | 3 | 4 | 10 | 11 | 21 | 22 | 36 | 37 | 55 |
2 | 5 | 9 | 12 | 20 | 23 | 35 | 38 | 54 | 56 |
6 | 8 | 13 | 19 | 24 | 34 | 39 | 53 | 57 | 72 |
7 | 14 | 18 | 25 | 33 | 40 | 52 | 58 | 71 | 73 |
15 | 17 | 26 | 32 | 41 | 51 | 59 | 70 | 74 | 85 |
16 | 27 | 31 | 42 | 50 | 60 | 69 | 75 | 84 | 86 |
28 | 30 | 43 | 49 | 61 | 68 | 76 | 83 | 87 | 94 |
29 | 44 | 48 | 62 | 67 | 77 | 82 | 88 | 93 | 95 |
45 | 47 | 63 | 66 | 78 | 81 | 89 | 92 | 96 | 99 |
46 | 64 | 65 | 79 | 80 | 90 | 91 | 97 | 98 | 100 |
五子是一U受大众q泛喜爱的游戏,其规则简单,变化多端Q非常富有趣x和消遣性。这里设计和实现了一个h机对下的五子程序,采用了博弈树的方法,应用了剪枝和最大最树原理q行搜烦发现最好的下子位置。介l五子棋E序的数据结构、评分规则、胜负判断方法和搜烦法q程?
一、相关的数据l构 struct Step 其中FIVE_MAX_LINE表示盘面最大的行数?/p> 同时׃需要在递归搜烦的过E中考虑旉和空间有效性,只找出就当前情况来说相对比较好的几个盘面Q而不是对所有的可下子的位置都进行搜索,q里用变量CountList来表C当前搜索中可以选择的所有新的盘面情况对象的集合Q?/p> CList CountList; 二、评分规?
基本的规则如下: 判断是否能成5, 如果是机器方的话l予100000分,如果是h方的话给予-100000 分; 实际上对当前的局面按照上面的规则的顺序进行比较,如果满某一条规则的话,q该局面打分ƈ保存Q然后退则的匚w。注意这里的规则是根据一般的下棋规律的一个ȝQ在实际q行的时候,用户可以d规则和对评分机制加以修正?/p> 三、胜负判?
其中对于Search函数的表C如下:实际上核心的法是一个剪枝过E,其中在这个搜索过E中相关的四个参CؓQ(1Q当前棋局情况Q(2Q当前的下子方,可以是机?max)或者是?min)Q(3Q父节点的值oldValueQ(4Q当前的搜烦深度depth?/p> double Search(CBoardSituationQ? 注意q里的goal(board)函数是用来判断当前盘面是否可以分负,而evlation(board)是对当前的盘面从机器的角度进行打分?/p> 下面是Select函数的介l,q个函数的主要目的是Ҏ PlayerMode情况Q即是机器还是用hq回节点的应有的倹{?/p> double Select(double a,double b,int mode) 五、小l? |