JAVA Pop() Methode anwenden?

2 Antworten

Hallo  FlorianLv1,

wow, einfach nur wow. Du programmierst da Spiele mit NPCs und entwickelst "Methoden", aber Du weißt nicht mal wie Du die Methode benutzt? Wie kann das denn passen?

Du zeigst keinen Code, Du sagst nicht mal was push und pop machen (Methoden schreibt man übrigens klein). Typischerweise kennt man push und pop von einer Stack Implementierung. Darüber verlierst Du aber kein Wort.

Ich habe voher schon eine Push Methode in der Hauptklasse des Spiels implementiert , die die Rotation des Players speichert.

Klingt nach Stack, aber wozu Rotation auf einen Stack legen? Was interessieren die alten Werte? Dazu ist ein Stack lifo (Last In First Out).

Du schreibst auch nicht was deine Methoden überhaupt tun. Wie soll man dir jetzt helfen? Ohne Code, ohne Informationen?

Gruß

Woher ich das weiß:
Berufserfahrung

Hi,

ok sorry. habs jetzt versucht etwas detaillierter zu beschreiben:

https://imgur.com/gallery/HZsuS6T

0
@FlorianLv1

ich habe noch eine NPC Klasse, in dieser wird die act methode, also die bewegung des npc's definiert. Da habe ich auch mit der pop methode versucht, aber leider kein erfolg bisher gehabt.

Vielleicht hatte ich auch einen denkfehler.

LG

0
@FlorianLv1

Nicht sehr überzeugend ... das ist nicht auf deinem Mist gewachsen.

Sonst wüsstest was der Ringbuffer wirklich tut

0
@Erzesel

Der RingBuffer ist ziemlich falsch benannt. Würde das Ding eher "VeryLimitedStack" nennen. Ein Ring gibt es dort überhaupt nicht.

Pusht man mehr Elemente drauf als der "RingBuffer" groß ist, dann werden die Elemente verworfen. Popt man mehr Elemente als vorhanden sind, dann wird einfach 0 zurückgegeben.

int ist wohl auch nicht der beste Weg um Richtungen zu speichern.

capacity ist völlig unnötig, das Array weiß wie groß es ist.

FlorianLv1 könntest Du einfach deine Aufgabenstellung verraten, statt halbe "Lösungen" aus der man deine Aufgabenstellung ableiten muss?

Bisher habe ich die Vermutung, dass ihr einen Stack implementieren sollt und dazu ein kleines Beispielprogramm schreiben. Ansonsten kann man:

wo wir die Pop Methode bei Java anwenden sollen

auch so verstehen, dass ihr java.util.Stack verwenden sollt um ein kleines Beispiel zu programmieren.

Zu deinem Spiel selbst. Du erstellst einen "RingBuffer" mit 4 möglichen Plätzen.

Bei Tastendruck wird entsprechend in int Wert auf den Puffer geworfen. Außerdem wird noch die Spielerposition angepasst. Dann wird das Element auch gleich wieder vom Puffer entfernt. Ich vermute Du probierst hier rum, ein Ziel erreicht den Puffer nämlich nicht.

Bei deinem Code solltest Du wohl die Zombie.act Methode anpassen. Die zeigst Du leider nicht, aber die könnte so aussehen:

public void act(Player player) {
    int targetX = player.getX();
    int targetY = player.getY();

    if (this.x < targetX) {
        this.x = this.x + 1;
    }

    if (this.x > targetX) {
        this.x = this.x - 1;
    }

    if (this.y < targetY) {
        this.y = this.y + 1;
    }

    if (this.y > targetY) {
        this.y = this.y - 1;
    }
}

Der Code ist auf absolutem Anfängerniveau geschrieben (wie ich finde), da ich annehme, dass Du einer bist.

Selbstverständlich kann man das alles viel kürzer schreiben und man könnte es auch mathematischer lösen, aber ich denke so verstehst Du es am besten.

 if (this.x < targetX)

Wenn die X-Position des Zombies kleiner ist als die X-Position des Spielers, dann:

 this.x = this.x + 1;

Wird die X-Position des Zombies um eins vergrößert. Ja, x++ reicht auch, aber vielleicht möchtest Du ja mal eine Variable als Geschwindigkeit benutzen.

Alle anderen Bedingungen funktionieren analog. Insgesamt wird sich der Zombie Richtung Spieler bewegen, wenn die act Methode des Zombies aufgerufen wird.

Und Code zeigt man am besten per https://pastebin.com/ bei Bildern kann man nur lesen und nicht damit arbeiten.

Gruß

0
@AldoradoXYZ

Der Runde Buffer ist kein Stack die Methoden Namen push und pop suggerieren dies nur eigentlich ist es ein async FiFo der Player pusht lediglich Verfolger lesen lediglich vergangene Ereignisse... kein Pop im Sinne eines Stack.

Sowohl push als auch verwalten einen eigenen Zeiger in den Buffer der bei jeder Aktion jeweils eine Zelle weiter geschoben wird.

Ein zirkulärer Buffer ist eigentlich nur ein Array dessen Zellen über eine Modulo-Operation angesprochen werden:

Pushindex=(Pushindex+1) modulo bufferumfang

Das gleiche für pop

Der würde bei einem Spiel bei dem dem Spieler ein Zombie nachläuft durchaus Sinn machen . Der Async laufende NPC popt mit einer anderen Geschwindigkeit als der Player Werte pusht sind pos von Beiden gleich wird der Spieler gefressen. Ist er so schnell das er seine alten Positionen überschreibt bevor der Zombie sie popt verläuft sich der Zombie ...

Doch nicht so gut, wie oben erklärt, die Position zu speichern, der Zombie muss anhand der Stellungen ebenso wie der Player die Positionen berechnen... dann macht der Ringbuffer absolut Sinn. Der Durchmesser des Buffers entscheidet bei wie viel Schritten Vorsprung einen der Zobie aus den Augen (Buffer) verliert. Der Buffer ist für solche Sachen der ideale Kanditat.

0
@AldoradoXYZ

Hi,

danke fuer deine Hilfe.

Die Aufgabe: Benutzt den Ringpuffer aus Aufgabe 1, um das Verfolgen eurer Spielfigur durch einen NPC zu realisieren. Erweitert die Implementierung aus ¨Ubungsblatt 3 so (oder erstellt eine neue Klasse), dass der NPC in einen Verfolgermodus umschaltet, wenn die Spielfigur in einer bestimmten Entfernung vor ihm platziert wird. Ein Ringpuffer wird genutzt, um die Bewegungen der Spielfigur aufzuzeichnen. Da diese nur Einerschritte macht und dabei in Richtung ihrer Schritte blickt, reicht es, ihre Rotationen zu speichern. Tragt erst die Rotation des NPC so oft in den Ringpuffer ein, wie es n¨otig ist, um durch Schritte die jetzige Position der Spielfigur zu erreichen. Tragt danach mit jedem weiteren Schritt der Spielfigur deren Rotation nach dem Schritt in den Ringpuffer ein. Zus¨atzlich entnehmt ihr immer eine Rotation aus dem Ringpuffer und bewegt euren NPC in diese Richtung. Dadurch f¨uhrt der NPC zeitverz¨ogert dieselben Bewegungen wie die Spielfigur aus.

Bei Aufgabe 1 war die Klasse RingBuffer schon vorgegeben, ich musste die Methoden (push, pop, etc...) einfach vervollstaendigen.

0
@FlorianLv1
das ist die act Methode. Die schon vorgegeben ist.

void act(final GameObject player)
  {
    // Vorwärts bewegen
    if (avatar.getRotation() == 0) {
      avatar.setLocation(avatar.getX() + 1, avatar.getY());
       
    }
    else if (avatar.getRotation() == 1) {
      avatar.setLocation(avatar.getX(), avatar.getY() + 1);
       
    }
    else if (avatar.getRotation() == 2) {
      avatar.setLocation(avatar.getX() - 1, avatar.getY());
       
    }
    else {
      avatar.setLocation(avatar.getX(), avatar.getY() - 1);
       
    }
0
@Erzesel

Mh, ich kann schon den Code lesen. Trotzdem Danke, vielleicht hilft es dem FS.

Deine vorgeschlagene Lösung klingt ja ganz gut, aber ich denke sie ist für einen Anfänger nicht angemessen. Leider sagt der FS auch nicht genau was seine Aufgabe überhaupt ist.

Gruß

0
@FlorianLv1

Könntest Du mal alles an Code geben, inklusive Aufgabe 1?

Ich habe den Verdacht, dass Du Aufgabe 1 schon falsch gelöst hast. Sicher sein kann ich aber nur, wenn ich die genauen Aufgabenstellungen und Vorgaben kenne. Mich wundert, dass RingPuffer erwähnt wird, Du aber keinen RingPuffer implementiert hast.

Gruß

0
@FlorianLv1

u.a. habe ich solche if anweisungen versucht:

if (avatar.getX()+2 ==player.getX()) {
      if(avatar.getY()+2 == player.getY()) {
        buffer.pop(); // funktioniert denke ich mal nicht so, aber mit if habe ich es versucht.
0
@FlorianLv1
buffer.pop();

Gibt einen int zurück, diesen int verwendest Du aber nicht. Du brächtest zumindest eine Zuweisung:

int rotation = buffer.pop();

Danach kannst Du mit der rotation arbeiten.

buffer.pop() entfernt einen Wert von deinem "Puffer" und verwirft ihn.

Wäre trotzdem gut, wenn Du alles an Aufgabe mal zeigst.

Gruß

0
@AldoradoXYZ

Hi, danke fuer die schnelle Antwort. Also ich habe die Methode push und pop durch testmethoden getestet. Es scheinen beide zu funktionieren. Wenn ich ein element pushe, dann wird auch die capacity "voller" und wenn ich die methode pop benutze, wird mir das letzte element angezeigt, welches gepusht wurde und das element wird auch abgezogen.

0
@FlorianLv1

Das ist die Aufgabe zum RingBuffer gewesen: Das andere Gruppenmitglied implementiert den Ringpuffer, in dem die gepufferten Daten in einem Java-Array abgelegt werden. Eine effiziente Implementierung vermeidet das Umkopieren von Eintr¨agen, indem ein Index auf die Einf¨ugeposition verwaltet wird sowie ein Z¨ahler, der die Anzahl der aktuell gespeicherten Eintr¨age repr¨asentiert. Die Stelle, von der man dann Elemente entnehmen kann, kann aus den beiden Werten berechnet werden. Wenn der Einf¨uge-Index dasEnde des Arrays erreicht, f¨angt er am Anfang wieder an (deshalb nennt man das Konstrukt ”Ringpuffer“). Auch bei der Berechnung der Entnahmeposition muss darauf geachtet werden, geeignet innerhalb der Grenzen des Java-Arrays zu bleiben. Unterzieht die Implementierung regelm¨aßig den in Aufgabe 1.1 erstellten Tests, um zu sehen, welche davon bereits erfolgreich sind und wo noch etwas fehlt bzw. falsch implementiert ist.

Folgend habe ich das versucht:

class RingBuffer
{  
  //Attribute

  private int[] array;
  private int capacity;
  private int index;
   
  /**
   * Erzeugt einen Ringpuffer.
   * @param capacity Die maximale Anzahl von Einträgen, die gepuffert werden können.
   */
  RingBuffer(final int capacity)
  {
    this.capacity = capacity;
    array = new int[capacity];
     
  }

  /**
   * Fügt ein neues Element in den Ringpuffer ein.
   * @param value Der Wert, der eingefügt werden soll.
   * If Anweisung ueberprueft, ob noch index unter capacity ist. Wenn ja, wird 
   * index um ein erhoeht und ein neues Element hinzugefuegt.
   */
  void push(final int value)
  {
    if (index < capacity) {
       
      index++;
      array[index] = value;
       
    }  
  }

  /**
   * Entnimmt das älteste Element aus dem Ringpuffer.
   * @return Das Element, das entnommen wurde.
   * If, wenn der Stack nicht leer ist, index minus 1 da ein Element entnommen wird.
   * else, wenn der Stack leer ist.
   */
  int pop()
  {
    if (index >= 0) {
      return array[index--];
       
    }
      else {
        return 0;
      }
  }

  /**
   * Liefert das älteste Element aus dem Ringpuffer zurück, ohne es zu entnehmen.
   * @return Das älteste Element im Ringpuffer.
   */
  int peek()
  {
    if (index >= 0) {
      return array[index];
       
    }
      else {
        return 0;
      }
  }

  /**
   * Liefert die Anzahl der Elemente zurück, die sich im Puffer befinden, d.h. die
   * mit {@link pop()} entnommen werden könnten.
   * @return Die Anzahl der belegten Einträge im Puffer.
   */
  int size()
  {
    if (index >= 0) {
      return index;
       
    }
      else {
        return 0;
      }
  }
}
0
@FlorianLv1

Also ein RingPuffer ist aber etwas anderes. Ein RingPuffer hat eine Kapazität sagen wir 3. Nun ein Beispiel:

push(1): Ringpuffer sieht dann so aus (1)

push(5): Ringpuffer sieht dann so aus (5,1)

push(2): Ringpuffer sieht dann so aus (2, 5, 1) //RingPuffer ist nun voll

push(8): Ringpuffer sieht dann so aus (2, 5, 8) //Das älteste Element wird überschrieben

Dazu ist es üblich eine gesonderte Lese-Position zu speichern. Ok, wenn man pop schon als Methodennamen benutzt, dann ergibt evtl. auch das neuste Element Sinn.

Du hast allerdings eher einen Stack mit maximaler Größer implementiert. Stacks zeichnen sich eigentlich dadurch aus, dass sie unbegrenzt wachsen können (natürlich so, dass es der Speicher zulässt).

Hier findest Du ganz interessante Implementierungen zum RingBuffer:

http://tutorials.jenkov.com/java-performance/ring-buffer.html wobei der Code unter aller Kanone ist, wenn ich mir die weitergehenden Beispiel ansehe :( . Aber die einfache Implementierung reicht dir ja schon.

Gruß

0
@AldoradoXYZ

Der Satz gibt auch genau das wieder, was ich beschrieben habe:

Wenn der Einf¨uge-Index dasEnde des Arrays erreicht, f¨angt er am Anfang wieder an (deshalb nennt man das Konstrukt ”Ringpuffer“). 

Dein RingBuffer ist falsch implementiert, da Du nicht wieder von vorne anfängst und das älteste Element überschreibst.

Bis wann brauchst Du die Lösung?

Gruß

0

Du hattest keinen Denkfehler, du hast garnicht Begriffen was der Code bewirkt und was da in den Ringbuffer gespeichert wird .

Soweit ich den Code interpretiere wird je nach Tastedruck eine Animation ausgelöst "wahrscheinlich einer von mehreren den Bewegungen zugeordneten Sprites" egal... , das Sprite zudem auch noch auf einer Ebene bewegt.

Die push-methode speicher nur (je nach gedrückter Taste) den Wert 0 bis 3 im Ringbuffer... wozu? Frag den der es programmiert hat. .

Eine potentielle pop-methode würde nichts weiter tun als die als die bisher gedrückten Tasten aus dem Buffer zu zu lesen. Dabei benötigen sowohl push wie pop einen eigenen "stackpointer" (ich nehme an die Objekte sollen async agieren...

Pseudocode:
int r=buffer.pop();
Npc.rotate(r);
Npc.setlocation...

...und da liegt der Hase begraben...

Du hättest neben der "nummer der Rotation auch die Position in de Ringbuffer pushen sollen. Statt nur int rotatation zu speichern , solltest Du push und pop so modifizieren das ein Hash aus r, posx,posy abgelegt oder eingelesen wird.Ergo müssen sowohl push als auch pop modifiziert werden, damit dein Npc erfährt wo du entlanggelatscht bist . Die Rotationsstellung aufzuzeichnen lässt den Npc nur auf der Stelle drehen.

Java Umlaute ersetzen Scanner?

Hi, ich verstehe nicht warum die Umlaute nicht ersetzt werden, sollte doch mit der replace() Methode funktionieren. Könnt ihr mir helfen ?

CODE:

    Scanner s = new Scanner(System.in, "UTF-8");
    
    System.out.println("Vorname: "); String vorname = s.nextLine().toLowerCase().replace("ä","ae").replace("ö", "oe").replace("ü","ue");
    System.out.println("Nachname: "); String nachname = s.nextLine().toLowerCase().replace("ä","ae").replace("ö", "oe").replace("ü","ue");
    System.out.println(nachname + "." + vorname + "@student.tgm.ac.at");
    
    s.close();
}

}

...zur Frage

Wie funktionieren exceptions in java?

wenn man es mit try und catch schreibt, hab ich gelernt dass man catch(Exception e) schreibt und danach e.printStackTrace ... Aber warum schreibt man nicht Exception e = new Exception(); ??? Und was macht die Methode printStackTrace in der Klasse Exception?

...zur Frage

Javac funktioniert bei mir nicht, obwohl mir die Konsole die Java-Version mit java -version angibt. Weiß jemand Hilfe?

Wenn ich den Befehl javac -version eingebe, komt immer, dass der Befeh entweder falsch geschrieben wurde oder nicht gefunden werden kann.. Ich habe auch schon die Variablen bei Path verändert, aber irgendwie scheint es trotzdem nicht zu funktionieren... Ich arbeite mit jEdit, allerdings ist das auf D:\ installiert und JDK auf C:\, aber macht das einen Unterschied?

Ich bin um jede Hilfe dankbar! :D
(Achso, und ich arbeite mit Windows 7)

...zur Frage

javac-Befehl kann nicht gefunden werden?

Ich habe folgendes Problem: Ich habe mir Java 1.8.0_51 heruntergeladen und wollte jetzt in der Eingabeaufforderung den Befehl javac programm.java verwenden, darauf erscheint allerdings, dass der Befehl "javac" entweder falsch geschrieben ist oder nicht gefunden werden kann(Ich hab mich ganz sicher nicht verschrieben und es auch mehrmals ausprobiert). Außerdem habe ich im Internet alle Forenbeiträge auf den verschiedensten Seiten gelesen und die angegebenen Tipps ausprobiert-ohne Erfolg. Folgendes habe ich schon gemacht

-Unter Umgebungsvariablen bei PATH steht:C:\ProgramData\Oracle\Java\javapath;C:Program Files\Java\jdk1.8.0_51\bin; (Ich habs auch statt Program Files mit Programme versucht hat auch nicht funktioniert)

-Java ernut heruntergeladen-scheint auch alles zu funktionieren

-Computer neu gestartet

Ich hab Windows 7 64bit, falls das hilft. Bitte helft mir ich weiß nicht mehr weiter!

...zur Frage

Java If-Bedingung, for-Schleife, boolean Methode?

Ich kenn mich mit Java noch nicht wirklich aus und weiß hier im Moment nicht wie ich das, was ich vorhabe umsetzen kann.
Ich möchte, dass wenn ich die Methode „problemVorhanden“  5 mal aufgerufen habe, die Konsole „Problem entdeckt“ und ansonsten „Kein Problem entdeckt“ ausgibt.
Ich hab jetzt alles mögliche versucht das irgendwie hinzubekommen, aber es funktioniert nicht.
Was muss ich jetzt in die if-Bedingung schreiben, damit es funktioniert, bzw. kann das so überhaupt funktionieren?

...zur Frage

Kann man mit Java ein 3D Spiel Programmieren und wenn ja welche Programmieroberfläche ist dazu geeignet(ich benutze Eclipse)?

...zur Frage

Was möchtest Du wissen?