我想制作一个游戏,游戏可以移动。当我点击一个游戏片时它会显示所有可用的动作我可以这样:
红色表示合法移动,深灰色表示墙。
我在其中创建了一个网格和按钮。当我单击按钮时,我将可用的步数减去或添加到网格中的按钮索引。例如,如果我的棋子可以移动3个位置,我会从按钮的索引中减去3并获得该棋子左侧的可用位置。然后我对所有其他方向做同样的事情。它看起来像这样:
For each i as button in grid
Select case grid.indexof(i)
Case grid.getindex(currentPlayingPiece) - 3 'Left
i.background = brushes.red
Case grid.getindex(currentPlayingPiece) + 3 'Right
i.background = brushes.red
Case grid.getindex(currentPlayingPiece) - grid.columndefinitions.count 'Top
i.background = brushes.red
...
Next
使用这种方法,获得所有可用的移动速度非常慢且很麻烦,并且不能直观地获得顶部和底部移动。此外,如果路上有一堵墙,后面有一个可用的地点,它表明我可以移动到它。所以我的问题是:有没有更好的方法来实现这个目标?
答案 0 :(得分:0)
您可以从网格中创建一个图形,其中网格中的每个单元格将与其邻域(上下左下)相邻,然后您应该为每个顶点指定一个值(例如,如果占用,则为1)不)。当用户单击网格中的特定单元格时,您会发现从那里开始的所有可能路径的总权重为0.
答案 1 :(得分:0)
如果您不想使用涉及图形或类似解决方案的“高级”算法,您可以尝试一些更简单的方法。
首先,创建变量而不是多次调用getIndex()可能会节省几个周期。
其次,我会尝试使用每个位置的绝对值进行评估,因此计算距离而不必为每个方向检查一次(+或 - );也许是这样的:
dim currentButtonIndex as Integer = grid.getIndex(currentPlayingPiece)
For each i as button in grid
dim indexToEvaluate as Integer = grid.indexOf(i)
If (Math.Abs(indexToEvaluate - currentButtonIndex) = 3) Then
i.background = brushes.red
End If
Next