我正在构建一个棋盘游戏,目前正在处理玩家的运动。我想限制玩家,使他们只能在游戏板本身内移动。棋盘存储在嵌套数组中,Actionscript 3 等效于 2D 数组——如数组 [x][y]。我知道长度,也知道我要寻找的目标。我需要做的就是确定该目标是否存在于数组中,以确认玩家是否可以真正移动到该位置,并返回真或假。任何人都可以提供任何建议吗?这似乎不是一个非常容易的问题。
2 回答
我没有发表评论,因为它太长了,虽然这不是一个详尽的答案,但你需要澄清几件事:
它可能是也可能不是模拟二维数组的最佳选择。其他一些选择包括:单个一维数组,您可以在其中访问项目的模宽度。这样做的好处是查找速度更快,并且许多在数组上工作的内置函数可以开箱即用。缺点是行插入操作 - 您必须自己编写,而将行插入数组数组是微不足道的。另一种选择 - 使用康托尔的映射函数(这里的例子:将两个整数映射到一个,以独特和确定的方式),有不止一个这样的带有整数哈希表的函数。这样做的好处是占用的空间与实际值一样多(如果地图上只有很少的元素,则占用的内存更少)。在这样的数组中搜索项目比在普通数组中搜索要快得多(因为您不会查看“空”项目 - 甚至不存在。但是,您需要自己编写很多功能。
寻找路径是许多算法的主题,这些算法都被称为“路径寻找算法”。最好的选择会因您的情况而异。在你选择一个(或发明你自己的)之前,回答这样的问题很重要:
- 所有运动的成本都相同吗?
- 是否允许搬回去,甚至只是重新访问同一地点?
- 您是否正在寻找能够保证您找到最佳方式或任何方式的解决方案?
- 如果运动不是直截了当的,您是否有可能找到一个估计中间解决方案成本的启发式函数?
- 最后,你在优化什么?速度?记忆?
但是,如果您只是想知道该点是否在矩形边界内,我只需要Rectangle
地图的大小并使用http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash /geom/Rectangle.html#containsPoint%28%29 - 这将使您无需编写类似于 Artiace 答案中的开关。
假设您的数组如下所示:
var board:Array = [
[a,0,0],
[0,b,0],
[0,0,c]
]
然后检查板中间是否存在
if (board[1][1] != 0) {
trace(board[1][1]) // outputs "b"
}
因此,如果您想向b
任何方向移动一个街区,您通常可以尝试...
function move(row:int, col:int, direction:string):void {
switch (direction) {
case "up":
if (row - 1 >= 0 && row - 1 < board.length) {
board[row-1][col] = board[row][col];
board[row][col] = 0;
}
break;
case "down":
if (row + 1 >= 0 && row + 1 < board.length) {
board[row+1][col] = board[row][col];
board[row][col] = 0;
}
break;
case "left":
if (col - 1 >= 0 && col - 1 < board[row].length) {
board[row][col - 1] = board[row][col];
board[row][col] = 0;
}
break;
case "right":
if (col + 1 >= 0 && col + 1 < board[row].length) {
board[row][col + 1] = board[row][col];
board[row][col] = 0;
}
break;
}
}