我已经开始写机器人来玩Gomoku了。简单地说,每一名球员都试图得分不间断的线五托尔肯。游戏在15*15的棋盘上进行。
通过穷尽搜索在一步内找到一个胜利是第一项任务。
我应该使用一维或二维数组来表示板吗? 2D看起来更自然,但是一维数组可能更快。
什么是资源有效的方式来检查获胜的条件?
我考虑过做一个数组。
wini=p1,p2,p3,p4,p5,wini (获胜组合的集合)&(第一位有一个tolken )。
做这个检查的有效方法是什么?
另外,我如何解释所有通过分叉动作赢得的组合?获胜组合的总数会很大吗?我该搬到空中评估吗。
提前谢谢你,斯特潘
发布于 2016-02-28 07:18:57
我是使用一维数组还是二维数组?
我认为您可以使用1或2维数组,使用每一个(i,j)您可以访问您的单元格。在一维中,必须编写代码以找到数组的正确索引,而在2D中,您只需访问单元格即可。因此,在这个示例代码中,我使用了一个2D数组。
什么是资源有效的方式来检查获胜的条件?
您必须用fix值检查单元格值(例如。( booleans或number),而equal语句的最低程序集结构是检查零标志。所以我认为最有效的isEqual是布尔值。
因此,在这个示例代码中,我使用布尔值。
因为Gomoku有两个玩家,每个单元格可以有3个值(黑,鬼魂,空),但是我们可以为每个播放器使用两个布尔数组,每个单元格有两个值(stone,空)。
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;
}
}我编写了这段代码的结构,您应该完成标记为注释的其他部分。
希望这个示例代码能对你有所帮助。
发布于 2016-03-18 02:52:41
请查阅这篇文章,了解以下观点:
“新搜索技术解决的Go-Moku”(1993)
简而言之,
(1)蛮力2倍深度搜索是一种廉价而肮脏的方法,但有更好的方法。
(2)当涉及到强迫移动时,您可以在一秒钟内进行10-20股深度搜索。
(3)人类专业人员也应依赖这一点,你的机器人也应该利用它。
希望这能有所帮助。
https://stackoverflow.com/questions/35679244
复制相似问题