![]() |
Strategie-Spiel, Nachbarländer
Hallo !
Ich programmier' gerad' ein Strategie-Spiel, bei dem ich mir eine Karte mit verschiedenen Ländern erstelle. Folgendes ist dabei wichtig: - ich verwende 2 Klassen, TMap und TLand - TMap beinhaltet alle TLand-Instanzen - in TMap kann ich herausfinden, zu welchem Land ein Bereich auf der Karte gehört Nun möchte ich durch Zeiger (in TLand) benachbarte Länder zu dem jeweiligen Land registrieren. Jetzt will ich wissen, wie ich ich dies am besten anstelle ? Daneben würd' ich gern auch wissen, wie ich am besten jedes einzelne Land von sich aus zeichnen kann statt in TMap alle Bereiche ohne Rücksicht auf die TLand-Instanzen zu zeichnen ? |
Re: Strategie-Spiel, Nachbarländer
Ohne viel von Pointeren / Klassen zu wissen sage ich mal:
Wie speicherst du denn die Instanzen der Länder in TMap? Hast du alle in einem oder irgendwie in bspw. einem 2D-Array? Wenn es kein 2D-Array ist, sollte man wissen, wieviele TLand nebeneinander dargestellt werden. Ist es ein 2D-Array dann müsste es so sein: Array[X][Y] sei die Position des MittelFelder. Die Nachbarländer sind dann: Zitat:
Hoffe, dich überhaupt richtig verstanden zu haben ;) |
Re: Strategie-Spiel, Nachbarländer
Also meine TMap enthält einen 2D-Array mit einzelnen Felder, die zu einem bestimmten Land gehören. Problematisch ist hierbei, dass diese Felder unabhängig davon, wo das Zentrum des Landes (in TLand angegeben) sich befindet, sind. Sie könnten einzeln irgendwo liegen.
Das versuche ich in den Griff zu kriegen.
Delphi-Quellcode:
Und wenn ich die Karte zeichnen will muss ich bis jetzt immer auf diese Felder zurückgreifen und mit zwei for-Schleifen jedes Feld einzeln zeichnen. Dabei bleibt mir nichts anderes übrig als verschiedenfarbige Rechtecke zu zeichnen.
TLand = class
Center:TPoint; // andere benötigte Länderinfos end; TMap = class Land:array of TLand; Field:array of array of Integer; // ... end; [edit] @Airblader: Nach deinem Vorschlag kann ich also die Grenzen zwischen den Ländern ermitteln, wobei zunächst nur die 4 NOSW-Richtungen von Bedeutung sind. Ich dachte mir, ich erstelle einen Array in TLand mit Zeigern auf alle benachbarten Länder. So müsste das soweit klappen. Doch das eigentliche Problem ist, dass einige Länder bestimmte Eigenschaften verlieren und nicht mehr als Nachbarn gelten dürfen (z.B.: ein Gegner hat das Land erobert). Jetzt müsste man irgendwie herausfinden können, ob ein weit entferntes Land vom aktuellen erreicht werden kann. Denn eigene Länder könnten eine Kette bilden und so zu dem Land führen. Meine erste Idee dazu war, dass ich meine Methoden mit noch mehr for-Schleifen schmücke. Allerdings ist dieser Weg bezüglich der Rechenzeit inakzeptabel ! Was jetzt ? [/edit] |
Re: Strategie-Spiel, Nachbarländer
Liste der Anhänge anzeigen (Anzahl: 1)
Zum Thema Zeichnen der einzelnen Felder hier ein Screenshot.
Ich wäre dankbar, wenn mir jemand seine Ideen mitteilt, wie man die Ecken der Felder abrunden könnte. Diese sind in einem schlichten 2D-Array verpackt. |
Re: Strategie-Spiel, Nachbarländer
Du könntest doch gucken, ob an dem aktuellen Feld Land ist oder nicht.
Wenn kein Land dann eventuell abgerundete Bilder einfügen oder selber zeichnen. Möglicherweise hilft auch eine Linie, die von den Eckpunkten der Nachbarfelder gezogen wird. Viel Erfolg noch! Lukaro |
Re: Strategie-Spiel, Nachbarländer
Erstmal: Nimm für "Land" eine
![]() Zum Abrunden: Ist wahrscheinlich übertrieben, aber ein Subdivision Surfaces-Algorithmus sollte gute Ergebnisse bringen :wink: . |
Re: Strategie-Spiel, Nachbarländer
Zitat:
Wenn ich also die 2 for-Schleifen in weitere for-Schleifen lege, dauert die Berechnung dieser Kette Minuten. Es soll aber kaum eine Sekunde Berechnungszeit benötigen. Da dachte ich mir Berechne für jedes Land die unmittelbaren Nachbarn zur OnCreate-Zeit und zur Spiel-Zeit müsste das irgendwie über Zeiger ablaufen. Doch wie ? |
Re: Strategie-Spiel, Nachbarländer
Ist doch relativ einfach :)
Du hast deinen 2 Schleifen Algortihmus, korrekt ? Du benötigst noch in jedem TLand Objekt eine Liste von TLand Objekten, nennen wir sie mal "NachbarLaender". In deiner Suchschleife erkennst du nun den Fall das du auf ein Grenz-Kästchen gestoßen bist. In diesem Moment hast du ermittelt welches TLand auf ein anderes trifft. In beiden "NachbarLaender" Listen dieser beiden TLand Objekte fügst du nun wechselseitig das jeweils angenzende TLand ein, aber nur wenn es noch nicht eingetragen wurde. Am Ende deiner Suchschleife hast du nun zu jedem TLand in dessen "NachbarLaender" Liste eine Verlinkung auf alle angrenzenden Länder. Gruß Hagen |
Re: Strategie-Spiel, Nachbarländer
So weit bin ich ja auch schon, aber
Zitat:
Das hier muss ich noch mit einem möglichst geringen Speicherplatz- und Zeitverbrauch realisieren. :gruebel: |
Re: Strategie-Spiel, Nachbarländer
Wenn du weißt welches land welche Nachbarländer hat, dann kannst du jedem land je einen Pointer auf jedes der Nachbarländer geben.
Dann fütterst du einen Wegsuchalgorithmus (vgl A*) mit den kanten Knoten und der puckt dann geschwind aus ob es eine Verbundung gibt oder nicht. wenn du nicht die schnellste verbindung suchst dann reicht auch ein einfacherer WegSuchAlgo. mfg Ruppi pS : wird das ein Risikoklon? Klingt so ... von wegen reisen etc... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz