我应该使用一维或二维数组?
我认为你可以是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;
}
}
我写了这段代码的结构,你应该完成其他标记为注释的部分。
我希望这个示例代码可以帮助你。
您应该使用二维数组。如果您使用15 * 15阵列,我认为您不应该对资源进行大量的思考。编写简单易读的代码更好。 – coolguy