优雅地验证了迷宫边缘的一块

时间:2015-09-27 11:16:54

标签: algorithm

让我们考虑一下玩家在n网格上有x*y件数的游戏。玩家也可以向任何方向移动他的棋子(northsouthnorth-east等......)。让我们假设唯一的规则是玩家(当他决定移动时)必须尽可能多地移动一块。

ooooo
.....
.....
.....
.....

玩家移动第一件

.oooo
.....
.....
.....
o....

要做出这样的功能(暂时忽略玩家可以移动他的作品的其他方向)我们有:

while(!AtEdge()){
  move()
}

但是,必须配置此AtEdge以根据行进方向检查作品是否处于边缘。例如:

o.....
......
......

如果方向为northwestnorth-west,则第一件位于边缘,但沿任何其他方向前进都很方便。

我现在的想法是,我需要一个switch语句来根据行进方向检查该作品是否为AtEdge()。但是我还需要move函数的switch语句。

switch(direction){
  case NORTH_EAST: //code to move north-east
}

这导致16个Switch语句,但如果游戏是3D,那么数字会成倍增加。是否有更优雅的解决方案来实现我所描述的?有没有更好的方法来检查这件作品是否可以根据旅行方向进一步移动?

1 个答案:

答案 0 :(得分:0)

x*y网格中的位置可以用坐标0 <= px < x0 <= py < y表示。 (您也可以选择1 <= px <= x1 <= py <= y,但从索引/坐标0开始更为常见。)

向邻近字段的单个移动可以由向量(mx my)表示,其中mx, my具有每个值-1,0,1;组合(0 0)被排除在外。

现在移动只是意味着将移动向量添加到给出

的位置
px_new = px + mx
py_new = py + my

检查新位置是否在电路板内部可以通过以下方式完成:

inside = (0 <= px_new) and (px_new < x) and (0 <= py_new) and (py_new < y)