2016-04-11 6 views
0

Java Anfänger, das Feedback darüber, wie am besten schätzen würde, ein Problem zu nähern, die wir in Isolation bin auf .....Verwendung von Java-Stack, um die Methode zu erkennen, ruft

Den Versuch, ein Grundspiel zu bauen , wo sich ein Spieler auf einem Gitter/Brett bewegt. Benutze Up/Down/Links/Right-Methoden (zB public void playerMovesUp() usw.) und setze die Undo/Redo-Move-Funktionalität ein, so dass ein Spieler die x Anzahl der Schritte nachvollziehen und die X-Nummer zu jedem beliebigen Zeitpunkt während des Spiels wiederholen kann .

Haben nach Wegen gesucht, dies zu tun, d. H. Um die Reihenfolge der Auf/Ab/Links/Rechts-Methodenaufrufe aufzuzeichnen, und dann beide in umgekehrter Reihenfolge erneut aufzurufen (rückgängig zu machen) und dann zu wiederholen.

Eine Stapel- oder Warteschlangensammlung scheint logisch .... und ich habe auch in den Java-Stapelspeicher geschaut, der die Reihenfolge der Funktionsaufrufe speichert, und gerade über java.lang.Thread.getStackTrace() gelesen.

Aktuelle Gedanken ..... Wenn ich diese vier Methoden in einen Thread isoliere, dann könnte ich java.lang.Thread.getStackTrace() verwenden, um ein Array zurückzugeben, und getMethodName() aufrufen, um dann irgendwie anwendbar zu nennen Methoden in Reihenfolge?

Ist es auch möglich, eine Warteschlange/einen Stapel von Methodenaufrufen zu speichern?

Ich fühle mich wie ich bin auf dem richtigen Weg, aber der letzte Vorschlag scheint ein bisschen chaotisch/unlogisch! Irgendwelche Hinweise/Ratschläge würden geschätzt werden.

+0

Java 'Stack' - https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html – brso05

+0

normalerweise würde man die Aktionen in verschiedenen Klassen mit dem Befehlsmuster entwerfen, um Undo zu implementieren. (siehe http://stackoverflow.com/questions/49755/design-pattern-for-undo-engine) –

+0

Speichern Sie Ihre Bewegungen in einem "Stack" dh "rechts" "links" "oben" "runter" ... dann Wenn du rückwärts gehen willst, nimm einfach das oberste Element des 'Stack' und mache das Gegenteil. 'if (topElement.equalsIgnoreCase (" right ")) {moveLeft();}'. – brso05

Antwort

1

Ich denke, dass Sie den Stack dafür nicht verwenden können. Sie müssen Ihre Methodenaufrufe selbst verfolgen. Und nein, Sie können "Methodenaufrufe" nicht in einer Sammlung speichern.

Stattdessen wäre es einfacher, Klassen für Ihre Aktionen zu entwerfen, wobei jede Klasse eine do und eine undo implementiert. Die Instanzen dieser Klassen können dann in einer Stack oder Queue gespeichert werden. Wenn der Benutzer seine Aktionen rückgängig machen möchte, können Sie diese rückgängig machen und alle Elemente rückgängig machen. Dieses Muster wird als Befehlsmuster bezeichnet (siehe z. B. Design Pattern for Undo Engine).

+0

Danke Raphael. Wenn ich eine neue Klasse für jede Aktion erstellt habe (oben/unten usw.) und jedes Mal, wenn der Spieler ein Gitterfeld bewegt, ein Objekt erzeugt, wäre das nicht viel ineffizienter als das, wenn man einfach einen String jedes Mal hinzufügt bewegt sich auf meinen Stapel? Also habe ich einen Stapel von "links", "oben", "rechts", "oben" usw. Ansonsten könnte ich eine riesige Menge an Objekten in meinem Stapel haben, da es keine Beschränkungen gibt, wie oft ein Spieler kann Bewegung. Was denken Sie? – javapalava

2

Verwenden Sie den Stapel nicht so. Das ist nicht, was das für wenn. Behalten Sie einfach eine Liste der Schritte, die Sie gemacht haben, und verfolgen Sie Ihre Schritte anhand dieser Liste.

Verwandte Themen