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

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

玩家移动第一个棋子
.oooo
.....
.....
.....
o....

为了实现这样的功能(暂时忽略玩家可以移动其棋子的其他方向),我们有:
while(!AtEdge()){
  move()
}

但是,必须将此AtEdge配置为根据行程方向检查工件是否处于边缘。例如:
o.....
......
......

如果方向是northwestnorth-west的话,第一块就在边上,但是往任何其他方向都是好的。
我现在的想法是,我需要一个switch语句来检查工件是否基于行进方向AtEdge()但是我还需要一个switch语句用于move函数。
switch(direction){
  case NORTH_EAST: //code to move north-east
}

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

最佳答案

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)

10-08 12:41