Hi,
ich probiere gerade, eine übersichtliche und vielseitige A*-Lib zu machen, jedoch scheitert VS aus irgendeinem bescheuerten Grund anscheinend daran, dass ich meine Klassen von der Hauptcodedatei in eine andere verschieben möchte. Bisher war alles ein richtiger Bandwurm, hier mal der Code (die eigentlichen Funktionen sind noch nicht implementiert, allerdings die Grundstruktur:
Original-Code
Das habe ich jetzt in 3 Codefiles auseinandergenommen:
AStar.cs
HeuristicFunction.cs
DirectionCount.cs
Jetzt kriege ich von Visual Studio netterweise dutzende Fehler entgegengeworfen, hier mal alle verschiedenen Fehlertypen:
Fehler
Nummer 1: Tritt bei jeder Solve-/TrySolve-Methode auf, die Signatur der bemängelten Funktion variiert natürlich, manchmal wird auch die Map bemängelt:
Nummer 2: Tritt bei jeder Konstante in der Klasse HeuristicFunction auf:
Hier variieren natürlich wieder die Namen:
Nummer 3-5: Hier wird die Lambda-Funktion bemängelt
Und als ob das noch nicht genug wäre, ist es mir nichtmal möglich, mit dem Rückgängigmachen der Änderungen die Fehler wegzubekommen :cursing:.
Kann mir da vielleicht jemand helfen?
ich probiere gerade, eine übersichtliche und vielseitige A*-Lib zu machen, jedoch scheitert VS aus irgendeinem bescheuerten Grund anscheinend daran, dass ich meine Klassen von der Hauptcodedatei in eine andere verschieben möchte. Bisher war alles ein richtiger Bandwurm, hier mal der Code (die eigentlichen Funktionen sind noch nicht implementiert, allerdings die Grundstruktur:
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Drawing;
- namespace StefansAStarLibrary
- {
- public class AStar
- {
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt (muss sich in der Map befinden)</param>
- /// <param name="end">Der Endpunkt (muss sich in der Map befinden)</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="heuristicFunction">Die Heuristik, die eingesetzt werden soll</param>
- /// <param name="tieBreaker">Der Wert, mit dem der H-Wert multipliziert wird, falls eine entsprechende Heuristische Funktion ausgewählt wurde</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Node start, Node end, DirectionCount movableDirections, HeuristicFunction heuristicFunction, double tieBreaker, out List<Point> pathOutput)
- {
- //Zu Testzwecken, damit keine unnötigen Fehler geworfen werden
- pathOutput = null;
- return false;
- }
- //Die anderen Versionen der Methode, alle verweisen direkt oder indirekt auf die Methode TrySolve(Map, Node, Node, DirectionCount, Heuristic, double, out List<Point>)
- #region OtherVersions
- /*Aufbau
- * Gruppen, immer sortiert nach
- * -TrySolve (Node)
- * -Solve (Node)
- * -TrySolve (Point)
- * -Solve (Point)
- */
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt (muss sich in der Map befinden)</param>
- /// <param name="end">Der Endpunkt (muss sich in der Map befinden)</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Node start, Node end, out List<Point> pathOutput)
- {
- return TrySolve(map, start, end, DirectionCount.Four, HeuristicFunction.Manhattan, 1, out pathOutput);
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <returns>Das Ergebnis der Wegsuche</returns>
- public List<Point> Solve(Map map, Node start, Node end)
- {
- List<Point> Path = new List<Point>();
- if (TrySolve(map, start, end, DirectionCount.Four, HeuristicFunction.Manhattan, 1, out Path))
- {
- return Path;
- }
- else
- {
- throw new Exception("Kein Weg gefunden");
- }
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Point start, Point end, out List<Point> pathOutput)
- {
- throw new NotImplementedException();
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <returns>Das Ergebnis der Wegsuche</returns>
- public List<Point> Solve(Map map, Point start, Point end)
- {
- throw new NotImplementedException();
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt (muss sich in der Map befinden)</param>
- /// <param name="end">Der Endpunkt (muss sich in der Map befinden)</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Node start, Node end, DirectionCount movableDirections, out List<Point> pathOutput)
- {
- return TrySolve(map, start, end, movableDirections, HeuristicFunction.Manhattan, 1, out pathOutput);
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt (muss sich in der Map befinden)</param>
- /// <param name="end">Der Endpunkt (muss sich in der Map befinden)</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <returns>Das Ergebnis der Wegsuche</returns>
- public List<Point> Solve(Map map, Node start, Node end, DirectionCount movableDirections)
- {
- List<Point> Path = new List<Point>();
- if (TrySolve(map, start, end, movableDirections, HeuristicFunction.Manhattan, 1, out Path))
- {
- return Path;
- }
- else
- {
- throw new Exception("Kein Weg gefunden");
- }
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Point start, Point end, DirectionCount movableDirections, out List<Point> pathOutput)
- {
- throw new NotImplementedException();
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <returns>Das Ergebnis der Wegsuche</returns>
- public List<Point> Solve(Map map, Point start, Point end, DirectionCount movableDirections)
- {
- throw new NotImplementedException();
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt (muss sich in der Map befinden)</param>
- /// <param name="end">Der Endpunkt (muss sich in der Map befinden)</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="heuristicFunction">Die Heuristik, die eingesetzt werden soll</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Node start, Node end, DirectionCount movableDirections, HeuristicFunction heuristicFunction, out List<Point> pathOutput)
- {
- return TrySolve(map, start, end, movableDirections, heuristicFunction, 1, out pathOutput);
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt (muss sich in der Map befinden)</param>
- /// <param name="end">Der Endpunkt (muss sich in der Map befinden)</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="heuristicFunction">Die Heuristik, die eingesetzt werden soll</param>
- /// <returns>Das Ergebnis der Wegsuche</returns>
- public List<Point> Solve(Map map, Node start, Node end, DirectionCount movableDirections, HeuristicFunction heuristicFunction)
- {
- List<Point> Path = new List<Point>();
- if (TrySolve(map, start, end, movableDirections, heuristicFunction, 1, out Path))
- {
- return Path;
- }
- else
- {
- throw new Exception("Kein Weg gefunden");
- }
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="heuristicFunction">Die Heuristik, die eingesetzt werden soll</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Point start, Point end, DirectionCount movableDirections, HeuristicFunction heuristicFunction, out List<Point> pathOutput)
- {
- throw new NotImplementedException();
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="heuristicFunction">Die Heuristik, die eingesetzt werden soll</param>
- /// <returns>Das Ergebnis der Wegsuche</returns>
- public List<Point> Solve(Map map, Point start, Point end, DirectionCount movableDirections, HeuristicFunction heuristicFunction)
- {
- throw new NotImplementedException();
- }
- #endregion
- }
- /// <summary>
- /// Gibt an, wie viele Bewegungsrichtungen erwägt werden
- /// </summary>
- public enum DirectionCount
- {
- /// <summary>
- /// Stellt 4 Bewegungsrichtungen zur Verfügung
- /// </summary>
- Four,
- /// <summary>
- /// Stellt 8 Bewegungsrichtungen zur Verfügung
- /// </summary>
- Eight
- }
- /// <summary>
- /// Stellt eine Heuristik dar
- /// </summary>
- public class HeuristicFunction
- {
- public Func<Point, Point, double> Function { get; private set; }
- public bool TieBreak { get; private set; }
- /// <summary>
- /// Erstellt eine neue HeuristicFunction-Klasse
- /// </summary>
- /// <param name="functionSource">Die Heuristische Funktion, Form: '(start, end) => H'</param>
- /// <param name="tieBreak">Gibt an, ob TieBreaking aktiviert werden soll</param>
- public HeuristicFunction(Func<Point, Point, double> function, bool tieBreak)
- {
- this.Function = function;
- this.TieBreak = tieBreak;
- }
- /// <summary>
- /// Erstellt eine neue HeuristicFunction-Klasse aus einer Vorlage
- /// </summary>
- /// <param name="functionSource">Die Vorlage</param>
- /// <param name="tieBreak">Gibt an, ob TieBreaking aktiviert werden soll</param>
- public HeuristicFunction(HeuristicFunction functionSource, bool tieBreak)
- {
- this.Function = functionSource.Function;
- this.TieBreak = tieBreak;
- }
- /// <summary>
- /// Die Manhattan-Heuristik
- /// </summary>
- public static const HeuristicFunction Manhattan =
- new HeuristicFunction((start, end) => Math.Abs(start.X - end.X) + Math.Abs(start.Y - end.Y), false);
- /// <summary>
- /// Die Diagonal-Heuristik
- /// </summary>
- public static const HeuristicFunction Diagonal =
- new HeuristicFunction((start, end) => Math.Max(Math.Abs(start.X - end.X), Math.Abs(start.Y - end.Y)), false);
- /// <summary>
- /// Die Euclidean-Heuristik
- /// </summary>
- public static const HeuristicFunction Euclidean =
- new HeuristicFunction((start, end) => Math.Sqrt(Math.Pow(start.X - end.X, 2) + Math.Pow(start.Y - end.Y, 2)), false);
- /// <summary>
- /// Die Euclidean-Sqared-Heuristik
- /// </summary>
- public static const HeuristicFunction EuclideanSqared =
- new HeuristicFunction((start, end) => Math.Pow(start.X - end.X, 2) + Math.Pow(start.Y - end.Y, 2), false);
- }
- }
Das habe ich jetzt in 3 Codefiles auseinandergenommen:
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Drawing;
- namespace StefansAStarLibrary
- {
- public class AStar
- {
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt (muss sich in der Map befinden)</param>
- /// <param name="end">Der Endpunkt (muss sich in der Map befinden)</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="heuristicFunction">Die Heuristik, die eingesetzt werden soll</param>
- /// <param name="tieBreaker">Der Wert, mit dem der H-Wert multipliziert wird, falls eine entsprechende Heuristische Funktion ausgewählt wurde</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Node start, Node end, DirectionCount movableDirections, HeuristicFunction heuristicFunction, double tieBreaker, out List<Point> pathOutput)
- {
- //Zu Testzwecken, damit keine unnötigen Fehler geworfen werden
- pathOutput = null;
- return false;
- }
- //Die anderen Versionen der Methode, alle verweisen direkt oder indirekt auf die Methode TrySolve(Map, Node, Node, DirectionCount, Heuristic, double, out List<Point>)
- #region OtherVersions
- /*Aufbau
- * Gruppen, immer sortiert nach
- * -TrySolve (Node)
- * -Solve (Node)
- * -TrySolve (Point)
- * -Solve (Point)
- */
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt (muss sich in der Map befinden)</param>
- /// <param name="end">Der Endpunkt (muss sich in der Map befinden)</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Node start, Node end, out List<Point> pathOutput)
- {
- return TrySolve(map, start, end, DirectionCount.Four, HeuristicFunction.Manhattan, 1, out pathOutput);
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <returns>Das Ergebnis der Wegsuche</returns>
- public List<Point> Solve(Map map, Node start, Node end)
- {
- List<Point> Path = new List<Point>();
- if (TrySolve(map, start, end, DirectionCount.Four, HeuristicFunction.Manhattan, 1, out Path))
- {
- return Path;
- }
- else
- {
- throw new Exception("Kein Weg gefunden");
- }
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Point start, Point end, out List<Point> pathOutput)
- {
- throw new NotImplementedException();
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <returns>Das Ergebnis der Wegsuche</returns>
- public List<Point> Solve(Map map, Point start, Point end)
- {
- throw new NotImplementedException();
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt (muss sich in der Map befinden)</param>
- /// <param name="end">Der Endpunkt (muss sich in der Map befinden)</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Node start, Node end, DirectionCount movableDirections, out List<Point> pathOutput)
- {
- return TrySolve(map, start, end, movableDirections, HeuristicFunction.Manhattan, 1, out pathOutput);
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt (muss sich in der Map befinden)</param>
- /// <param name="end">Der Endpunkt (muss sich in der Map befinden)</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <returns>Das Ergebnis der Wegsuche</returns>
- public List<Point> Solve(Map map, Node start, Node end, DirectionCount movableDirections)
- {
- List<Point> Path = new List<Point>();
- if (TrySolve(map, start, end, movableDirections, HeuristicFunction.Manhattan, 1, out Path))
- {
- return Path;
- }
- else
- {
- throw new Exception("Kein Weg gefunden");
- }
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Point start, Point end, DirectionCount movableDirections, out List<Point> pathOutput)
- {
- throw new NotImplementedException();
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <returns>Das Ergebnis der Wegsuche</returns>
- public List<Point> Solve(Map map, Point start, Point end, DirectionCount movableDirections)
- {
- throw new NotImplementedException();
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt (muss sich in der Map befinden)</param>
- /// <param name="end">Der Endpunkt (muss sich in der Map befinden)</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="heuristicFunction">Die Heuristik, die eingesetzt werden soll</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Node start, Node end, DirectionCount movableDirections, HeuristicFunction heuristicFunction, out List<Point> pathOutput)
- {
- return TrySolve(map, start, end, movableDirections, heuristicFunction, 1, out pathOutput);
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt (muss sich in der Map befinden)</param>
- /// <param name="end">Der Endpunkt (muss sich in der Map befinden)</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="heuristicFunction">Die Heuristik, die eingesetzt werden soll</param>
- /// <returns>Das Ergebnis der Wegsuche</returns>
- public List<Point> Solve(Map map, Node start, Node end, DirectionCount movableDirections, HeuristicFunction heuristicFunction)
- {
- List<Point> Path = new List<Point>();
- if (TrySolve(map, start, end, movableDirections, heuristicFunction, 1, out Path))
- {
- return Path;
- }
- else
- {
- throw new Exception("Kein Weg gefunden");
- }
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="heuristicFunction">Die Heuristik, die eingesetzt werden soll</param>
- /// <param name="pathOutput">Hier wird das Ergebnis ausgegeben, falls der Lösungsversuch erfolgreich ist</param>
- /// <returns>Ob der Lösungsversuch geklappt hat</returns>
- public bool TrySolve(Map map, Point start, Point end, DirectionCount movableDirections, HeuristicFunction heuristicFunction, out List<Point> pathOutput)
- {
- throw new NotImplementedException();
- }
- /// <summary>
- /// Sucht mithilfe des A*-Algorhytmus einen möglichen Weg vom Start zum Ziel
- /// </summary>
- /// <param name="map">Die Map, in der der Weg gesucht werden soll</param>
- /// <param name="start">Der Startpunkt</param>
- /// <param name="end">Der Endpunkt</param>
- /// <param name="movableDirections">Die Anzahl der Richtungen, in welche sich der Path bewegen darf</param>
- /// <param name="heuristicFunction">Die Heuristik, die eingesetzt werden soll</param>
- /// <returns>Das Ergebnis der Wegsuche</returns>
- public List<Point> Solve(Map map, Point start, Point end, DirectionCount movableDirections, HeuristicFunction heuristicFunction)
- {
- throw new NotImplementedException();
- }
- #endregion
- }
- }
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Drawing;
- namespace StefansAStarLibrary
- {
- /// <summary>
- /// Stellt eine Heuristik dar
- /// </summary>
- public class HeuristicFunction
- {
- public Func<Point, Point, double> Function { get; private set; }
- public bool TieBreak { get; private set; }
- /// <summary>
- /// Erstellt eine neue HeuristicFunction-Klasse
- /// </summary>
- /// <param name="functionSource">Die Heuristische Funktion, Form: '(start, end) => H'</param>
- /// <param name="tieBreak">Gibt an, ob TieBreaking aktiviert werden soll</param>
- public HeuristicFunction(Func<Point, Point, double> function, bool tieBreak)
- {
- this.Function = function;
- this.TieBreak = tieBreak;
- }
- /// <summary>
- /// Erstellt eine neue HeuristicFunction-Klasse aus einer Vorlage
- /// </summary>
- /// <param name="functionSource">Die Vorlage</param>
- /// <param name="tieBreak">Gibt an, ob TieBreaking aktiviert werden soll</param>
- public HeuristicFunction(HeuristicFunction functionSource, bool tieBreak)
- {
- this.Function = functionSource.Function;
- this.TieBreak = tieBreak;
- }
- /// <summary>
- /// Die Manhattan-Heuristik
- /// </summary>
- public static const HeuristicFunction Manhattan =
- new HeuristicFunction((start, end) => Math.Abs(start.X - end.X) + Math.Abs(start.Y - end.Y), false);
- /// <summary>
- /// Die Diagonal-Heuristik
- /// </summary>
- public static const HeuristicFunction Diagonal =
- new HeuristicFunction((start, end) => Math.Max(Math.Abs(start.X - end.X), Math.Abs(start.Y - end.Y)), false);
- /// <summary>
- /// Die Euclidean-Heuristik
- /// </summary>
- public static const HeuristicFunction Euclidean =
- new HeuristicFunction((start, end) => Math.Sqrt(Math.Pow(start.X - end.X, 2) + Math.Pow(start.Y - end.Y, 2)), false);
- /// <summary>
- /// Die Euclidean-Sqared-Heuristik
- /// </summary>
- public static const HeuristicFunction EuclideanSqared =
- new HeuristicFunction((start, end) => Math.Pow(start.X - end.X, 2) + Math.Pow(start.Y - end.Y, 2), false);
- }
- }
C#-Quellcode
- using System;
- namespace StefansAStarLibrary
- {
- /// <summary>
- /// Gibt an, wie viele Bewegungsrichtungen erwägt werden
- /// </summary>
- public enum DirectionCount
- {
- /// <summary>
- /// Stellt 4 Bewegungsrichtungen zur Verfügung
- /// </summary>
- Four,
- /// <summary>
- /// Stellt 8 Bewegungsrichtungen zur Verfügung
- /// </summary>
- Eight
- }
- }
Jetzt kriege ich von Visual Studio netterweise dutzende Fehler entgegengeworfen, hier mal alle verschiedenen Fehlertypen:
Nummer 1: Tritt bei jeder Solve-/TrySolve-Methode auf, die Signatur der bemängelten Funktion variiert natürlich, manchmal wird auch die Map bemängelt:
Quellcode
- Variante 1:
- Inkonsistenter Zugriff: Parametertyp 'StefansAStarLibrary.Node' ist weniger zugreifbar als Methode 'StefansAStarLibrary.AStar.TrySolve(StefansAStarLibrary.Map, StefansAStarLibrary.Node, StefansAStarLibrary.Node, StefansAStarLibrary.DirectionCount, StefansAStarLibrary.HeuristicFunction, double, out System.Collections.Generic.List<System.Drawing.Point>)'
- Variante 2:
- Inkonsistenter Zugriff: Parametertyp 'StefansAStarLibrary.Map' ist weniger zugreifbar als Methode 'StefansAStarLibrary.AStar.TrySolve(StefansAStarLibrary.Map, StefansAStarLibrary.Node, StefansAStarLibrary.Node, StefansAStarLibrary.DirectionCount, StefansAStarLibrary.HeuristicFunction, double, out System.Collections.Generic.List<System.Drawing.Point>)'
Nummer 2: Tritt bei jeder Konstante in der Klasse HeuristicFunction auf:
Hier variieren natürlich wieder die Namen:
Nummer 3-5: Hier wird die Lambda-Funktion bemängelt
Und als ob das noch nicht genug wäre, ist es mir nichtmal möglich, mit dem Rückgängigmachen der Änderungen die Fehler wegzubekommen :cursing:.
Kann mir da vielleicht jemand helfen?