Pong mit TigerJython programmieren?

1 Antwort

Meiner Ansicht nach passt da schon etwas mit den von dir verwendeten Funktionen nicht.

  • Die Funktion fill bspw. sollte laut Dokumentation zwei Argumente überreicht bekommen.
  • Mit getKeyCodeWait verwendest du eine Funktion aus dem gpanel-Modul, welches du aber gar nicht einbindest. Zudem blockt diese Funktion die Ausführung so lange, bis eine Taste gedrückt wird. Das ist für ein Spiel eher ungünstig. Ich würde eher den Weg gehen, der für gturtle in der Dokumentation (Abschnitt Tastaturevents) gezeigt wird.

In deiner Game Loop brauchst du zunächst einmal nur den Ball bewegen. Jede Schleifeniteration bewegt ihn um eine festgelegte Anzahl an Schritten. Es ist dabei sinnvoll, in drei Werte zu unterteilen: Geschwindigkeit (also Schritte, um die der Ball je Iteration bewegt wird), Richtung auf der X- und Richtung auf der Y-Achse (1 oder -1). Die Geschwindigkeit multipliziert mit der Richtung ergibt die Schritte, die je Iteration vom Ball abgelaufen werden.

Wie das Spiel anfängt, kannst du ja für dich selbst entscheiden. Entweder, du bewegst den Ball immer in eine fest definierte Richtung oder du knobelst es aus, indem du vom Programm eine Zufallszahl generieren lässt.

Nun muss der Ball erkennen, wann er gegen ein Hindernis (Seitenränder, Balken) stößt. Dafür benötigst du Positionsvergleiche. Zeichne dir das Spielfeld mit Ball und Balken auf, wenn es dir hilft. Ein Beispiel hierfür: Wenn die X-Position des Balls bei 0 liegt, hat er offenkundig den linken Seitenrand gerammt. Damit er nun nicht aus dem Spielfeld läuft, sollte folgend seine Richtung invertiert werden (aus -1 wird 1).

Das gleiche Verfahren wird verwendet, um zu ermitteln, ob einer der Spieler den Ball nicht abwehren konnte. Nur wird hier als Reaktion der Ball wieder auf seine Startposition gesetzt und eine entsprechende Zählervariable für den Punktestand wird erhöht.

Den/die Spielerbalken bewegst du mittels Key Events (siehe oben verlinkter Artikel). Bzw. besser formuliert: Du setzt nur dessen X-Position und zeichnest den Balken dann von dort ausgehend.

Lager dir all diese Punkte in eigene Funktionen aus, die dann in der Game Loop ausgeführt werden. Variablen für Punkte- und Ballzustand sollten global deklariert sein.

Das könnte dann ungefähr so aussehen:

while True:
  moveBall()
  drawBall()
  drawPaddle()

  calculateScore()
  
  if someoneHasWon():
    drawText()
    break

  drawScore()                

(nur als exemplarisches Beispiel).