让我们考虑一个游戏,玩家在n
网格上有x*y
个棋子玩家也可以在任何方向移动他的棋子(north
,south
,north-east
等)。假设唯一的规则是玩家(当他决定移动时)必须尽可能地移动一个棋子。
ooooo
.....
.....
.....
.....
玩家移动第一个棋子
.oooo
.....
.....
.....
o....
为了实现这样的功能(暂时忽略玩家可以移动其棋子的其他方向),我们有:
while(!AtEdge()){
move()
}
但是,必须将此
AtEdge
配置为根据行程方向检查工件是否处于边缘。例如:o.....
......
......
如果方向是
north
,west
或north-west
的话,第一块就在边上,但是往任何其他方向都是好的。我现在的想法是,我需要一个switch语句来检查工件是否基于行进方向
AtEdge()
但是我还需要一个switch语句用于move
函数。switch(direction){
case NORTH_EAST: //code to move north-east
}
这会产生16个
Switch
语句,但是如果游戏是3d的,那么这个数字就会成倍增长。有没有更优雅的解决方案来实现我所描述的?是否有更好的方法检查工件是否可以根据移动方向进一步移动? 最佳答案
x*y
网格中的位置可以用坐标0 <= px < x
和0 <= py < y
表示。(您也可以选择1 <= px <= x
和1 <= 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)