回 帖 发 新 帖 刷新版面

主题:[讨论]讨论一下五子棋的估价函数吧

今天写了个五子棋的程序(穷举版),智商超弱.最后不知到是我逻辑混乱了还是输出有问题,有点bug,就不放出全部代码来了. 只讨论估价函数吧,下面是我写的value(),方法是横竖斜4个方向扫描4次棋盘,遇到活n就把总值加n^3,活n就是连着的n个相同且没有被堵的子数.但没有考虑间隔的情况和胜利等等...
/////////////////////////////////////////
enum {MAN = -1, BOT = 1};
int board[20][20];

// no special meaning :(
inline void quote (int &totv, int &n, int &last, int &i, int &j)
{
    n += board[i][j];
    if (board[i][j] != last) {
        last = board[i][j];
        totv += n*n*n;
        n = last;
    }
}

int value ()
{
    int totv = 0, last, n;
    int i, j, row, col;

    // col scan
    for (i = 0; i < 19; ++i) {
        n = 0;
        last = board[i][0];
        for (j = 1; j < 20; ++j)
            quote (totv, n, last, i, j);
    }
    // row scan
    for (j = 0; j < 19; ++j) {
        n = 0;
        last = board[0][j];
        for (i = 1; i < 19; ++i)
            quote (totv, n, last, i, j);
    }
    // left-up to right-down slanting scan
    for (col = 0; col < 17; ++col) {
        n = 0;
        last = board[0][col];
        for (i = 1, j = col + 1; i < 20 && j < 20; ++i, ++j)
            quote (totv, n, last, i, j);
    }
    for (row = 1; row < 17; ++row) {
        n = 0;
        last = board[row][0];
        for (i = row + 1, j = 1; i < 20 && j < 20; ++i, ++j)
            quote (totv, n, last, i, j);
    }
    // left-down to right-up slanting scan
    for (col = 0; col < 17; ++col) {
        n = 0;
        last = board[18][col];
        for (i = 17, j = col + 1; i >= 0 && j < 20; --i, ++j)
            quote (totv, n, last, i, j);
    }
    for (row = 2; row < 18; ++row) {
        n = 0;
        last = board[row][0];
        for (i = row - 1, j = 1; i >= 0 && j < 20; --i, ++j)
            quote (totv, n, last, i, j);
    }

    return totv;
}

回复列表 (共2个回复)

沙发

估价函数要能准确的判断获胜的局面,给它一个最高分,其它都是启发值,要低于最高分。

我觉得可以分两个函数写,一个是某一个空格的价值,也就是单个活n死n的值,还有一个就是对整个局面的评价,就是各个空格价值之和,后者用来估值,前者可以对分支进行启发式搜索。

板凳

间隔怎么能不考虑呢~~~很多时候下五子棋的时候我就是因为看不到间隔而挂掉的~~~
我个人认为,应该对每个空格计算权值,但是还要考虑整个局面,要不然太短视很容易挂掉的~~~
每个空格的权值相对容易计算~~~分致胜性权值、致负性权值、攻击权值、防守权值~~~就是通过空格考虑它周围的棋子布局~~~
整个局面的话~~~就要请教五子棋高手了~~~我认为可以计算一下两头空的连接的棋子数目和~~~
五子棋还有三手两打、五手交换的规则的~~~还是比较复杂的~~~

我来回复

您尚未登录,请登录后再回复。点此登录或注册