简单介绍我的五子棋算法
#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
大家很熟悉,就不说了,下面简单介绍4,5,6:
[
棋盘结构
]:
标准五子棋棋盘是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
这个原作者就是陈成涛。