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

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

21

02.03.2010, 20:30

es gibt zwei möglichkeiten.
1. du speicherst die position des kopfes im array in eigene variable. mit dieser methode schlängelt sich der kopf sozusagen durch das array. dann fängst du beim kopf an zu zählen und springst auf 0 wenn du die größe des arrays/der schlange erreicht hast, zählst so lang weiter bis du wieder beim kopf angekommen bist.
oder 2. du verschiebst alle elemente der schlange bei jedem schritt so, dass der kopf immer an erster stelle steht.

die zweite variante übersichtlicher und einfacher aber vielleicht minimal langsamer.
bei deinem code blick ich absolut nicht was du überhaupt vor hast.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

franz-21

Treue Seele

  • »franz-21« ist der Autor dieses Themas

Beiträge: 101

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

22

03.03.2010, 14:07

Hallo Leute!

Hab die Bewegung der Schlange so realisiert, das das letzte Stück vor die schlange gesetzt wird und dies zum Kopf wird. Das geschieht so: Der maximale x wert der Elemente wird gesucht und wird zum Kopf. Bei den Elementen [0]=30, [1]=31, [2]=32, [3]=33, ist 33 die größte x-Koordinate und wird zum Kopf und so auf 29 gesetzt. Es geht jetzt nur um die Bewegung nach Links. Das Problem ist jetzt aber wenn die Schlange das Fenster verlässt tritt ein blöder Fall auf. Der Kof hat die Koordinate 79 und die folgenden 0, 1, 2. jetzt ist aber der Kopf das größte Element und dadurch bleibt die Schlange stehen. Wie könnte man das vermeiden? Vl weiß wer von euch eine Lösung.


mfg

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

23

03.03.2010, 14:23

Zitat von »"franz-21"«

Es geht jetzt nur um die Bewegung nach Links.


ist doch absolut logisch. so wird es auch nicht funktionieren. deswegen meinte ich, dass ich kA hab was du vor hast.
ich hab dir zwei vorschläge gemacht wie du es ohne std::list/vector lösen könntest.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

franz-21

Treue Seele

  • »franz-21« ist der Autor dieses Themas

Beiträge: 101

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

24

03.03.2010, 14:27

Den ersten vorschlag von dir versteh ich nicht ganz, den ich aber verwenden möchte

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

25

03.03.2010, 14:44

du hast nen array mit vektoren in größe des spielfelds(maximale größe der schlange), einen zähler für die aktuelle größe und eine variable in der du die aktuelle position des kopfes speicherst.

jetzt ist der kopf mal die 4, 1-3 der körper und 0 das ende.

am anfang sieht deine schlange im array so aus:
43210
position des kopfes: 0
wenn du die schlange bewegst musst du alle elemente um eins verschieben und die 0 durch die neue 4 ersetzen
in diesem fall musst du im array selbst nichts verschieben weil du ja die variable für position des kopfes änderst und nur das alte schwanzende bzw. den neuen kopf aktualisierst.
32104
position des kopfes: letzte position(0) - 1 in diesem fall springst du wieder auf die länge der schlange(5) und subtrahierst 1 (position 4)

der nächste schritt:
21043
position des kopfes - 1 (3)

verlängerst du die schlange jetzt verschiebst du alle elemente die sich im array hinter dem kopf befinden um eins und lässt das schwanzende und die position des kopfes im array(die variable) wie sie sind.
210543

ich hoffe du hast das verstanden >.<
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

franz-21

Treue Seele

  • »franz-21« ist der Autor dieses Themas

Beiträge: 101

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

26

03.03.2010, 15:11

jawohl!!!

Das ist wircklich die einfachste methode und ich hab da mit Schleifen herumgemacht, sehr kompliziert aufjedenfall. Die Erklärung von dir hats voll gebracht. weiß auch nicht aber in letzter Zeit denke ich viel zu kompliziert, das muss sich umbedingt ändern.

Vielen Dank nocheinmal allen und vorallem NachoMan!
mfg

*Edit*
Die Schlange Bewegt sich, nur bei einer Richtungsänderung entstehen kurzzeitig Löcher die eher nicht erwünscht sind. Von Oben nach Rechts z.B.

Code:

C-/C++-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
31
32
33
34
35
36
37
38
if(bOben == true){

            iKopfY--;
            iZaehlerV++;
            iSchlangeX[iGroeßeSchlange-iZaehlerV]=iKopfX;
            iSchlangeY[iGroeßeSchlange-iZaehlerV]=iKopfY;
            if(iZaehlerV==iGroeßeSchlange){
                iZaehlerV=0;
                }
            }

if(bRechts == true){

            iKopfX++;
            iZaehlerH++;
            iSchlangeX[iGroeßeSchlange-iZaehlerH]=iKopfX;
            iSchlangeY[iGroeßeSchlange-iZaehlerH]=iKopfY;
            if(iZaehlerH==iGroeßeSchlange){
                iZaehlerH=0;
                }
            }

ZeichneSchlange(iSchlangeX, iSchlangeY, iGroeßeSchlange, iKopfX, iKopfY);

\\........................................................................................
void ZeichneSchlange(int iSchlangeX[], int iSchlangeY[], int &iGroeßeSchlange, int &iKopfX, int &iKopfY){

    for(int i=0; i<iGroeßeSchlange; i++){
        if(iSchlangeX[i] == iKopfX && iSchlangeY[i] == iKopfY){     //Wenn Kopf, s schreiben

            gotoxy(iSchlangeX[i], iSchlangeY[i]);
            cout<<"S";
            }
        else{           
            gotoxy(iSchlangeX[i], iSchlangeY[i]);       //Wenn nicht Kopf, * schreiben

            cout<<"*";
            }
        }
}

franz-21

Treue Seele

  • »franz-21« ist der Autor dieses Themas

Beiträge: 101

Wohnort: Bayern

Beruf: Schüler

  • Private Nachricht senden

27

03.03.2010, 16:31

Wird eigentlich in der forenübersicht ein theard, wo editiert wurde, der als neue nachricht angezeigt??

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

28

03.03.2010, 16:32

nein

moonwalker

Frischling

Beiträge: 7

Wohnort: derzeit New York

  • Private Nachricht senden

29

03.03.2010, 17:53

bin mir nicht sicher, denke aber, das die zaehler irgendwie herumbugen!?!?!

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

30

03.03.2010, 18:12

bastel dir doch einfach einen richtungsvektor für die richtung.
so wie du das machst brauchst du mindestens 3 bool werte für die richtung

drückt der spieler auf die pfeiltaste-runter setzt du den vektor auf (0/1), hoch(0/-1), rechts(1/0), links(-1/0) und addierst ihn dann einfach zur letzten position des kopfes. so sparst du dir ne menge ifabfragen.

übrigens kannst du dir das "== true" sparen.
im beispiel hab ich rückwärts gezählt ;) das hatte einen grund!
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige