@Fly-guy: Es wird alles aus `random` importiert und nichts davon verwendet.
Es fehlt der Aufruf von `mainloop()` vorher läuft die GUI überhaupt gar nicht. Sollte sie das bei Dir tun, dann verwendest Du wahrscheinlich einen Editor oder eine IDE um das Programm auszuführen die da ”Magie” macht, die es ohne diese Umgebung nicht geben würde. Einer der Gründe warum es wichtig ist Programme alleinstehend von einem Terminal aus zu starten wenn man sie testet.
Die ganzen Schleifen sind im Moment unsinnig weil nichts davon für den Benutzer sichtbar ist. Das bewegen der Spieler an ihre Startpositionen passiert vor dem Aufruf der Hauptschleife, der ja am Ende der Initialisierung der GUI stehen muss, denn der Aufruf blockiert bis das Hauptfenster geschlossen ist. Diese Bewegung muss auch schon mit einem `after()`-Aufruf pro Schleifendurchlauf passieren. Beim `enemy` macht das aber auch nicht so wirklich viel Sinn den zu bewegen wenn der `HIDDEN` ist.
`sprung()` ist nicht so gut als Name wenn da erst noch entschieden wird ob den nun gesprungen wird oder nicht. Entweder man nennt das generischer, `on_key()` beispielsweise, oder man bindet nur das Ereignis "<Up>" an diese Funktion.
Ergänzenz zu der Anmerkung das es keine globalen Variablen geben darf, kommt man zwar mit `functools.partial()` ein gewisses Stück weiter, aber jede nicht-triviale GUI braucht objektorientierte Programmierung. Also das man selber Klassen schreibt. Denn das folgende Beispiel hat zwar die Bewegung in mehrere `after()`-Aufrufe und den Zustand in die Argumente gesteckt, aber ausserhalb kommt man da nicht dran, zum Beispiel um zu verhindern das der Benutzer einen weiteren Sprung auslöst während die Spielfigur bereits im Sprung ist. Und so etwas wie Kollisionserkennung und darauf reagieren, zum Beispiel mit Abbruch des Sprungvorgangs, ist so auch nicht möglich, oder wird zumindest sehr, sehr unübersichtlich.
Code: Alles auswählen
#!/usr/bin/env python3
import tkinter as tk
from functools import partial
def do_jump(canvas, player, height, steps=None, is_up=True):
if steps is None:
steps = height
if steps:
canvas.move(player, 0, -1 if is_up else 1)
canvas.after(10, do_jump, canvas, player, height, steps - 1, is_up)
elif is_up:
canvas.after(1000, do_jump, canvas, player, height, height, False)
def start_jump(canvas, player, _event=None):
do_jump(canvas, player, 55)
def main():
window = tk.Tk()
window.title("Jump'n irgendwas")
canvas = tk.Canvas(window, width=500, height=350)
canvas.pack()
player = canvas.create_oval(190, 90, 210, 110, fill="black")
enemy = canvas.create_line(200, 150, 200, 130, state=tk.HIDDEN)
# enemy in startposition setzten
for _ in range(300):
canvas.move(enemy, 1, 0)
for _ in range(175):
canvas.move(enemy, 0, 1)
# player in startposition setzen
for _ in range(240):
canvas.move(player, 0, 1)
canvas.bind_all("<Up>", partial(start_jump, canvas, player))
window.mainloop()