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" @page "/simulation"
@inject GameSimulationService SimService @inject GameSimulationService SimService
@implements IDisposable
<PageTitle>Ecology Simulation</PageTitle> <PageTitle>Ecology Simulation</PageTitle>
@@ -213,8 +212,5 @@ else
return lines; return lines;
} }
public void Dispose()
{
}
} }
+33 -9
View File
@@ -165,7 +165,7 @@ public class GameSimulationService
} }
else else
{ {
var target = FindBestTravelTarget(region, r => r.PreyMeeples > 0); var target = FindBestTravelTarget(region, r => r.PreyMeeples);
if (target != null) if (target != null)
{ {
int traveling = region.PredatorMeeples; int traveling = region.PredatorMeeples;
@@ -190,7 +190,7 @@ public class GameSimulationService
} }
else else
{ {
var target = FindBestTravelTarget(region, r => r.FloraMeeples > 0); var target = FindBestTravelTarget(region, r => r.FloraMeeples);
if (target != null) if (target != null)
{ {
int traveling = region.PreyMeeples; int traveling = region.PreyMeeples;
@@ -201,35 +201,59 @@ 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 var direct = region.Connections
.Select(name => Data.Regions.FirstOrDefault(r => r.Name == name)) .Select(name => Data.Regions.FirstOrDefault(r => r.Name == name))
.OfType<RegionState>() .OfType<RegionState>()
.Where(r => hasResource(r)) .Where(r => resourceCount(r) > 0)
.ToList(); .ToList();
if (direct.Count > 0) 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 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) while (queue.Count > 0)
{ {
var currentName = queue.Dequeue(); var currentName = queue.Dequeue();
if (!visited.Add(currentName)) continue;
var current = Data.Regions.FirstOrDefault(r => r.Name == currentName); var current = Data.Regions.FirstOrDefault(r => r.Name == currentName);
if (current == null) continue; 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) foreach (var conn in current.Connections)
{ {
if (!visited.Contains(conn)) if (!visited.Contains(conn))
{
visited.Add(conn);
prev[conn] = currentName;
queue.Enqueue(conn); queue.Enqueue(conn);
} }
} }
}
return null; return null;
} }