Sto cercando di trovare una struttura dati appropriata per rappresentare le navigazioni disponibili tra gli schermi di un gioco.
-
Utilizzando una lista collegata , un nodo può avere solo un nodo dopo di esso: inappropriato.
-
L'uso di un albero sembra all'altezza del lavoro dato che i nodi possono avere molti nodi figli ma è incoerente nel senso che un elemento presumibilmente secondario Opzioni può avere un genitore Titolo come un bambino. Inoltre, come dovrei rappresentare la sequenza infinita del caso Title - > Race - > Titolo - > Corsa ... senza ripetermelo continuamente sul mio albero? Tuttavia, questa è la struttura migliore che ho trovato per realizzare il lavoro.
Ecco un esempio delle possibili sequenze:
- Titolo
- Opzioni
- Race
- Opzioni
- Titolo
- Race
- Race
- Opzioni
- Titolo
Sai se un albero è la strada da percorrere o se c'è una struttura migliore per questo lavoro?
Modifica
C'è una grande libreria per la creazione di grafici per C # / WPF: link
Utilizza internamente link .
Ecco un piccolo esempio:
Codice-behind:
usingSystem.Collections.Generic;usingSystem.Windows;usingGraphSharp.Controls;usingQuickGraph;namespaceWpfApplication15graph{internalclassScreenVertex{publicstringHello{get;set;}}internalclassScreenEdge:Edge<ScreenVertex>{publicScreenEdge(ScreenVertexsource,ScreenVertextarget):base(source,target){}}internalclassScreenLayout:GraphLayout<ScreenVertex,ScreenEdge,ScreenGraph>{}internalclassScreenGraph:BidirectionalGraph<ScreenVertex,ScreenEdge>{}publicpartialclassMainWindow:Window{publicMainWindow(){InitializeComponent();Loaded+=MainWindow_Loaded;}privatevoidMainWindow_Loaded(objectsender,RoutedEventArgse){//buildgraphvarscreenGraph=newScreenGraph();varscreenVertex1=newScreenVertex{Hello="1"};
var screenVertex2 = new ScreenVertex {Hello = "2"};
var screenVertex3 = new ScreenVertex {Hello = "3"};
screenGraph.AddVertex(screenVertex1);
screenGraph.AddVertex(screenVertex2);
screenGraph.AddVertex(screenVertex3);
screenGraph.AddEdge(new ScreenEdge(screenVertex1, screenVertex2));
screenGraph.AddEdge(new ScreenEdge(screenVertex2, screenVertex1));
screenGraph.AddEdge(new ScreenEdge(screenVertex1, screenVertex3));
screenGraph.AddEdge(new ScreenEdge(screenVertex3, screenVertex1));
screenGraph.AddEdge(new ScreenEdge(screenVertex3, screenVertex2));
ScreenLayout.Graph = screenGraph;
// get connections for a particular vertex
IEnumerable<ScreenEdge> inEdges = screenGraph.InEdges(screenVertex3);
IEnumerable<ScreenEdge> outEdges = screenGraph.OutEdges(screenVertex3);
}
}
}
XAML:
<Window x:Class="WpfApplication15graph.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:WPFExtensions.Controls;assembly=WPFExtensions"
xmlns:controls1="clr-namespace:GraphSharp.Controls;assembly=GraphSharp.Controls"
xmlns:wpfApplication15Graph="clr-namespace:WpfApplication15graph"
Title="MainWindow"
Width="525"
Height="350">
<Window.Resources>
<DataTemplate x:Key="SvTemplate" DataType="wpfApplication15Graph:ScreenVertex">
<Grid>
<TextBlock Text="{Binding Hello}" />
</Grid>
</DataTemplate>
<Style TargetType="controls1:VertexControl">
<Style.Setters>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls1:VertexControl">
<Border CornerRadius="5" Width="50" Height="50" Background="LightBlue">
<ContentPresenter Content="{TemplateBinding Vertex}"
ContentTemplate="{DynamicResource SvTemplate}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style.Setters>
</Style>
</Window.Resources>
<Grid>
<controls:ZoomControl>
<wpfApplication15Graph:ScreenLayout x:Name="ScreenLayout"
HighlightAlgorithmType="Simple"
LayoutAlgorithmType="Circular"
OverlapRemovalAlgorithmType="FSA" />
</controls:ZoomControl>
</Grid>
</Window>