# Ressourcen sammeln



## Eichelhäer (17. Mrz 2022)

Hallo, wie sieht ein grundlegender Algorithmus (pseudocode) zum sammeln einer ressource aus?
Ich hab bisher immer nur ergebnisse erstellt, die ich immer wieder neu anpassen musste, weil es immer zu konflikten gab.
Der bisher beste versuch gelang mir mit nem zustands enum, also:

1 MOVE_TO_RESSOURCE
2 GATHER_RESSOURCE
3 CARRY_RESSOURCE_TO_HQ

mit entsprechenden Methoden.
Weiss da jemand Rat?


----------



## KonradN (17. Mrz 2022)

Also bitte nichts durcheinander werfen! Erst einmal willst Du einen Algorithmus festlegen und das ganz offensichtlich auf sehr hohem Nivieau.
Da dann bitte keine Low Level Details einmengen!

Also ob da irgendwas als enum dargestellt wird oder nicht ist erst einmal für den Algorithmus doch egal.
Die Frage ist auch: Wozu brauchst Du einen solchen Zustand? Wo spielt der hier eine Rolle?

Du hast drei Schritte im Algorithmus aufgezeigt:

1. Gehe zur Ressource (Hinweis am Rande: Wenn Deutsch, dann Ressource, wenn Englisch, dann Resource mit einem S)
2. Nimm Ressource
3. Trage Ressource zum Hauptquartier

Einen Zustand brauchst Du für den Algorithmus nicht, denn Du weisst ja: Ich bin gerade bei Schritt 1. oder ich bin gerade in Schrit 2. Daher ist klar, was gerade abgeht. (Aber natürlich: Auf eine niedrigeren Ebene kann das durchaus wichtig oder interessant sein. Aber diese Ebene sehen/kennen wir auf dieser Ebene ja nicht und können diese daher nicht betrachten.

Das ist so ein Prinzip, dass wir so auch bei Methoden direkt kennen. Da sollte man auch möglichst auf einer Ebene sein und bleiben. Das ist also etwas vergleichbar mit den Tätigkeiten einer großen Firma:

Der CEO wird irgend welche Aufgaben auf hohem Niveau machen um dann nidrigere Ebenen zu beauftragen (im Code sind das Aufrufe). Er wird nicht den Besen nehmen um dann Dreck auf dem Hof weg zu machen. Das ist Low Level. Statt dessen geht er zum Standort-Verantwortlichen aber da geht es dann nicht um ein spezifischen Dreck sondern um die generelle Prüfung der Sauberkeit und der ist dann zuständig und macht dann einiges mehr (Weil es Abhängigkeiten gibt. Ggf. ist etwas weiter noch mehr Dreck und beim wegmachen wird festgestellt, dass eine Tonne voll ist und die wird dann getauscht mit einer leeren und und und ... 

Ist das etwas verständliuch und hilfreich? Konkretere Dinge kann ich Dir gerade nicht sagen, da die Problematik so noch nicht weiter zu greifen ist für mich. Evtl. kannst Du mehr Details bringen und es etwas mehr ausführen?


----------



## Eichelhäer (25. Mrz 2022)

Eigentlich nicht wirklich. Ich verstehe das so: Der Spieler Klickt mit der Maus anschließend soll etwas passieren ( hier: Holzhacken). Es ist klar, dass es da mehrere Möglichkeiten gibt ob ich nun ein enum nehme oder mehrere kleine Methoden schreibe und diese dann anschließend zu einem Algorithmus zusammen bastle, aber der korrekten syntax auf low level ebene bereitet mir schwierigkeiten.


----------



## Eichelhäer (25. Mrz 2022)

Mein Game ist kachelbasiert. Ich habe entities wie beispielsweise eine Goldmine, die als ressource fungiert und eben Holz entities. Das Problem ist nun wenn ich auf ein Holztile klicke läuft die einheit zwar dorthin und hackt holz bringt dieses auch zurück und läuft anschließend wieder zum holz zurück, allerdings weiss ich dann nicht wie ich diesen automatismus für umliegende holztiles anwenden soll.


----------



## Eichelhäer (25. Mrz 2022)

Es funktioniert zwar so prinzipiell, aber ich komm halt immer wieder an umbasteleien. Also hier was umstellen funktioniert das andere wieder nicht und umgekehrt.


----------



## Robert Zenz (25. Mrz 2022)

Eichelhäer hat gesagt.:


> Mein Game ist kachelbasiert. Ich habe entities wie beispielsweise eine Goldmine, die als ressource fungiert und eben Holz entities. Das Problem ist nun wenn ich auf ein Holztile klicke läuft die einheit zwar dorthin und hackt holz bringt dieses auch zurück und läuft anschließend wieder zum holz zurück, allerdings weiss ich dann nicht wie ich diesen automatismus für umliegende holztiles anwenden soll.



Du weist deinem Sammler das Ziel-Holz-Kachel zu. Wenn dieses aufgebraucht ist, pruefst du einfach ob in der Umgebung (sagen wir mal 3 Kacheln weit) es noch andere, gleiche Resourcen gibt, wenn ja nimmst du einfach das als neue Ziel-Holz-Kachel. Und so weiter. Also in Pseudo-Code:


```
public void onTargetResourceTileConsumed(ResourceTile resourceTile) {
    for (int x = resourceTile.getX() - 3; x < resourceTile.getX() + 3; x++) {
        for (int y = resourceTile.getY() - 3; y < resourceTile.getY() + 3; y++) {
            Tile tile = getTileAt(x, y);
            
            if (tile instanceof ResourceTile && ((ResourceTile)tile).getResource() == resourceTile.getResource()) {
                setTargetResourceTile((ResourceTile)tile);
                return;
            }
        }
    }
    
    // No new tile found.
    returnToBase();
}
```



Eichelhäer hat gesagt.:


> Es funktioniert zwar so prinzipiell, aber ich komm halt immer wieder an umbasteleien. Also hier was umstellen funktioniert das andere wieder nicht und umgekehrt.



Ha! Willkommen in der Welt der Programmierung. Ich kann dir da nur zwei Ratschlaege geben: Erstens, habe niemals Angst dafuer etwas umzubauen wenn du siehst das es besser geht. Und zweitens, bevor du das machst, schreibe dir Tests (und wenn es nur ein Test-Ablauf auf Papier ist) um zu verifizieren was du da gerade umgebaut hast.


----------



## Eichelhäer (1. Apr 2022)

Ok danke für die Antwort.


----------



## Eichelhäer (1. Apr 2022)

Ich hätte da noch eine Frage: Mein Game ist Kachelbasiert, also alles auf dem Spielfeld ist 32x32 pixel groß auch die gebäude außer die einzelnen Einheiten. Daher möchte ich mal abgesehen von den Gebäuden und den Einheiten, die Map als mit einzelnen Layern darstellen z.B. groundLayer oder ressourceLayer etc. . Meine Frage ist weise ich jedem Tile mittels eines int Arrays jeweils eine Id von jedem Layer zu oder gibts da noch weitere Möglichkeiten das zu machen? Meine layers sind jeweils vorkonstruierte integer arrays.


----------

