This commit is contained in:
6d486f49
2026-06-12 13:13:06 -04:00
parent 11f45fcf74
commit 96e72df0da
2 changed files with 34 additions and 14 deletions
+1 -5
View File
@@ -1,6 +1,5 @@
@page "/simulation"
@inject GameSimulationService SimService
@implements IDisposable
<PageTitle>Ecology Simulation</PageTitle>
@@ -213,8 +212,5 @@ else
return lines;
}
public void Dispose()
{
}
}
+33 -9
View File
@@ -165,7 +165,7 @@ public class GameSimulationService
}
else
{
var target = FindBestTravelTarget(region, r => r.PreyMeeples > 0);
var target = FindBestTravelTarget(region, r => r.PreyMeeples);
if (target != null)
{
int traveling = region.PredatorMeeples;
@@ -190,7 +190,7 @@ public class GameSimulationService
}
else
{
var target = FindBestTravelTarget(region, r => r.FloraMeeples > 0);
var target = FindBestTravelTarget(region, r => r.FloraMeeples);
if (target != null)
{
int traveling = region.PreyMeeples;
@@ -201,33 +201,57 @@ public class GameSimulationService
}
}
private RegionState? FindBestTravelTarget(RegionState region, Func<RegionState, bool> hasResource)
private RegionState? FindBestTravelTarget(RegionState region, Func<RegionState, int> resourceCount)
{
var direct = region.Connections
.Select(name => Data.Regions.FirstOrDefault(r => r.Name == name))
.OfType<RegionState>()
.Where(r => hasResource(r))
.Where(r => resourceCount(r) > 0)
.ToList();
if (direct.Count > 0)
{
return direct.OrderByDescending(r => r.PreyMeeples + r.FloraMeeples).First();
return direct.OrderByDescending(r => resourceCount(r)).First();
}
// BFS to find nearest region with resource, return first step along path
var visited = new HashSet<string> { region.Name };
var queue = new Queue<string>(region.Connections);
var prev = new Dictionary<string, string>();
var queue = new Queue<string>();
foreach (var conn in region.Connections)
{
if (!visited.Contains(conn))
{
visited.Add(conn);
prev[conn] = region.Name;
queue.Enqueue(conn);
}
}
while (queue.Count > 0)
{
var currentName = queue.Dequeue();
if (!visited.Add(currentName)) continue;
var current = Data.Regions.FirstOrDefault(r => r.Name == currentName);
if (current == null) continue;
if (hasResource(current))
return current;
if (resourceCount(current) > 0)
{
// Walk back to find the first step from the origin region
var step = currentName;
while (prev[step] != region.Name)
step = prev[step];
return Data.Regions.FirstOrDefault(r => r.Name == step);
}
foreach (var conn in current.Connections)
{
if (!visited.Contains(conn))
{
visited.Add(conn);
prev[conn] = currentName;
queue.Enqueue(conn);
}
}
}