首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java语言。粗5中中奖条件的有效检查

Java语言。粗5中中奖条件的有效检查
EN

Stack Overflow用户
提问于 2016-02-28 05:52:12
回答 2查看 551关注 0票数 0

我已经开始写机器人来玩Gomoku了。简单地说,每一名球员都试图得分不间断的线五托尔肯。游戏在15*15的棋盘上进行。

通过穷尽搜索在一步内找到一个胜利是第一项任务。

我应该使用一维或二维数组来表示板吗? 2D看起来更自然,但是一维数组可能更快。

什么是资源有效的方式来检查获胜的条件?

我考虑过做一个数组。

wini=p1,p2,p3,p4,p5,wini (获胜组合的集合)&(第一位有一个tolken )。

做这个检查的有效方法是什么?

另外,我如何解释所有通过分叉动作赢得的组合?获胜组合的总数会很大吗?我该搬到空中评估吗。

提前谢谢你,斯特潘

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-28 07:18:57

我是使用一维数组还是二维数组?

我认为您可以使用1或2维数组,使用每一个(i,j)您可以访问您的单元格。在一维中,必须编写代码以找到数组的正确索引,而在2D中,您只需访问单元格即可。因此,在这个示例代码中,我使用了一个2D数组。

什么是资源有效的方式来检查获胜的条件?

您必须用fix值检查单元格值(例如。( booleans或number),而equal语句的最低程序集结构是检查零标志。所以我认为最有效的isEqual是布尔值。

因此,在这个示例代码中,我使用布尔值。

因为Gomoku有两个玩家,每个单元格可以有3个值(黑,鬼魂,空),但是我们可以为每个播放器使用两个布尔数组,每个单元格有两个值(stone,空)。

代码语言:javascript
复制
public class Main {

    final static int row = 15;
    final static int column = 15;
    final static int win_count = 5;

    public static void main(String[] args) {

        boolean[][] board1 = new boolean[row][column];
        boolean[][] board2 = new boolean[row][column];
        /*
         * for each change by player1 in (i,j) in the board. (index start from 0
         * to 14)
         */
        int i = 2;
        int j = 3;
        Boolean win = checkWin(board1, i, j);
        System.out.println("player1 win=" + win);
    }

    private static Boolean checkWin(boolean[][] board1, int i, int j) {
        /**
         * 1) check horizontal
         */
        int leftBound = 0;
        if (j - win_count >= 0)
            leftBound = j - win_count;
        else
            leftBound = 0;

        int rightBound = 0;
        if (j + win_count < column)
            rightBound = j + win_count;
        else
            rightBound = column - 1;

        int hitCount = 0;
        int jk = j;

        // go left
        while (jk >= leftBound && hitCount < win_count) {
            if (board1[i][jk]) {
                hitCount++;
                jk--;
            } else {
                jk = j;
                break;
            }
        }
        // go right

        while (jk <= rightBound && hitCount < win_count) {
            if (board1[i][jk]) {
                hitCount++;
                jk++;
            } else {
                break;
            }
        }

        if (hitCount >= win_count)
            return true;

        /**
         * 2) check vertical
         */

        /**
         * 3) check principal diagonal 
         */

        /**
         * 4) check minor diagonal
         */

        // otherwise:

        return false;
    }

}

我编写了这段代码的结构,您应该完成标记为注释的其他部分。

希望这个示例代码能对你有所帮助。

票数 0
EN

Stack Overflow用户

发布于 2016-03-18 02:52:41

请查阅这篇文章,了解以下观点:

“新搜索技术解决的Go-Moku”(1993)

简而言之,

(1)蛮力2倍深度搜索是一种廉价而肮脏的方法,但有更好的方法。

(2)当涉及到强迫移动时,您可以在一秒钟内进行10-20股深度搜索。

(3)人类专业人员也应依赖这一点,你的机器人也应该利用它。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35679244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档