Snake ändert Geschwindigkeit

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
smashed to pieces
User
Beiträge: 38
Registriert: Samstag 24. November 2007, 16:50

Sonntag 23. November 2008, 22:03

hallo,
hatte mir für heute vorgenommen Snake zu programmieren.
Ich weiß, es nervt bestimmt schon, allerdings wollt ich einfach einmal schaun wie es mit meinem Verständnis in punkto Objekte aussieht. Sagen wir es so, es läuft, aber ja.
Das merkwürdige Problem, welches aufgetaucht ist, ist, dass die Schlage ihre Geschwindigkeit ändert. Nach Programmstart ist die Geschwindigkeit konstant. Aber ab einer gewissen Spielzeit wird sie erst langsamer und plötzlich und stoßartig schneller.

Code ist hier: http://paste.pocoo.org/show/92305/

In Zeile 205

Code: Alles auswählen

board.canvas.after(60, lambda board=board, snake=snake, tastenpuffer=tastenpuffer: run(board, snake, tastenpuffer))
Ist der Befehler der die Geschwindigkeit bestimmt. Also keine Ahnung warum sich diese verändert.

Mein erster Versuch war time.sleep zu verwenden. Allerdings bekam ich immer eine Fehlermeldung.
Wenn ich im jetztigem Code statt der Zeile 205

Code: Alles auswählen

time.sleep(0.5)
run(board, snake, tastenpuffer)
verwende, schläft mein Programm allerdings durchgehend. Nichteinmal das Root öffnet sich.

Aja die Buttons sind noch nicht verknüpft. Überhaupt ist der Programm erst halb fertig.
Würd mich über alle Verbesserungsvorschläge freuen.

mfg smashed
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Sonntag 23. November 2008, 23:47

Hallo StP !

Du solltest die Punkte loeschen und nicht nur uebermalen.

Code: Alles auswählen

board.canvas.after(60, run, board, snake, tastenpuffer)
Geht auch so

Fuer die Steuerung wuerde ich keine Strings uebergeben, sondern gleich die Werte fuer x und y.

gruss frank
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Montag 24. November 2008, 16:19

Hallo StP !

Du baust dir auch ein eigenes Koordinatengitter - ist nicht noetig, denn du musst nur pruefen, ob der Schlangenkopf ausserhalb des Spielfeldes ist.

gruss frank
smashed to pieces
User
Beiträge: 38
Registriert: Samstag 24. November 2007, 16:50

Montag 24. November 2008, 22:28

Hallo kaytec,
danke für die Antwort. Der Tipp mit dem Koordinatengitter war super, danke.

Das ich die Punkte nur "übermale" hat den einfachen Grund das ich es nicht schaffe diese zu löschen :/ .
Denn wenn ich den Punkt wie in Zeile 20 definiere und r ausgeben lasse sind es nur Nummer. Genauer gesagt die Anzahl der Punkte. (im jetztigem Code ist der r = naturlich sinnfrei.)
kaytec hat geschrieben:Fuer die Steuerung wuerde ich keine Strings uebergeben, sondern gleich die Werte fuer x und y.
Versteh leider nicht ganz wie du das gemeint hast. Denn ich muss so oder so einmal definieren, welche Taste was verursacht. Und die Tasten lassen sich ja bequem mit Strings beschreiben.

code: http://paste.pocoo.org/show/92450/ -> ein paar überflüssige Dinge entfernt.

mfg smashed
Zuletzt geändert von smashed to pieces am Montag 24. November 2008, 22:37, insgesamt 2-mal geändert.
smashed to pieces
User
Beiträge: 38
Registriert: Samstag 24. November 2007, 16:50

Montag 24. November 2008, 22:36

Mein geschwindigkeits Problem besteht allerdings weiterhin. Ist das bei euch/ dir auch so? Bzw. hast jemand/du einen Lösungsvorschlag?

mfg smashed
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Montag 24. November 2008, 22:49

smashed to pieces hat geschrieben:Mein geschwindigkeits Problem besteht allerdings weiterhin. Ist das bei euch/ dir auch so?
Du müsstest mal präzisieren, was es heißt, "nach einer Weile".
Ich habe ein wenig mit dem Programm herumgespielt; bis zu 8 Punkten konnte ich dein beschriebenes Verhalten nicht verifizieren - die Geschwindigkeit war unverändert.
BlackJack

Dienstag 25. November 2008, 09:05

@smashed to pieces: `Tkinter.Canvas` ist Vektorgrafik, dass heisst alle "übermalten" Objekte existieren weiter und müssen bei jeder Änderung immer wieder gemalt werden.

Die Methoden, die Objekte auf dem `Canvas` erzeugen, geben alle ein "handle" zurück, mit dem man später das Objekt noch verändern kann, zum Beispiel um die Farbe zu ändern. Beim Effbot gibt's ein Beispiel, das die Farbe einer Linie ändert: http://effbot.org/tkinterbook/canvas.htm
Benutzeravatar
kaytec
User
Beiträge: 544
Registriert: Dienstag 13. Februar 2007, 21:57

Dienstag 25. November 2008, 14:16

Hallo StP !

Wenn du die Schlange erstellst, dann gebe einen tag="snake" mit und bevor du sie wieder zeichnest loeschst du mit self.canvas.delete("snake") alle gezeichneten Objekte, die an diesen tag gebunden sind.

gruss frank
Antworten