...
This commit is contained in:
@@ -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()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,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
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user