星月时光阁-五子连珠
// 接口  
//---------------------------------------------------------------------------
//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;
}
 

 NowCan 的智能体: Simple renju AI
 

虎翼网门户通主机大赠送