Quale struttura dati per rappresentare possibili navigazioni tra gli schermi di un gioco?

0

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:

  1. Titolo
    • Opzioni
    • Race
  2. Opzioni
    • Titolo
    • Race
  3. 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>
    
posta Aybe 13.11.2013 - 20:00
fonte

1 risposta

4

Potresti prendere in considerazione un grafico diretto .

È simile a un albero, ma con meno restrizioni. Hai solo nodi con collegamenti unidirezionali tra loro. Puoi rendere la struttura pulita / ben organizzata / ordinata / disordinata / caotica come desideri.

Fai attenzione se il tuo sistema di menu diventa complicato - le DG possono diventare disordinate.

    
risposta data 13.11.2013 - 20:13
fonte

Leggi altre domande sui tag