-4
for (int i = 0; i < 3; ++i) {
    for (int k = 0; k < 7; ++k) {
        for (int h = i; h < 4 + i; ++h) {
            result = state.getAt(k, h);
            if (result == 1) {
                ++firstpl;
            }
            if (result == 2) {
                ++secondpl;
            }
            if (firstpl > 0 && secondpl > 0) {
                break;
            }
            //y = k;
        }
        if (firstpl == 0 && secondpl == 0) {
            break;
        } else if (firstpl > secondpl) {
            score += firstpl * firstpl;
            //if(state.getHeightAt(y)-3 < 3) score += 3+firstpl*2;
        } else {
            score -= secondpl * secondpl;
            //if(state.getHeightAt(y)-3 < 3) score -= 3+secondpl*2;
        }

        firstpl = 0;
        secondpl = 0;
    }
}

基本上我有一个 7 x 6 的网格。我正在浏览 7 列并垂直查看每 4 个连续的块。因为向上有6个街区。每列有 3 个四个连续的块。State.getAt(k,h) 接受 ax 和 y 并返回一个值。

4

1 回答 1

0

我不认为你可以改进这一点,除非你能找出这个“状态”的替代表示,允许这个计算被增量地执行。

而且由于您未能正确解释状态或计算的实际含义,因此除了您之外的任何人都很难弄清楚替代方法是否可行。(而且我不会试图从你的代码中逆向工程。)


好的。对于 Connect4,赢/输是 7x6 网格中水平、垂直或对角线的 4 个棋子线。所以你可以做的是将分数状态表示为一个计数器数组,对应于每个列、行和对角线,其中可以制作一条获胜线。(7 + 5 + 4 + 4 = 其中 20 个 => 20 个计数器)然后构造一个从 (x,y) 位置到通过该位置的行索引的静态映射。当您在点 (x,y) 添加检查器时,您会查找计数器并增加它们。当您删除检查器时...递减。

我不确定这与您现有的评分功能有何关系……但我看不出该功能与赢得比赛的策略有何关系。无论哪种方式,您都可以使用上述方法逐步计算分数。

于 2013-05-09T05:13:15.573 回答