2016-02-28 44 views
0

我已经开始编写一个bot来玩Gomoku。简而言之,每个球员都会尝试连续得到5个tolkens线。该游戏在15 * 15板上播放。Java。高效检查原始数据中的获胜条件

通过排气搜索找到胜利是第一项任务。

我应该用一维或二维阵列来代表电路板吗? 2D似乎更自然,但1D阵列可能会更快。

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

我考虑过制作一个数组。

赢[i] [j] = [P1,P2,P3,P4,P5],其中赢得[i]是(该组获奖连击)& &(具有一个tolken在第i个位置)。

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

另外,如何通过分叉动作来解释所有获胜连击?获胜连击总数会相当大?我应该转而进行实时评估吗?

谢谢你在前进, 斯捷潘

+1

您应该使用二维数组。如果您使用15 * 15阵列,我认为您不应该对资源进行大量的思考。编写简单易读的代码更好。 – coolguy

回答

0

我应该使用一维或二维数组?

我认为你可以是1维或2维数组,并且每个(i,j)都可以访问你的单元格。在1D中,您必须编码才能找到阵列的正确索引,而在2D中,只需访问您的单元格即可。 所以在这个示例代码中,我使用了一个2D数组。

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

你必须经常检查固定值(例如布尔值或数字)的单元格值,同等语句的最低组装结构是检查零标志。所以我认为最有效的isEqual是布尔值。

所以在此示例代码中,我使用布尔值。由于Gomoku有2名玩家,每个单元格可以有3个值(黑色,怀特,空白),但是我们可以为每个玩家使用2个布尔数组,每个单元格对于该玩家有2个值(石头,空)。

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

请查看这篇文章的想法:
“五子棋的新搜索技术解决了”(1993)

简而言之,

(1)蛮力2层深的搜索是一种廉价和肮脏的做法,但有一个更好的办法
(2)每当强迫动作涉及您可以运行在10-20层深的搜索第二
(3)人的专业人士依靠这一点;你的机器人应该使用它,以及

希望这有助于。