Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Im Grunde ist das übertragen auf deine Situation nicht übermäßig schwierig:
Beim Platzieren eines Gebäudes guckt dieses in seiner Umgebung nach allen Gebäuden, die in irgendeiner Weise relevant sein könnten (eine Eisenschmelze würde nach Lagerhäusern, Eisenminen, Köhlereien, Kohleminen, Werkzeugschmieden). Alle gefundenen Gebäude werden natürlich vermerkt.
Alter Hase
Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy
Das hängt davon ab, wie dein Speicherprinzip aussieht.
Speicherst du alle Gebäude deiner Map in einer struktur (std::vector, etc), oder teilst du die Map in kleinere Bereiche auf und speicherst alle Gebäude pro Bereich (So wie Minecrafts Chunks)?
Das hängt davon ab, wie dein Speicherprinzip aussieht.
Speicherst du alle Gebäude deiner Map in einer struktur (std::vector, etc), oder teilst du die Map in kleinere Bereiche auf und speicherst alle Gebäude pro Bereich (So wie Minecrafts Chunks)?
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].
Nachtrag:
In Minecraft gibt es schon seit Ewigkeiten die Redstone-Leitungen, die keine Probleme mit Chunks haben. (Eben weil die Berechnungen grundsätzlich unabhängig von der Struktur sind, in der die Daten gehalten werden.)
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »TheLizard« (12.04.2014, 11:58)
C-/C++-Quelltext |
|
1 2 3 4 5 |
building::update(...) { for each building in buildings_on_map: if building.wanna_nice_stuff(stuff, amount, this): this.send_stuff() } |
mein Vorschlag für eine Zwischenstruktur: std::map<WARE, std::piority_queue<ZEIGER_ODER_SMARTPTR> >
Ansonsten geh doch anfangs einfach die Liste aller Gebäude der Welt durch. Wenn das zu langsam ist, kannst du immernoch eine Zwischenstruktur einbauen. Versuch am besten Anfangs garnicht "schlau" zu programmieren in Hinsicht auf Algorithmen, sondern straight forward. Du hast ne Ware und willst sie loswerden? Dann klapper halt alle Gebäude ab und frag sie, ob sie die Ware abnehmen.
Es gibt einen deutlichen Unterschied zwischen std::multimap und std::map<...,std::priority_queue <...>> . Oder anders gesagt: ich halte ne Multimap an dieser Stelle für eher ungeeignet, da du ja durchaus eine Sortierung haben willst, die eine multimap nicht darstellen kann.
Zum Thema Feldprüfung eine kurze Überlegung: Wieviele Felder wirst du auf deiner Karte haben? Wieviele Gebäude wirst du auf deiner Karte haben? Ich vermute erstere werden eine deutlich höhere Anzahl haben und somit ist das Iterieren über die Felder auf keinen Fall sinnvoll meiner Meinung nach.
Analogie: Wie würdest du am ehsten die Telefonnummern aller Einwohner auf Helgoland rauszufinden?
Du kannst natürlich auf Helgoland jeden Quadratmeter besuchen, schauen ob ein Haus drauf steht und dann nachfragen wer da wohnt bzw was seine Telefonnummer ist. Wenn du aber wirklich so vorgehen würdest, hättest du meinen vollen Respekt-soviel Eifer habe ich schon lange nicht mehr angetroffen. Ich hingegen würde ja eher das Einwohnerverzeichnis bemühen...
Und an dieser Stelle nochmals. Straight forward ist kein "Provisorium". Es ist erstmal die einfachste Lösung. Du kannst natürlich immer gleich ne sechsspurige Autobahn bauen, aber ohne zu wissen, wo der Verkehr wirklich rollt, ist das eine reichlich unökonomische Lösung. Du wirst eh nicht die perfekte Lösung am Anfang haben und noch x-mal umbauen. Aber bei jedem Umbau (refactoring) werden die Ansätze und Klassen sauberer und besser. Doch woran gearbeitet werden muss, kann man nur sehr schwer vorher wissen. Viele Probleme kann man natürlich vermeiden (Stichwort saubere Kapselung), aber nicht alle. Ich kann es dir wirklich nur nahe legen. Du hast schon über ne Woche verloren nur weil du eine "bessere" Lösung haben willst. Dabei könnten deine Gebäude schon längst liefern...
Werbeanzeige