如何展示合法举措

时间:2011-10-15 15:07:05

标签: wpf vb.net

我想制作一个游戏,游戏可以移动。当我点击一个游戏片时它会显示所有可用的动作我可以这样: enter image description here

红色表示合法移动,深灰色表示墙。

我在其中创建了一个网格和按钮。当我单击按钮时,我将可用的步数减去或添加到网格中的按钮索引。例如,如果我的棋子可以移动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

使用这种方法,获得所有可用的移动速度非常慢且很麻烦,并且不能直观地获得顶部和底部移动。此外,如果路上有一堵墙,后面有一个可用的地点,它表明我可以移动到它。所以我的问题是:有没有更好的方法来实现这个目标?

2 个答案:

答案 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