我正在构建各种棋盘游戏,目前正处理玩家运动。我想限制玩家,使他们只能在游戏板本身内移动。该板存储在嵌套数组中,Actionscript 3相当于2D数组 - 类似于数组[x] [y]。我知道长度,我知道我想找到的目标。我需要做的就是确定数组中是否存在该目标,以确认玩家是否可以实际移动到该插槽,并返回true或false。有人可以提供任何建议吗?这似乎不是一个非常简单的问题。
答案 0 :(得分:0)
假设你的数组看起来像这样:
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;
}
}
答案 1 :(得分:0)
我没有评论,因为它太长了,虽然这不是一个详尽的答案,只需要澄清一些事情:
它可能是也可能不是模拟2D数组的最佳选择。其他一些选择包括:单个一维数组,您可以在其中访问模数宽度的项目。这样可以加快查找速度,并且许多内置函数可以在数组上运行。缺点是行插入操作 - 你必须自己编写的东西,而在数组数组中插入一行是微不足道的。另一个选择 - 使用Cantor的映射函数(例如:Mapping two integers to one, in a unique and deterministic way),有多个这样的函数和整数哈希表。这样做的好处是可以获得与实际值一样多的空间(如果地图上只有少量元素,则会占用更少的内存)。在这样的数组中搜索项目比在普通数组中快得多(因为你不会查看“空”项 - 这些项甚至不存在。但是,你需要自己编写很多功能。
查找路径是许多算法的主题,所有算法都称为"path finding algorithms"。最好的选择因您的具体情况而异。在您选择一个(或创建自己的)之前,重要的是回答这样的问题:
但是,如果您只是想知道该点是否在矩形边界内,我只需要Rectangle
大小的地图并使用http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/geom/Rectangle.html#containsPoint%28%29 - 这将使您无需编写开关类似于Artiace的回答。