PBeM-Spiele
Aktuelle Zeit: 28.04.2024 13:51

Alle Zeiten sind UTC + 1 Stunde




Forum gesperrt Dieses Thema ist gesperrt. Du kannst keine Beiträge editieren oder weitere Antworten erstellen.  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Kartentool -> XML
BeitragVerfasst: 14.10.2003 17:04 
Offline
Administrator
Administrator
Benutzeravatar

Registriert: 18.02.2002 21:34
Beiträge: 4483
Wohnort: Hamburg
Für die Programmier-Freaks unter uns...ist die Auswertung des XML-Anhangs eigentlich schwierig/aufwendig?

Ein kartentool wäre ja schon richtig klasse! Es gibt zwar so ein Mini-Freeware-Tool, aber ACHTUNG, daß funktioniert nicht! Es stellt Karten falsch dar, also lieber nicht verwenden!!!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 14.10.2003 18:46 
Offline
Etabliertes Mitglied
Etabliertes Mitglied
Benutzeravatar

Registriert: 12.09.2002 19:36
Beiträge: 178
Wohnort: Koeln/Deutschland
du meinst dieses java-teil? bisher hat es noch alles richtig angezeigt bei mir. Was macht es denn falsch?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 14.10.2003 19:00 
Offline
Administrator
Administrator
Benutzeravatar

Registriert: 18.02.2002 21:34
Beiträge: 4483
Wohnort: Hamburg
Das Tool kann keine "Kreise" bilden! Sobald also die Planeten wieder zu einem zusammenführen, bricht er die einfach auf. Damit nicht genug, er fängt dann an diese "losen Ketten" zu verdoppeln! Total merkwürdig!

_________________
Steam-Profil: sun-e | Steam-Gruppe: pbem-spiele | G+ Seite | G+ Community
Demnächst startende Partien / Anmeldungsstände | Twitter
Public PGP Key: 8A35 E947 7C53 D53D 92EF 8C55 4DE3 7F78 3031 A54C


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 14.10.2003 20:52 
Offline
Etabliertes Mitglied
Etabliertes Mitglied
Benutzeravatar

Registriert: 12.09.2002 19:36
Beiträge: 178
Wohnort: Koeln/Deutschland
oh oh ... aber soweit bin ich ja noch nicht - bis dahin also muss es reichen.

Achja, wenn denn jemand, der im gegensatz zu mir ahnung vom proggen hat, einen clienten entwirft - koennte der dann auch bitte an die armen kleinen Mac-User denken? Java waere also in diesem Falle sehr schoen :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 15.10.2003 13:54 
Offline
Forumjunkie
Forumjunkie

Registriert: 08.02.2003 02:43
Beiträge: 213
@sun-e:

Das Problem ist nicht das XML-Format, sondern die unregelmässigkeit der Karte und wie man die Welten darstellen will.

MJ


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 15.10.2003 17:23 
Offline
Frischling
Frischling
Benutzeravatar

Registriert: 17.08.2003 22:48
Beiträge: 14
Wohnort: W'tal
Hi,
ich wollte Euch mal einen kurzen Abriss über den möglichen Algorithmus aufzeigen (wobei vielleicht klar wird, dass das ähem... nicht ganz trivial ist)

Also erstmal muss man die Karte in eine interne Darstellungsform bringen; eine Baumstruktur ist schonmal ein Anfang, wie z.B. der Binärbaum:
Code:
       root
      /    \
     n1   n2
    /  \
   n3  n4

Jetzt sieht man natürlich, dass sich damit noch keine Karte wie SC abbilden läßt. Dazu braucht man noch mehr. Der nächste Schritt wäre eine B-Baum, der beliebig viele Nachfolgerknoten hat:
Code:
                root
            [nodelist]
          /   /   |   \
         n1 n2    n3  n5
                   [nodelist]
                    /      \
                   n6       n7

Auch hier sieht man schnell, dass das Grenzen hat, nämlich genau jener besagte "Kreis", bzw. die Querverbindung, dass z.B.
Code:
n7<-->n6

auch noch möglich sein soll.
Nächste Möglichkeit wäre eine "Liste", wie z.B.

Code:
n1<->n2<->n3<->n4


wobei hier direkt die "Doppelt verkettete Liste" dargestellt ist, d.h. jeder Knoten kennt seinen Vor- und Nachfolger.

Nimmt man nun alles zusammen, schüttelt gut durch, dann kommt so etwas ähnliches wie ein "Wald" heraus, nämlich eine Liste von Bäumen; auch das allerdings hilft nicht weiter.

So die Lösung ist, dies mit Hilfe eines "Graphen" darzustellen. Diesen kann man sich als "Sternenhaufen" vorstellen, wobei man nun definieren kann, wieviele Verbindungen der Knoten zueinandern möglich sind. Darauf kann man dann so tolle Algorithmen wie den "Kürzesten Weg" programmieren, und validieren, ob es Knoten ohne Verbindungen gibt u.s.w.

Diesen Graphen stellt man am besten als Liste dar, wobei jeder Knoten [1..n] Nachfolger (und wenn man den doppelt verkettet) auch [1..n] Vorgänger hat. Letzten Endes eine weiter gefasste Form als der B-Baum:
Code:
                        n1
                   /       \.....................
               n2            \                    n3
                |              \              /---^
                |           ___n4..........n5
                \         /
                 n6----/


Jetzt gehen wir einmal davon aus, wir hätten den Graphen mit folgenden Funktionen fertig:
Code:
NodeList  Graph.getAllNodes ()
void      Graph.addNode (n)
Node      Graph.getNode (i)

Node.add_Nachfolger (n)

Dieser Graph kann natürlich jetzt ein wenig "zuviel", was aber ja erstmal nicht unbedingt stört. Die speziellen SC-Eigenheiten zu definieren ist ja erstmal noch zusätzlich.
Jetzt fehlt noch die Möglichkeit, den Graphen zu traversieren, d.h. jeden Knoten (genau einmal) zu besuchen. Das benötigen wir u.a. für die Darstellung des Graphen, und zwar möglichst als Grafik (was ja nicht unbedingt selbstverständlich ist). Wenn wir den Graphen per Text nun ausgeben würde, käme wieder ziemlich genau der "Input" aus der Auswertung raus.

Der Ausgabe-Algorithmus muss sicherlich den Graphen mehrfach traversieren, um "Überschneidungen" bei der Darstellung zu verhindern (vorausgesetzt, dass eine solche Darstellung möglich ist, was nicht selbstverständlich ist). Die Knoten bekommen dann ein zusätzliches Attribut [x, y], welches die Lage im Raum beschreibt. Noch ein wenig Gehirnschmalz in die Funktion
Code:
Graph.check_CrossLines ()
Graph.moveNode (divX, divY)
u.s.w.

gesteckt und die Sache ist geritzt ;-)

Eigentlich super-einfach (wenn man eine Library findet, wo man den Ausgabealgorthmus abschreiben kann!)

Eure
Mausi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 15.10.2003 19:27 
Offline
Forumjunkie
Forumjunkie

Registriert: 08.02.2003 02:43
Beiträge: 213
Mausi hat geschrieben:

Diesen Graphen stellt man am besten als Liste dar, wobei jeder Knoten [1..n] Nachfolger (und wenn man den doppelt verkettet) auch [1..n] Vorgänger hat.



Was genau wäre jetzt der unterschied zwischen den Nachfolgern und den Vorgängern?

Zitat:
Der Ausgabe-Algorithmus muss sicherlich den Graphen mehrfach traversieren, um "Überschneidungen" bei der Darstellung zu verhindern


Was meinst du mit "mehrfach traversieren"?

Zitat:
Die Knoten bekommen dann ein zusätzliches Attribut [x, y], welches die Lage im Raum beschreibt.


Genau das ist doch das eigentliche Problem: Wie willst du den Welten x und y so zuweisen, dass sie sinnvoll dargestellt werden?


MJ


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 15.10.2003 20:52 
Offline
Administrator
Administrator
Benutzeravatar

Registriert: 18.02.2002 21:34
Beiträge: 4483
Wohnort: Hamburg
Also bei SC649 habe ich eine Welt die rechts oben ist und mit linksunten verbudnen ist! Ich habe auf dem papier gedreht udn gewendet...damit man das optisch darstellen kann OHNE ZU KREUZEN, müßte ich das Papier falten...:-)

_________________
Steam-Profil: sun-e | Steam-Gruppe: pbem-spiele | G+ Seite | G+ Community
Demnächst startende Partien / Anmeldungsstände | Twitter
Public PGP Key: 8A35 E947 7C53 D53D 92EF 8C55 4DE3 7F78 3031 A54C


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 15.10.2003 21:03 
Offline
Frischling
Frischling
Benutzeravatar

Registriert: 17.08.2003 22:48
Beiträge: 14
Wohnort: W'tal
MaryJane hat geschrieben:
Mausi hat geschrieben:

Diesen Graphen stellt man am besten als Liste dar, wobei jeder Knoten [1..n] Nachfolger (und wenn man den doppelt verkettet) auch [1..n] Vorgänger hat.


Was genau wäre jetzt der unterschied zwischen den Nachfolgern und den Vorgängern?

ähem. räusper. Das war unklar formuliert: Man unterscheidet zwischen:
    gerichteter Graph
    ungerichteter Graph
    (und einigen anderen)

Bei einem gerichteten Graphen gibt es zwar einen Weg n1-->n2 aber nicht unbedingt auch umgekehrt n1<--n2. Jetzt kann man in den einzelen "Nodes" einfach speichern wohin der Pfeil zeigt (Nachfolger), aber später wird man auch feststellen wollen (für einige Algorithem notwendig), welche "Nodes" alle auf diese hier zeigen (Vorgänger). Damit man dann nicht den gesamten Graphen wieder absuchen muss (vollständige Suche), speichert man das gleich "doppel-gemoppelt" in den Knoten rein. Man muss nur bei den Einfüge- und Löschoperationen entsprechend vorsichtig sein, dass man die anderen Knoten gleich mitändert. Am einfachen Beispiel:
Code:
definition class node
{
   nachfolger = {node}
   vorgänger = {node}
   inhalt (z.B. Größe des Sterns)
}

nodeA
{
   nachfolger = { nodeB, nodeC }
   vorgänger = { }
}

nodeB
{
   nachfolger = { nodeD, ... }
   vorgänger = { nodeA }   // siehe nodeA.nachfolger
}

nodeC
{
   nachfolger = {...}
   vorgänger = { nodeA }
}


Das sieht nun vereinfacht so aus:
Code:


         nodeA    ----------->   nodeB  ---------> nodeD
                 \--------->   nodeC



Wenn nun die Verbindung nodeA <--- nodeB (also auch die umgekehrte) erstellt werden soll, so sind beide Knoten nodeA und nodeB zu ändern:

Code:
function insertConnection (sourceNode, destinationNode)
{
   sourceNode.addNachfolger (destinationNode);
   destinationNode.addVorgänger (sourceNode);
}


Bei dem ungerichteten Graphen kann man dann auf die Vorgänger/Nachfolger verzichten, nennt das noch vielleicht um in "adjacent Nodes"
Code:
definition Node
{
   adjacent = {Node}
   inhalt
}



MaryJane hat geschrieben:
Mausi hat geschrieben:
Der Ausgabe-Algorithmus muss sicherlich den Graphen mehrfach traversieren, um "Überschneidungen" bei der Darstellung zu verhindern


Was meinst du mit "mehrfach traversieren"?

... man "besucht" eine Reihe (gewisse Anzahl) von Knoten, d.h. man läuft durch den Graphen, klappert einzelne Nodes ab. Wenn man das für den gesamten Graphen anstellt, so traversiert man vollständig. Das muss mindestens einmal passieren, damit man den zeichnen kann.

MaryJane hat geschrieben:
Mausi hat geschrieben:
Die Knoten bekommen dann ein zusätzliches Attribut [x, y], welches die Lage im Raum beschreibt.


Genau das ist doch das eigentliche Problem: Wie willst du den Welten x und y so zuweisen, dass sie sinnvoll dargestellt werden?



Hehe, ich erwähnte doch jede Library, die man nur finden braucht, wo das schon programmiert ist ;-)
Also in groben Stichpunkte könnte das (in's Blaue gesagt) so aussehen:

1. Man läßt die Ausgabegröße (z.B. 750x550 Pixel) erstmal völlig außer Acht. Umherschieben, Zoomen u.s.w. kann man später ja immer noch. Auch muß der Graph erstmal nicht "in der Mitte, zentriert" sein, sondern man fängt halt irgendwo an.

2. Man greife sich die erste Node (welche, ist egal) und weise den Wert [0,0] zu. Jetzt haben wir die Mitte definiert.

3. Wir zählen ab, wieviele Nachfolger der Knoten hat, z.B. 3 und verteilen jetzt gerecht im Uhrzeigersinn: [0,1] (rechts davon), [0,-1] oberhalb, [-1,0] links davon.

4. Wenn man die maximale Anzahl möglicher "Nachfolger" kennt, ist das natürlich einfacher, sonst muss man den Radius halt vergrößern, bis es passt.

5. So, jetzt wird rekursiv (ist erstmal das naheliegendste) das gleich wiederholt, und zwar für alle Nachfolger, d.h. jetzt fängt man mit NodeB an (bei [0,1]) und weist die nächsten Punkte zu, wobei man den Vorgänger (nämlich [0,0] so läßt wie er war).

6. Bis jetzt kein Problem, außer wir wollen einen Nachfolger auf das Zeichenbrett bringen, der schon vorher da war (genau da beginnt das "Kreisproblem"). Man muss jetzt nacharbeiten. Zum Beispiel müssen wir feststellen, ob der "weiter oben", "rechts" oder sonstwo liegt. Das kriegen wir ja durch die Koordination heraus: NodeT[tX,tY]; NodeU[uX,uY] Dann x = tX-uX und y = tY - uY. Ist x>0 dann rechts von uns, x=0 oberhalb oder unterhalb (abhängig von Wert y) und x<0 links von uns. Bei y>0 unterhalb, y=0 auf gleicher Linie und y<0 oberhalb. Wenn x=0 und y=0 ist, dann haben wir was falsch gemacht, weil es derselbe Punkt ist.

7. Achso nebenbei: Die belegten Punkte sollte man sich noch in einer Matrix merken, damit man "besetzte" leichter erkennen kann, um dann mit dem überhaus einfachen "Verschiebe-Algrothmus" starten kann (lol). Oder man definiert einfach, dass für x, y auch reele Zahlen erlaubt sind, dann kann man immer noch einen "dazwischenquetschen".

8. Jetzt wissen wir aber schonmal, dass irgenwo vorher sich ein "Fehler" eingeschlichen hat, nämlich ursächlich durch unser "gerechtes Verteilen" am Anfang, wo wir natürlich noch nicht wissen konnten, ob es nun besser war, die NodeU (an NodeX) besser links oder rechts davon zu plazieren. Wir müssen und nur erstmal für eins entscheiden, um später festzustellen, ob das geglückt ist. D.h. wir gehen jetzt die Schritte aus Punkt 5. alle wieder zurück, bis wir bis wieder da waren, wo wir just die NodeT gezeichnet habe. Und wissen nun, dass das der falsche Platz war. nun haben wir uns sinnvollerweise gemerkt, welche Himmelsrichtung denn besser wäre, und quetschen das Dingen jetzt da rein. Gleichzeitig setzen wir auf die NodeT ein "Fähnchen". Wir wissen, dass wir damit ein Problem "hatten".

9. Jetzt malen wir wieder fleißig an dem Graphen, solange, bis wir wieder bei der NodeU angelangt sind, und stellen erstaunlicher und überraschter Weise fest, dass die schon gezeichnet wurde, und die nicht richtig passt. Wir ... gehen also wieder zurück, bis wir bei der NodeT sind, und sehen da unser "Fähnchen" vom letzten mal. Wie bei Hänsel und Gretel. Wenn wir dieses tolle Fähnchen nicht hätten, würden wir wieder von vorne Anfang, ohne es zu merken. Das Fähnchen heißt jetzt, dass also die NodeT eigentlich nicht mehr das Problem sein kann, sondern irgendwas vorher. Also gehen wir jetzt 1 Schritt zurück an die Node, die vor der NodeT gesetzt wurde. Nun zu dessen Vorgänger, verschieben den, und setzen da wieder unser Fähnchen drauf.

10. Wenn wir irgendwann auf die Node[0,0] ein Fähnchen setzen sollten, haben wir falsch programmiert.

Das nun in aller gröbster Form, wie gesagt, ins Blaue hinein gedacht. Es gibt da mit Sicherheit Literatur, die das löst.

Ähh... ja, da habe ich noch ein Buch grade gefunden:
Also es gibt schonmal einen Algorithmus, der einen Zyklus in einem Graphen erkennt (also einen Kreis hat, um bei SC zu bleiben).
Es gibt auch einen, der einen "Spannbaum" findet, d.h. einen Pfad, entlang der ganzen Knoten, der jeden nur einmal besucht.
Kann man sicherlich gut gebrauchen.

AHA. Also hier stehts:

Algorithmen und Datenstrukturen in C++, Addison Wesley, Robert Sedgewick, Seite 494 hat geschrieben:
Zum Beispiel ist es möglich, auf effiziente Weise zu bestimmen, ob ein Graph in der Ebene gezeichnet werden kann, ohne dass ich irgendwelche Linien schneiden, oder ob dies nicht möglich ist. Dieses Problem wird das Problem der Planarität (Ebenheit) genannt, und es war kein effizienter Algorithmus für seine Lösung bekannt, bis R. E. Tarjan 1974 einen genialen (jedoch sehr schwierigen) Algorithmus des Problems in linearer Zeit entwickelte, bei dem Tiefensuche verwendet wird.


Für so ein paar Handvoll Knoten von so 500 kann man vielleicht ja einen einfacheren nehmen, den man nur finden muss...

So, und nun darfst Du gerne weitertüfteln.

Grüße,
Mausi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 15.10.2003 21:07 
Offline
Frischling
Frischling
Benutzeravatar

Registriert: 17.08.2003 22:48
Beiträge: 14
Wohnort: W'tal
:shock: ... jetzt kann ich auch den Programmierer von dem Java-Tool besser verstehen, dass er an den Kreisen gescheitert ist.
Nur das mit dem Verdoppeln hätter er bestimmt abstellen können... :roll:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 15.10.2003 22:06 
Offline
Etabliertes Mitglied
Etabliertes Mitglied
Benutzeravatar

Registriert: 12.09.2002 19:36
Beiträge: 178
Wohnort: Koeln/Deutschland
Hm, aber wenn ich mir seinen screenshot ansehe http://morganthall.com/conScreen.jpg , dann hat der da doch Kreise - oder verstehe ich da was falsch? :?: :?:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 16.10.2003 10:15 
Offline
Frischling
Frischling
Benutzeravatar

Registriert: 17.08.2003 22:48
Beiträge: 14
Wohnort: W'tal
Interessant gelöst!
Erstmal wird das ganze hingemalt, auch mit überkreuzten Linien u.s.w. also völlig egal wie. Ähnlich dem Algorithmus 1..5 ohne Optimierungen.
Danach versucht jede Node "von alleine" einen gleichmäßigen Abstand zu den anderen zu bekommen, und dabei seinen direkten Nachbarn dabei etwas näher zu kommen (deshalb ruckelt es ja manchmal noch hin- und her).
Dabei wird immer wieder der Graph traversiert und jede Node darf sich einmal bewegen.
Auf diese Weise erreicht man aber keine gescheite Lösung, und er hat sich damit geholfen, dass der Anwender das durch Hingucken lösen kann, und ein paar Anstöße liefert.
Das funktioniert sogar recht ordentlich.
Man sollte nur die Java-Konsole geöffnet haben, damit die Meldungen sehen kann wie "Error reading Map: 1 error" o.ä.
Grüße,
Mausi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 16.10.2003 10:55 
Offline
Administrator
Administrator
Benutzeravatar

Registriert: 18.02.2002 21:34
Beiträge: 4483
Wohnort: Hamburg
Allana hat geschrieben:
Hm, aber wenn ich mir seinen screenshot ansehe http://morganthall.com/conScreen.jpg , dann hat der da doch Kreise - oder verstehe ich da was falsch? :?: :?:


Der sieht aber ganz anders aus als bei mir!?!?!

Ich habe nicht diese "Kuchenecken" an den Planeten, sondern fiese, grosse, breite Dreicke!?!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 16.10.2003 11:26 
Offline
Etabliertes Mitglied
Etabliertes Mitglied
Benutzeravatar

Registriert: 12.09.2002 19:36
Beiträge: 178
Wohnort: Koeln/Deutschland
Bei mir sehen die Anhaenge an den Planeten - also die Schiffe - genauso aus wie auf dem Screenshot ... nur bisher natuerlich alle nur in meiner Farbe :wink:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 16.10.2003 12:11 
Offline
Etabliertes Mitglied
Etabliertes Mitglied
Benutzeravatar

Registriert: 12.09.2002 19:36
Beiträge: 178
Wohnort: Koeln/Deutschland
Was mir fehlt bei dem Java-Tool: im XML steht viel mehr, als er anzeigt. Die ganzen Informationen ueber die Planeten fehlen irgendwie. Zur Zeit lasse ich mir immer die Karte erstellen, stelle den Hintergrund auf weiss und drucke ihn aus, drucke mir die Textauswertung und erstelle dann die Befehle. Wenn die Informationen aus der Textauswertung auch mit angezeigt werden wuerden koennte ich mir das Ausdrucken sparen und nur mit dem Javatool und dem Textfenster fuer die Befehle arbeiten - fuer drei Fenster (Javatool, Textfenster fuer Befehle, Textfenster fuer Auswertung) ist mein 17'' Monitor zu klein ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Forum gesperrt Dieses Thema ist gesperrt. Du kannst keine Beiträge editieren oder weitere Antworten erstellen.  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
Webhosting by sunrise design ohg