Java。有效检查 5 in raw 中的获胜条件
Java. Efficient check for winning condition in 5 in raw
我已经开始编写一个机器人来玩五子棋。简而言之,每个玩家都试图对五个 tolkens 的不间断线进行得分。游戏在15*15的棋盘上进行。
穷尽搜索一招制胜是首要任务。
我应该用一维数组还是二维数组来表示棋盘? 2D 似乎更自然,但 1D 数组可能更快。
查看获胜条件的资源有效方式是什么?
我考虑过做一个数组。
win[i][j]=[p1,p2,p3,p4,p5],其中 win[i] 是(获胜组合的集合)&&(在第 i 个位置有一个 tolken)。
执行此检查的有效方法是什么?
此外,我如何通过分叉动作来计算所有获胜的连击?获胜连击的总数会很大吗?我应该转到即时评估吗?
提前谢谢你,
斯捷潘
Should I use 1D or 2D array?
我认为您可以使用一维或二维数组,并且每个 (i, j) 您都可以访问您的单元格。在 1D 中,您必须编写代码才能找到数组的正确索引,而在 2D 中,您只需访问您的单元格即可。
所以在这个示例代码中我使用了一个二维数组。
What is the resource efficient way to check the winning condition?
您必须经常检查具有固定值(例如布尔值或数字)的单元格值,并且 equal 语句的最低汇编结构正在检查零标志。所以我认为最有效的 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;
}
}
我写了这段代码的结构,你应该完成其他标有注释的部分。
希望此示例代码对您有所帮助。
请查看这篇文章以获取想法:
"Go-Moku Solved by New Search Techniques" (1993)
简而言之,
(1) 强力 2 层深度搜索是一种廉价而肮脏的方法,但有更好的方法
(2) 每当涉及强制移动时,您可以 运行 一秒钟进行 10-20 层深度搜索
(3) 人类专业人员依赖于此;你的机器人也应该使用它
希望对您有所帮助。
我已经开始编写一个机器人来玩五子棋。简而言之,每个玩家都试图对五个 tolkens 的不间断线进行得分。游戏在15*15的棋盘上进行。
穷尽搜索一招制胜是首要任务。
我应该用一维数组还是二维数组来表示棋盘? 2D 似乎更自然,但 1D 数组可能更快。
查看获胜条件的资源有效方式是什么?
我考虑过做一个数组。
win[i][j]=[p1,p2,p3,p4,p5],其中 win[i] 是(获胜组合的集合)&&(在第 i 个位置有一个 tolken)。
执行此检查的有效方法是什么?
此外,我如何通过分叉动作来计算所有获胜的连击?获胜连击的总数会很大吗?我应该转到即时评估吗?
提前谢谢你, 斯捷潘
Should I use 1D or 2D array?
我认为您可以使用一维或二维数组,并且每个 (i, j) 您都可以访问您的单元格。在 1D 中,您必须编写代码才能找到数组的正确索引,而在 2D 中,您只需访问您的单元格即可。 所以在这个示例代码中我使用了一个二维数组。
What is the resource efficient way to check the winning condition?
您必须经常检查具有固定值(例如布尔值或数字)的单元格值,并且 equal 语句的最低汇编结构正在检查零标志。所以我认为最有效的 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;
}
}
我写了这段代码的结构,你应该完成其他标有注释的部分。
希望此示例代码对您有所帮助。
请查看这篇文章以获取想法:
"Go-Moku Solved by New Search Techniques" (1993)
简而言之,
(1) 强力 2 层深度搜索是一种廉价而肮脏的方法,但有更好的方法
(2) 每当涉及强制移动时,您可以 运行 一秒钟进行 10-20 层深度搜索
(3) 人类专业人员依赖于此;你的机器人也应该使用它
希望对您有所帮助。