Ich muss für die Schule Snake programmieren und habe bis jetzt diesen Code geschrieben.Kann mir bitte jemand helfen, sodass der Code korrekt ist zum Vorstellen?

 - (Computer, Schule, Informatik)  - (Computer, Schule, Informatik)  - (Computer, Schule, Informatik)  - (Computer, Schule, Informatik)  - (Computer, Schule, Informatik)  - (Computer, Schule, Informatik)  - (Computer, Schule, Informatik)  - (Computer, Schule, Informatik)

1 Antwort

Ich könnte dir womöglich helfen, wenn ich denn wüsste, wo du konkret Probleme hast. Zusätzlich muss ich sagen, dass sich meine Hilfe beschränken wird, schon allein, weil der Quelltext nicht in editierbarer Form vorliegt, sodass es einfach testbar wäre.

Momentan beim schnellen Drüberfliegen fallen mir folgende verbesserungswürdige Punkte auf:

  • Du solltest deinen Quellcode richtig einrücken
  • Du solltest eindeutige und aussagekräftige Bezeichner verwenden
  • Halte dich an Java-Konventionen, schreibe Bezeichner in der kamelHoeckerSchreibweise. Variablen- und Methodennamen beginnen mit einem kleinen Buchstaben, Klassennamen mit einem Großbuchstaben.
  • Die Richtung in einer statischen Variable zu speichern, ist unnötig. Das lässt sich alles via Instanzen regeln.
  • Wenn du mehr als zwei unterschiedliche Werte aus einen Kontext zurückgeben möchtest, verwende kein Array, sondern erstelle dir eine eigene Klasse.

Zu guter Letzt wäre für mich noch die Frage, ob du denn mit Java Swing arbeiten musst?


matteo2753 
Beitragsersteller
 26.06.2019, 01:00

Dazu könnte ich Ihnen den ganzen Code schicken!

matteo2753 
Beitragsersteller
 26.06.2019, 00:59

Vielen Dank erstmal! Ich habe nur das Problem das ich es am Freitag in Form eines Ordners abgeben muss und dann in einer Woche eine Präsentation halten muss und alles erklären muss. Könnten Sie mir den Code vereinfachen und zum laufen bringen? Sonst hab ich echt Probleme... weil ehrlich gesagt Check ich viele Sachen nicht und bin überfordert besonders jetzt in der kurzen Zeit

regex9  26.06.2019, 04:06
@matteo2753

Nein, deine Hausaufgaben musst du schon allein machen. Dafür ist GF auch nicht da.

Sofern dir die Technik etwas offener steht - du die grafische Oberfläche also nicht zwingend mit Swing aufbauen musst, könnte ich dir stattdessen Processing empfehlen. Processing ist eher für Minispiele ausgelegt, als Swing und auch einfacher aufgebaut. Du kannst dich gänzlich auf die Implementation der Logik konzentrieren und musst nicht mit Besonderheiten von Swing kämpfen.

Wie man es in sein Java Projekt einbaut, wird hier ganz einfach erklärt. In anderen IDEs (NetBeans, IntelliJ, ...) gestaltet sich der Vorgang nicht großartig anders. Eine Funktionsreferenz lässt sich hier finden.

Relevant für ein Spiel ist eine Game Loop. In deinem derzeitigen Projekt nutzt du paintComponent dafür. In Processing ist es die draw-Funktion, die implizit immer neu aufgerufen wird. Bei jedem Aufruf der Funktion prüfst du die getätigten Tastatureingaben, setzt den Futtertrog für die Schlange und zeichnest schlussendlich die Schlange selbst mit neuer Position.

Die Schlange wäre durch eine verkettete Liste gut realisierbar.

class Segment:
  -next: Segment
  -position: Position

  +add(segment: Segment): void

class Snake:
  -root: Segment

  +add(segment: Segment)
  +render(): void

Das Hinzufügen eines neuen Knotens könnte so aussehen:

last = root

while (last.next != null):
  last = last.next

last.add(new Segment())

Damit sich die Schlange dynamisch bewegt, brauchst du eigentlich nur vom Kopf aus vorzugehen. Die alte Position dient als neue Position für den Nachfolger. Wenn die neue Position für ein Segment gesetzt wurde, kann es gezeichnet werden.

Wenn Futter aufgenommen wird, gibt es zwei Möglichkeiten: Entweder das Futter wird (als neues Segment) an den Kopf der Schlange gehängt (neues Root-Element), kurz bevor der Schlangenkopf die Futtertrogposition erreicht hat oder man hängt ein Segment ans Ende, sobald die Schlange eine neue Position weitergerückt ist.

Doch zunächst solltest du dich mit dem Aufbau und Zeichnen der Schlange beschäftigen. Danach mit der Kollision (Spielfeldränder / eigener Körper).

matteo2753 
Beitragsersteller
 26.06.2019, 07:21
@regex9

Vielen Dank. Nochmal zu dem Code oben. Wie bekomm ich Listener hin dami die Schlange sich bewegen kann, stimmt so noch nicht?

Danke

regex9  26.06.2019, 12:34
@matteo2753

Wie gesagt solltest du zunächst die statische Variable einsparen. Definiere für die Listener-Klasse ein Attribut des Objekts, welches beobachtet werden soll und greife über dieses auf die Eigenschaften zu.

Exemplarisches Kurzbeispiel zur Verdeutlichung des Prinzips:

class SnakeListener {
  private Snake snake;

  public Listener(Snake snake) {
    this.snake = snake;
  }

  void keyPressed(KeyEvent evt) {
    // ...
    snake.setDirection(/* some direction */);
  }
}

// if append listener
addKeyListener(new SnakeListener(snake));

Im Folgenden solltest du erst einmal prüfen, ob deine Tastendrücke überhaupt erhört werden / die Handler-Methode aufgerufen wird (nutze Testausgaben oder den Debugger). Beachte, das sich das Panel im Fokus befinden muss, damit es auf Events reagieren kann.