Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Azasel

unregistriert

1

26.06.2017, 21:52

[Javascript] Snake update() fehler

Mein Snake Programm tut nicht das, was ich erwarte, und zwar werden immer nur 2 Segmentobjekte gezeichnet, egal wie viele Segmentobjekte sich im Schlangenobjekt befinden.
An der Snake.draw() Methode kann es nicht liegen, es muss an der update() Methode liegen.

Javascript-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var schlange = function()
        {
            this.segmente = 
            [
                new block(14,4),
                new block(13,4),
                new block(12,4),
                new block(11,4),
                new block(10,4),
                new block(9,4),
                new block(8,4)              
            ];
        }
        
        var richtung = "rechts";
        
        schlange.prototype.update = function()
        {
            switch(richtung)
            {
                case "rechts":
                    for(var i = 0; i < this.segmente.length-1; i++)
                    {
                        //Hier müsste glaube ich der Fehler liegen
                        this.segmente[i+1].posX = this.segmente[i].posX;
                        this.segmente[i+1].posY = this.segmente[i].posY;
                    }
                    this.segmente[0].posX += 10;
                    break;
...


Wäre echt nett wenn mir jemand sagen könnte, was ich ändern muss, damit alle Segmente gezeichnet werden.
Was die Namensgebung der Variablen angeht, das werde ich später sowieso ändern, fall mich jetzt jemand darauf aufmerksam machen möchte.
Hier der vollständige Code:

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

26.06.2017, 22:57

Dein Kommentar ist schon richtig. Überleg mal, was passiert. Zuerst wird Segment 1 auf Segment 0 gesetzt. Dann Segment 2 auf Segment 1, was aber vorher schon auf Segment 0 gesetzt wurde, also sind jetzt auch die Segmente 2 und 0 identisch. Und so zieht sich das immer weiter durch, und am Ende sind alle Segmente identisch. Dass du zwei siehst, liegt daran, dass du anschließend nochmal Segment 0 bewegst.


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

27.06.2017, 09:05

Was wäre denn wenn du nicht alle Segmente verschiebst, sondern nur das letzte im Container nach vorne bringst und dessen Position anpasst?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Azasel

unregistriert

4

27.06.2017, 15:43

Dein Kommentar ist schon richtig. Überleg mal, was passiert. Zuerst wird Segment 1 auf Segment 0 gesetzt. Dann Segment 2 auf Segment 1, was aber vorher schon auf Segment 0 gesetzt wurde, also sind jetzt auch die Segmente 2 und 0 identisch. Und so zieht sich das immer weiter durch, und am Ende sind alle Segmente identisch. Dass du zwei siehst, liegt daran, dass du anschließend nochmal Segment 0 bewegst.


Ok, jetzt (, nach 5 Minuten Kritzelei auf einem Papier,) ist mir der Fehler auch aufgefallen.

Javascript-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
schlange.prototype.update = function()
        {
            switch(richtung)
            {
                case "rechts":
                    for(var i = 1; i < this.segmente.length; i++)
                    {
                        this.segmente[this.segmente.length-i].posX = this.segmente[this.segmente.length-i-1].posX;
                        this.segmente[this.segmente.length-i].posY = this.segmente[this.segmente.length-i-1].posY;
                    }                  
                    this.segmente[0].posX += 10;
                    break;

Danke ^^

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

27.06.2017, 20:36

Ok, jetzt (, nach 5 Minuten Kritzelei auf einem Papier,) ist mir der Fehler auch aufgefallen.

An sich läufst du die Elemente ja jetzt von hinten nach vorne durch. Du kannst deinen Code vereinfachen indem du die Berechnung vom Index in die Schleife verschiebst. Dann wird es etwas offensichtlicher was du da tust. Soll heißen sein i läuft vom letzten zum zweiten Element, anstatt i als Offset zum letzten Element laufen zu lassen. Zumindest finde ich das so lesbarer und verständlicher.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige