简单介绍我的五子棋算法

五子棋软件


#1 简单介绍我的五子棋算法 作者:有志青年 发表时间:2006-12-24 8:06:57

应网友之邀,简单介绍我的五子棋xl的思路。
我的五子棋原想起名星浪五子棋,xl是缩写,后来曾以hawk为名发表过。
程序的引擎部分主要采用了以下技术 :

1
置换表

2
历史启发
3 alpha-beta
MTD(f)
4
增量式棋盘

5
增量式估值
6
真假禁手识别
7 VCF
扩展

1,2,3
大家很熟悉,就不说了,下面简单介绍456

[
棋盘结构 ]:

标准五子棋棋盘是15*15=225,为提高效率, 我用了256的数组基本棋盘,因为是最基本的棋盘,所以称之为第一层。其中的16行和16列没用到。


static uint8_t_layer1[256];

这样就能用一个字节的unsigned char做索引,称之为Pos. 低四位是x, 高四位是y. 下面三个个宏可以快速在x,y坐标与一个字节的索引之间相互转换。

#define POSX(p) (uint8_t)((p)&0x0f)
#define POSY(p) (uint8_t)((p)>>4)
#define MAKEPOS(x,y) (uint8_t)(((y)<<4)+(x))

容易想到,可以用3个数字分别表示 黑子,白子和空位 :

#define White 0
#define Black 1
#define Empty 2

由于经常要在黑方和白方之间转换,所以定义了OPP


#define OPP(side) (uint8_t)((~side) &0x01)

还需要经常遍历棋盘,以下两个宏可完成这个工作:

#define ESB(p) for(p=0;p<=(BW-1)*16+BW ;p++) {if(POSX(p)>=BW) continue;
#define ESE() }

这是程序中的一个实例 :

ESB(p);
switch(_layer1[p])
{
case Black: TRACE("[ X ]\t");break;


#2 强中自有强中手 作者:谷家相 发表时间:2006-12-24 13:52:51

好强呀!真叫人佩服!看了有志青年五子棋的算法后,决得算法很深奥,能总结这么多招术,的确不是一般人,还希望在以后多多指教,能通过学习自己的也能达到这样的境界。


#3 Re:简单介绍我的五子棋算法 作者:黄药师 发表时间:2007-4-7 0:35:32

看不懂!

#4 Re:简单介绍我的五子棋算法 作者:谁比我更菜 发表时间:2009-7-26 13:44:54

这个原作者就是陈成涛。