Denk oder Codefehler?

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Benutzeravatar
Benni1000
User
Beiträge: 9
Registriert: Mittwoch 27. Juni 2012, 13:51
Wohnort: Österreich
Kontaktdaten:

Hallo,

ich habe mich heute an ein projekt gesetzt das ich schon seit längerer Zeit umsetzen will, aber es wegen der dahinterstehenden logik nie getan habe.
Snake. Hört sich villeich etwas lächerlich an aber ich habe Probleme die Körperteile richtig zu berechnen.
Ich habe es mit diesem Code versucht: http://pastebin.com/r3V7fLPh
Aber das funktioniert nicht, ein Teil scheint wohl richtig berechnet zu werden, wird aber nicht angezeigt, das andere erreich komplett falsche werte.
http://pastebin.com/C3Fm6yMi
Ich habe wirklich keine Ahnung woran es liegen könnte, aber ich denke das es einfach nur ein blöder denkfehler ist, der diesen Effekt herbeiführt.
Für Lösungsvorschläge bin ich wie immer sehr dankbar.

Mfg Benni1000
Lust auf Russisches Roulette?
[ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo "You live"

Besucht doch mal meine Website und hinterlasst Kommentare zu meinen Programmen.
Alle Programme sind OpenSource und mit einer CreativeCommons Lizenz geschützt.
http://benni1000.eu
BlackJack

@Benni1000: `Rect.move()` bewegt nicht zu absoluten Positionen sondern um relative Werte.
Benutzeravatar
Benni1000
User
Beiträge: 9
Registriert: Mittwoch 27. Juni 2012, 13:51
Wohnort: Österreich
Kontaktdaten:

Ach verdammt, stimmt ja.
Ok, danke schonmal dafür jetzt kann ich mir das seltsame verhalten erklären.
Aber jetzt habe ich absolut keine ahnung wie ich das anders lösen könnte, da sich die stücke ja auch nach links und rechts bewegen müssen und nicht
nur nach oben oder unten kann ich sie nicht einfach immer 3 in eine richtung bewegen. Dann müsste das untere Stück das verhalten des oberen stücks
erben oder nicht? Jetzt bin ich etwas verwirrt.

Mfg Benni1000
Lust auf Russisches Roulette?
[ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo "You live"

Besucht doch mal meine Website und hinterlasst Kommentare zu meinen Programmen.
Alle Programme sind OpenSource und mit einer CreativeCommons Lizenz geschützt.
http://benni1000.eu
BlackJack

@Benni1000: Du kannst die Koordinaten von `Rect`\s nicht nur abfragen, sondern auch einfach neue (absolute) Werte zuweisen. Und Du musst das auch nicht für X und Y getrennt machen — die Objekte haben sogar mehrere Bezugspunkte die man abfragen und setzen kann.
Benutzeravatar
Benni1000
User
Beiträge: 9
Registriert: Mittwoch 27. Juni 2012, 13:51
Wohnort: Österreich
Kontaktdaten:

Die technischen Probleme habe ich inzwischen alle beseitigt, aber es bleibt immer noch das Problem, das ich nicht weis
wie ich das umsetzen soll, das sich die körperteile wie in Snake verhalten. Ich hab da jetzt 2 Stunden drüber nachgedacht, und alle Lösungen
kommen mir falsch vor (was sie auch sind). Wenn jemand weis wie man das am besten umsetzen kann dann bin ich für alle vorschläge offen.
Ich hatte mir überlegt das alle Objekte abspeichern wo sie zuletzt waren. Das würde allerdings eine Kettenreaktion auslösen, die alle Teile in eine Richtung bewegt.
Es muss doch eine einfache Lösung für sowas geben.

Mfg Benni1000
Lust auf Russisches Roulette?
[ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo "You live"

Besucht doch mal meine Website und hinterlasst Kommentare zu meinen Programmen.
Alle Programme sind OpenSource und mit einer CreativeCommons Lizenz geschützt.
http://benni1000.eu
BlackJack

@Benni1000: Ich weiss jetzt nicht was Du mit Kettenreaktion und Bewegung in eine Richtung meinst. Du musst Dir nur klarmachen wo in einem Schritt der Kopf hin wandert, wohin das Körperstück nach dem Kopf, wohin das Körperstück danach, und so weiter. Meistens sind die Körperstücke grafisch identisch, dann muss man gar nicht alle neu zeichnen, sondern nur den Anfang und das Ende der Schlange anpassen.
Benutzeravatar
Benni1000
User
Beiträge: 9
Registriert: Mittwoch 27. Juni 2012, 13:51
Wohnort: Österreich
Kontaktdaten:

Ok, ich hab jetzt ein bisschen rumprobiert, und ich glaube ich bin schon ganz nah dran.
Ein problem besteht noch: die Stücke der Schlange schieben sich ineinander.
Villeicht sieht einer was ich falsch mache: http://pastebin.com/04jjKxsm
Müsste es nicht reichen die aktuelle position + bewegung abzuspeichern?

Code: Alles auswählen

if player.moving == 0:
            snake.insert(0,(player.rect.x,player.rect.y - 10,player.moving))
        if player.moving == 1:
            snake.insert(0,(player.rect.x,player.rect.y + 10,player.moving))
        if player.moving == 2:
            snake.insert(0,(player.rect.x + 10,player.rect.y,player.moving))
        if player.moving == 3:
            snake.insert(0,(player.rect.x - 10,player.rect.y,player.moving))
Die teile sind 10 * 10 px groß.
Lust auf Russisches Roulette?
[ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo "You live"

Besucht doch mal meine Website und hinterlasst Kommentare zu meinen Programmen.
Alle Programme sind OpenSource und mit einer CreativeCommons Lizenz geschützt.
http://benni1000.eu
BlackJack

@Benni1000: Du scheinst für jeden Teil zu speichern in welche Richtung er sich bewegen soll. Das ist nur beim Kopf interessant. Bei allen anderen Teilen wird die absolute Position im jeweils nächsten Schritt durch das Teil davor bestimmt.

Statt einer Liste würde sich übrigens `collections.deque` als Datentyp anbieten.
Antworten