我正在尝试为游戏创建寻路算法。基本上,在玩家掷出一个数字之后,我需要确定玩家可以在网格上结束的所有可能位置。在给定的步骤之后,玩家不能直接向后移动,并且玩家每步只能移动一个网格。
问题是,现在我试图通过递归导航图并手动检查每个有效移动来强制解决方案。
伪代码:
// Recursive function for navigating one step at a time.
function navigate($stamina, $coords, $coords_previous)
{
// If the movement stamina has not been spent.
if ($stamina != 0)
{
// Note: there may be less than four neighboring
// cells in a given location due to obstacles.
foreach ($neighboring_cells as $coords_neighboring)
{
// If the coordinates of the neighbor are not the same as the
// coordinates of the previous move (we can't move backwards)
if ($coords_neighboring != $coords_previous)
{
$stamina--;
// Recurse.
navigate($stamina, $coords_neighboring, $coords);
}
}
}
else
{
// No more stamina.
// Add $coords to our array of endpoints.
}
}
这适用于小卷(低$stamina
值)。但是,随着$stamina
的增加,这种方法开始变得超级冗余。这是因为玩家可以一遍又一遍地圈起来,以指数方式增加潜在终点的数量。
我的问题是,如何减少上述功能的冗余?
答案 0 :(得分:1)
将状态定义为网格位置和面对面的组合(即,即玩家进入该方向的方向)。这很有用,因为我们可以定义一个给定状态的后继者:特别是那些相邻网格位置(有适当的面板)而不是玩家刚来的那个。
然后计算 n 步骤中可到达的状态集。对于 n = 0,这只是玩家的初始位置(如果第一个移动可以在任何方向,则使用特殊的&#34;没有面对&#34;值)。要为 n +1计算它,请从上一组中的每个状态生成所有有效移动,丢弃任何重复项。当您到达<form action="Page2.php" name="form" method="POST">
<input type="hidden" name="new" value="1" />
<ul class="errorMessages"></ul>
<div class="form-group row text-left">
<label for="example-date-input" class="col-2 col-form-label">Nama Peralatan: </label>
<div class="col-10">
<div class="form-group">
<div class="form-row">
<div class="col-md-3">
<div class="form-check text-left">
<label class="form-check-label">
<input class="form-check-input" name="item[]" type="checkbox" value="Microphones">
Microphones
</label>
</div>
</div>
<div class="">
<input class="form-control" type="number" name="microphones" value="0" id="example-number-input">
</div>
</div>
</div>
<div class="form-group">
<div class="form-row">
<div class="col-md-3">
<div class="form-check text-left">
<label class="form-check-label">
<input class="form-check-input" name="item[]" type="checkbox" value="Amplifiers">
Amplifiers
</label>
</div>
</div>
<div class="">
<input class="form-control" type="number" name="amplifiers" value="0" id="example-number-input">
</div>
</div>
</div>
<div class="form-group">
<div class="form-row">
<div class="col-md-3">
<div class="form-check text-left">
<label class="form-check-label">
<input class="form-check-input" name="item[]" type="checkbox" value="Loudspeakers">
Loudspeakers
</label>
</div>
</div>
<div class="">
<input class="form-control" type="number" name="loudspeakers" value="0" id="example-number-input">
</div>
</div>
</div>
<div class="form-group">
<div class="form-row">
<div class="col-md-3">
<div class="form-check text-left">
<label class="form-check-label">
<input class="form-check-input" name="item[]" type="checkbox" value="Mixers">
Mixers
</label>
</div>
</div>
<div class="">
<input class="form-control" type="number" name="mixers" value="0" id="example-number-input">
</div>
</div>
</div>
</div>
</div>
<div class="form-group row text-left">
<label for="exampleTextarea" class="col-2 col-form-label">Catatan: </label>
<div class="col-10">
<textarea class="form-control" name="catatan" id="exampleTextarea" rows="3"></textarea>
</div>
</div>
<p style="color:#FF0000;"><?php echo $status; ?></p>
<center><button type="submit" name="submit" class="btn btn-info">Submit</button></center>
</form>
步的集合时,只需丢弃面板(以及任何重复的位置)。
这类似于图形上的广度优先搜索,其顶点是状态,其边缘将状态连接到其后继状态。但是,在这里我们不要忽略一个状态的新(更长)路径,因为某些位置可能只能通过循环返回(在完全 $stamina
步骤!)。还可以包括该状态下的剩余耐力(并且定义没有边缘离开0左移的状态);然后你会进行正常的图搜索并收集所有的叶子。
在任何一种情况下,这些都可能是implicit graphs,但算法更直接,而不是图形。