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

doubleD84

Frischling

  • »doubleD84« ist der Autor dieses Themas

Beiträge: 3

Wohnort: Freiburg

  • Private Nachricht senden

1

21.10.2012, 23:29

C++/SFML 2.0 - Snake bewegt sich nicht wie ich will

Hallo,

ich möchte ein kleines Snake Game programmieren und bin totaler Frischling.
Jetzt hab ich ein Problem mit der Bewegungssteuerung.

Taste soll nur kurz gedrückt werden für einen Richtungswechsel.

Nach oben und nach links funtionieren.
Nach unten und nach rechts nicht. Da verschwindet immer die Snake, was in Wahrheit ein grünes Quadrat ist.

Wieso funtioniert "feldStatus[xC-1][yC] = 1;" und "feldStatus[xC+1][yC] = 1;" nicht?

Hoffe jemand kann mir helfen, ich werde sonnst echt verrückt! :pillepalle: Danke.

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
void CSpielfeld::moveSnake()
{
    if(sf::Keyboard::isKeyPressed(sf::Keyboard::F1))
    {
        drawConsole();
    }

    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    {
        direction = 1;
    }

    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
    {
        direction = 2;
    }

    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
    {
        direction = 3;
    }

    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
    {
        direction = 4;
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
    {
        direction = 0;
    }


    if (Uhr.getElapsedTime().asMilliseconds() >=250)
    {
        // rechts
        if (direction == 1)
        {
            for (int yC = 0; yC<hoehe; yC++)
            {
                for (int xC = 0; xC<breite; xC++)
                {
                    if (feldStatus[xC][yC] == 1)
                    {
                        feldStatus[xC+1][yC] = 1;
                        feldStatus[xC][yC] = 0;

                    }

                }

            }

        }

        // links
        if (direction == 2)
        {
            for (int yC = 0; yC<hoehe; yC++)
            {
                for (int xC = 0; xC<breite; xC++)
                {
                    if (feldStatus[xC][yC] == 1)
                    {
                        feldStatus[xC-1][yC] = 1;
                        feldStatus[xC][yC]   = 0;
                    }

                }

            }

        }


        // hoch
        if (direction == 3)
        {
            for (int yC = 0; yC<hoehe; yC++)
            {
                for (int xC = 0; xC<breite; xC++)
                {
                    if (feldStatus[xC][yC] == 1)
                    {
                        feldStatus[xC][yC-1] = 1;
                        feldStatus[xC][yC]   = 0;
                    }

                }

            }

        }

        // runter
        if (direction == 4)
        {
            for (int yC = 0; yC<hoehe; yC++)
            {
                for (int xC = 0; xC<breite; xC++)
                {
                    if (feldStatus[xC][yC] == 1)
                    {
                        feldStatus[xC][yC+1] = 1;
                        feldStatus[xC][yC]   = 0;
                    }

                }

            }

        }
    Uhr.restart();
    }

}

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

21.10.2012, 23:54

Überleg mal was passiert, wenn du eine 1 weiter hinten in dein 2D Array schreibst und deine Schleife dann weiter läuft.

doubleD84

Frischling

  • »doubleD84« ist der Autor dieses Themas

Beiträge: 3

Wohnort: Freiburg

  • Private Nachricht senden

3

22.10.2012, 12:21

Danke für den Denkanstoss. Habe nun einige breaks hinzugefügt, damit funktioniert es. Ausserdem verschwende ich jetzt nicht mehr soviel unnötige Rechenleistung, was aber wohl vollkommen wurscht bei meinem Programm ist.

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
void CSpielfeld::moveSnake()
{
    if(sf::Keyboard::isKeyPressed(sf::Keyboard::F1))
    {
        drawConsole();
    }

    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    {
        direction = 1;
    }

    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
    {
        direction = 2;
    }

    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
    {
        direction = 3;
    }

    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
    {
        direction = 4;
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
    {
        direction = 0;
    }


    bool bremse = false;

    if (Uhr.getElapsedTime().asMilliseconds() >=250)
    {
        // rechts
        if (direction == 1)
        {
            for (int yC = 0; yC<hoehe; yC++)
            {
                for (int xC = 0; xC<breite; xC++)
                {
                    if (feldStatus[xC][yC] == 1)
                    {
                        feldStatus[xC+1][yC] = 1;
                        feldStatus[xC][yC] = 0;
                        bremse=true;
                        break;
                    }

                }
            if (bremse)
                {
                    bremse=false;
                    break;
                }
            }

        }

        // links
        if (direction == 2)
        {
            for (int yC = 0; yC<hoehe; yC++)
            {
                for (int xC = 0; xC<breite; xC++)
                {
                    if (feldStatus[xC][yC] == 1)
                    {
                        feldStatus[xC-1][yC] = 1;
                        feldStatus[xC][yC]   = 0;
                        bremse=true;
                        break;
                    }

                }
                if (bremse)
                {
                    bremse=false;
                    break;
                }
            }

        }


        // hoch
        if (direction == 3)
        {
            for (int yC = 0; yC<hoehe; yC++)
            {
                for (int xC = 0; xC<breite; xC++)
                {
                    if (feldStatus[xC][yC] == 1)
                    {
                        feldStatus[xC][yC-1] = 1;
                        feldStatus[xC][yC]   = 0;
                        bremse=true;
                        break;
                    }

                }
                if (bremse)
                {
                    bremse=false;
                    break;
                }
            }

        }

        // runter
        if (direction == 4)
        {
            for (int yC = 0; yC<hoehe; yC++)
            {
                for (int xC = 0; xC<breite; xC++)
                {
                    if (feldStatus[xC][yC] == 1)
                    {
                        feldStatus[xC][yC+1] = 1;
                        feldStatus[xC][yC]   = 0;
                        bremse = true;
                        break;
                    }

                }

                if (bremse)
                {
                    bremse=false;
                    break;
                }
            }

        }
    Uhr.restart();
    }

}

void CSpielfeld::drawConsole()
{
    for (int yC = 0; yC<hoehe; yC++)
            {
                for (int xC = 0; xC<breite; xC++)
                {
                    if (feldStatus[xC][yC] == 0)
                    cout << " ";

                    if (feldStatus[xC][yC] == 1)
                    cout << "X";

                    if (feldStatus[xC][yC] == 3)
                    cout << "O";
                }
            cout << endl;
            }
}

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

22.10.2012, 13:33

Du verfolgst einen völlig falschen Ansatz. Du willst immer die ganze Schlange in die aktuelle Richtung bewegen. Bei Snake muss sich aber jedes Teil in Richtung des nächsten Teils bewegen. Nur die Bewegung des ersten Teils wird vom Spieler bestimmt. Die einfachste Methode das umzusetzen ist eine Liste, die alle Körperteile enthält. Bewegt sich die Schlange, löschst du das letzte Stück und fügst vorn ein neues an. Frisst die Schlange löschst du das letzte Stück einfach nicht.

Ausserdem würde ich dir empfehlen Vektoren (damit meine ich nicht std::vector) zu verwenden.

Vielleicht wäre es aber keine Schlechte Idee, erstmal was leichteres zu versuchen. Pong oder ein einfacher Moorhuhnklon mit Zeilscheiben.
"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?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

22.10.2012, 14:18

Die Schlange besteht doch bis jetzt nur aus einem einzigen Segment. Und das wird vorne neu gesetzt und hinten gelöscht. Das Prinzip ist nicht sonderlich gut, aber als Anfänger muss man da halt ein bisschen lernen. Wollte auch erst vorschlagen etwas einfacheres zu machen. Habs mir dann verkniffen. Das denke ich zur Zeit aber bei den meisten Threads hier im Forum;)
„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.“

MGBeginner

Frischling

Beiträge: 81

Wohnort: Limburg

  • Private Nachricht senden

6

19.11.2012, 20:30

Die letzte Antwort ist zwar schon fast 1 Monat her, aber
einen "Denkanstoss" zu deinem Code muss ich noch loswerden.
Die 2 for-Schleifen sind völlig unnötig. Speicher doch die aktuelle
XY-Position des Snake-Kopfes einfach in separaten Variablen ab,
dann musst du nicht jedes mal das komplette Spielfeld danach
durchsuchen !! Da machst du dir das Leben gleich viel einfacher
und brauchst auch keine seltsamen break; bremse=true; und nochmal
break; Konstruktionen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

7

19.11.2012, 20:35

Wir haben ihm doch schon mitgeteilt, dass er einen falschen Ansatz verfolgt...
"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