游戏生活:找邻居
我正在做一个生活的游戏,我做了这个方法来查找附近的邻居游戏生活:找邻居
private int getNeighbours(LifeBoard board, int row, int col){
if(board.get(row+1, col)){
neighbours++;
}
if(board.get(row-1, col)){
neighbours++;
}
if(board.get(row, col+1)){
neighbours++;
}
if(board.get(row, col-1)){
neighbours++;
}
if(board.get(row+1, col+1)){
neighbours++;
}
if(board.get(row-1, col-1)){
neighbours++;
}
if(board.get(row+1, col-1)){
neighbours++;
}
if(board.get(row-1, col+1)){
neighbours++;
}
return neighbours;
}
我觉得,如果它是可怕的编码和它畏缩,所以我的问题是..有没有办法让这个更好?现在,它“排序”的作品,但我想我是否可以用循环来代替。
谢谢。
那么,你可以使用循环,只是明确排除的位置本身(即当x和y偏移均为0):
private int getNeighbours(LifeBoard board, int row, int col) {
int neighbours = 0;
for (int xOffset = -1; xOffset < 2; xOffset++) {
for (int yOffset = -1; yOffset < 2; yOffset++) {
if ((xOffset != 0 || yOffset != 0)
&& board.get(row + yOffset, col + xOffset)) {
neighbours++;
}
}
}
return neighbours;
}
这里假设你的board.get(...)
方法是好的,其值关闭的边缘董事会。
为偏移替代策略:
- 如上,
for (int xOffset = -1; xOffset < 2; xOffset++)
- 使用一个包容上限:
for (int xOffset = -1; xOffset <= 1; xOffset++)
-
使用阵列别处定义:
private static final int[] OFFSETS = { -1, 0, 1 }; ... for (int xOffset : OFFSETS)
我会用'OFFSETS = new int [] {-1,0,1}'和'for(int xOffset:OFFSETS){...}' – njzk2 2014-11-24 16:19:52
@ njzk2:这样做也可以。 – 2014-11-24 16:21:08
@ njzk2:我已将该选项编辑为答案 – 2014-11-24 16:28:31
更好适合codereview.stackexchange.com – 2014-11-24 16:15:55
@Jon Skeet有正确的答案。但是,如果你开始有一个大的领域,你原来的方式将更快地执行,因为你基本上展开了循环,循环展开总是比循环更快。 – markbernard 2014-11-24 16:44:23