// 接口
//---------------------------------------------------------------------------
//FIVE.H: FIVE header file
//编写“太极五子”智能体所需头文件
#ifndef FIVE_H
#define FIVE_H
#include <windows.h>
#define BOARD_LINE_NUMBER 15
#define BOARD_POINT_NUMBER BOARD_LINE_NUMBER*BOARD_LINE_NUMBER
//
//定义点阵上每一点数值所代表的意义
//
#define STATUS_EMPTY 0X00
//Side
#define STATUS_BLACK 0X01
#define STATUS_WHITE 0X02
//Win , Lost or Draw
#define STATUS_WIN 0X04
#define STATUS_LOST 0X08
#define STATUS_DRAW 0X0C
//Style
#define STATUS_HUMAN 0X10
#define STATUS_BRAIN 0X20
#define STATUS_NETWORK 0X40
#define STATUS_UNKNOW 0X80
//Mask
#define STATUS_SIDE 0X03
#define STATUS_STYLE 0XF0
//
// 接口函数
//
#if defined(__DLL__) || defined(_DLL)
#define FIVEDLL __declspec(dllexport)
#else
#define FIVEDLL __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*++
描述:
你的名字(别指望我帮你释放内存)
返回:
以0结尾的字符串
--*/
FIVEDLL
const char* __stdcall WhatsYourName(void);
/*++
描述:
给你一个棋子的阵列,你下哪儿?(不许作弊,否则……)
参数:
pbCorrdinateStatus
五子棋阵列,一个指向 15*15 的二维数组指针。数组的每一个元素表示这一点的
状态,可能是上面所定义的一种或几种状态。
bSide
下一步要走棋的一方,STATUS_BLACK 或 STATUS_WHITE
返回:
返回智能体要落子的坐标
--*/
FIVEDLL
POINTS __stdcall WhereYouChess(const BYTE* pbCoordinateStatus, BYTE bSide);
#ifdef __cplusplus
}
#endif
#endif // FIVE_H
下面两个例子简单说明了如何编写这两个接口函数
const char* __stdcall WhatsYourName(void)
{
return "shadowstar"; // 这样? 太简单了;P
}
//
// 感谢 NowCan 写的 WhereYouChess 例子 ,是他提醒我把例子展示给大家的。
//
POINTS __stdcall WhereYouChess(const BYTE *pbCoordinateStatus, BYTE bSide)
{
POINTS pt,rpt;
BYTE lBoard[BOARD_LINE_NUMBER][BOARD_LINE_NUMBER], lSide;
memcpy(lBoard, pbCoordinateStatus, BOARD_POINT_NUMBER);
// 但是lBoard中的内容可能还不是我们程序需要的,因为其中元素的值可能包含了多重
// 含义。而我们的程序只关心颜色参数,这时STATUS_SIDE这个掩码就很重要了。
for(long i=0; i < BOARD_LINE_NUMBER; i++)
{
for(long j=0; j < BOARD_LINE_NUMBER; j++)
{
switch(lBoard[j][i] & STATUS_SIDE)
{
case STATUS_BLACK: //
lBoard[j][i]=BLACK; //BLACK,WHITE,BLANK是我的程序中的定义
break;
case STATUS_WHITE: //
lBoard[j][i]=WHITE; //分别表示黑棋,白棋和空白
break;
case STATUS_EMPTY: //
lBoard[j][i]=BLANK; //
break;
}
}
}
// 现在,lBoard中的值就已经符合我们程序的需要了。
// 但是注意bSide也可能不符合我们程序的需要。
if ((bSide & STATUS_SIDE) == STATUS_BLACK)
{
lSide = BLACK;
}
else if ((bSide & STATUS_SIDE) == STATUS_WHITE)
{
lSide = WHITE;
}
// 现在lSide也符合我们程序的要求了,然后就是搜索最佳落子点。
pt = GetBestPoint(lBoard, lSide);
// 这里还有一个注意点,就是坐标的问题。有可能我们程序得出的(x,y)
// 和这个函数需要返回的(x,y)正好反了。
rpt.x = pt.y; //坐标反一下,当然如果你的程序得出的和这个函数需要返回的一致就更好了。
rpt.y = pt.x;
return rpt;
}