SNAKE - C++ Konsolenanwendung
-
Hey Leute,
ich habe ein kleines Snake-Spiel programmiert und bis jetzt hat alles super geklappt.
Nur leider weiß ich nicht wie ich nun den Code schreiben/einfügen soll, sodass die Schlange +1 Körperteil bekommt wenn sie ein Apfel isst... Mir fällt die Lösung nicht an.
Kann mir bitte jemand da einen kleinen Tipp geben?
Hier ist der Code:#include <iostream> #include <Windows.h> #include <conio.h> #include <stdio.h> #include <ctime> using namespace std; void gotoxy(int x, int y) { COORD c; c.X = x; c.Y = y; SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c); } int main () { srand(time(0)); enum Map_Objects { Nothing, Head, Apple }; const int x_Map = 40; const int y_Map = 20; Map_Objects Map[x_Map][y_Map]; int while_Main = 0; int Score = 0; int Applegen = 0; int x_Applegen = 0; int y_Applegen = 0; int while_Applegen = 0; int Highscore = 0; int Key = 0; int Key_2 = 0; int x_Head = 0; int y_Head = 0; int Speed; int Exit = 0; while (true) { system("CLS"); for (int y = 0; y < y_Map; y++) { for (int x = 0; x < x_Map; x++) { Map[x][y] = Nothing; } } Map[0][0] = Head; while (while_Main != 1) { cout << " oOo S N A K E oOo\n"; cout << " - Made By: Moorky D. Marvin (MMB) -\n"; cout << " Highscore: " << Highscore << endl; cout << "\n\n ---Difficulty---\n"; cout << " [1] Easy\n"; cout << " [2] Normal\n"; cout << " [3] Hard\n"; cout << " [4] Extreme\n"; cout << " [ESC] Exit\n\n"; Key = getch(); if (Key == 49) { Speed = 30; while_Main = 1; } else if (Key == 50) { Speed = 20; while_Main = 1; } else if (Key == 51) { Speed = 10; while_Main = 1; } else if (Key == 52) { Speed = 0; while_Main = 1; } else if (Key == 27) return 0; gotoxy (0, 0); } system("CLS"); Key = 0; Key_2 = 0; Exit = 0; x_Head = 2; y_Head = 2; Score = 0; Applegen = -1; x_Applegen = 0; y_Applegen = 0; while_Main = 0; while (Exit != 1) { if (Applegen < Score) { while (while_Applegen != 1) { x_Applegen = rand() % 39; y_Applegen = rand() % 19; if (Map[x_Applegen][y_Applegen] == Nothing) { Map[x_Applegen][y_Applegen] = Apple; while_Applegen = 1; } } while_Applegen = 0; Applegen++; } cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"; for (int y = 0; y < y_Map; y++) { cout << "X"; for (int x = 0; x < x_Map; x++) { if (Map[x][y] == Head) cout << "O"; else if (Map[x][y] == Apple) cout << "a"; else cout << " "; } cout << "X"; cout << endl; } cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"; cout << " Score: " << Score; cout << " ESC = Exit "; for (int y = 0; y < y_Map; y++) { for (int x = 0; x < x_Map; x++) { if (Map[x][y] == Head) Map[x][y] = Nothing; } } Sleep(Speed); Key_2 = Key; if (kbhit()) Key = getch(); if (Key == 119 && Key_2 != 115) // Key-Input: w { if (Map[x_Head][y_Head-1] == Apple) Score++; y_Head--; if (y_Head < 0) Exit = 1; } else if (Key == 97 && Key_2 != 100) // Key-Input: a { if (Map[x_Head-1][y_Head] == Apple) Score++; x_Head--; if (x_Head < 0) Exit = 1; } else if (Key == 115 && Key_2 != 119) // Key-Input: s { if (Map[x_Head][y_Head+1] == Apple) Score++; y_Head++; if (y_Head > y_Map-1) Exit = 1; } else if (Key == 100 && Key_2 != 97) // Key-Input: d { if (Map[x_Head+1][y_Head] == Apple) Score++; x_Head++; if (x_Head > x_Map-1) Exit = 1; } else if (Key == 27) // Key-Input: ESC Exit = 1; else Key = Key_2; Map[x_Head][y_Head] = Head; gotoxy(0, 0); } if (Score > Highscore) Highscore = Score; } }
MfG, Marvin.
-
Du baust einen Vector von denn Positionen deiner Schlange.
struct Vector2Int { explicit Vector2Int( int x, int y ) : x(x), y(y) { } int x, y; }; std::vector< Vector2Int > snakePositions;
Du überprüfst in welche Richtung deine Schlange gehen will und schickst denn Kopf der Schlange um ein Feld in diese Richtung. Der Rest der Schlange bekommt die Position der Position vorher.
Vector2Int lastPos = snakePositions.at(0); if( snake.nextMove == snakeMove::forward ) { snakePositions.at(0).y -= 1; } for( std::size_t i = 1; i < snakePositions.size(); ++i ) { Vector2Int pos = snakePositions.at(i); snakePositions.at(i) = lastPos; lastPos = pos; }
Es gibt sicher bessere Methoden, der Code soll nur eine Verständnisshilfe sein.
-
Moorky Dragonstrike schrieb:
Hey Leute,
ich habe ein kleines Snake-Spiel programmiert und bis jetzt hat alles super geklappt.
Nur leider weiß ich nicht wie ich nun den Code schreiben/einfügen soll, sodass die Schlange +1 Körperteil bekommt wenn sie ein Apfel isst... Mir fällt die Lösung nicht an.Wenn Du das normale Vorrücken hast, ist der Rest doch einfach: Beim normalen Vorrücken rückt der Kopf einen vor, das letzte Stück vom Schwanz verschwindet.
Wenn die Schlange nun um eins länger werden soll, rückt einfach der Kopf vor, und das letzte Stück Schwanz bleibt erhalten.
-
@theconflict
Gibt es da nicht eine Lösung die Quellcode aus meinem Programm beinhaltet? Ich kenne mich nämlich noch nicht mit Vektoren aus^^...@Belli
Dieses Schema habe ich mir auch gedacht, nur leider weiß ich nicht wie ich das in guten C++ Code umwandeln kann..^^ Ich habe schon daran gedacht eine dritte Dimension mit Arrays zu erstellen (diese Dimension beinhaltet jeweils 1 Körperteil) aber wenn ich das in die Tat umsetzen möchte, müsste ich gleich das ganze Spiel neu schreiben.^^
-
Moorky Dragonstrike schrieb:
@Belli
Dieses Schema habe ich mir auch gedacht, nur leider weiß ich nicht wie ich das in guten C++ Code umwandeln kann.Versteh ich nicht. Bewegt Deine Schlange sich denn jetzt nicht vorwärts?
-
Belli schrieb:
Moorky Dragonstrike schrieb:
@Belli
Dieses Schema habe ich mir auch gedacht, nur leider weiß ich nicht wie ich das in guten C++ Code umwandeln kann.Versteh ich nicht. Bewegt Deine Schlange sich denn jetzt nicht vorwärts?
Doch, ich weiß dennoch nicht wie der Quellcode dafür aussehen soll...
-
Moorky Dragonstrike schrieb:
Doch, ich weiß dennoch nicht wie der Quellcode dafür aussehen soll...
Ich habe dir doch ein Beispiel geschrieben, du hast ihn dir aber nicht angesehen weil du eine Komplettlösung haben möchtest. Ist es nicht dein Ziel mit diesem Snake-Projekt etwas zu lernen?
Wenn du denn Code nicht verstehst dann stelle Frage dazu, oder noch besser, google es oder lies es in einem Buch nach.
-
Moorky Dragonstrike schrieb:
Belli schrieb:
Moorky Dragonstrike schrieb:
@Belli
Dieses Schema habe ich mir auch gedacht, nur leider weiß ich nicht wie ich das in guten C++ Code umwandeln kann.Versteh ich nicht. Bewegt Deine Schlange sich denn jetzt nicht vorwärts?
Doch
Ich verstehe immer noch nicht. Du hast den Quellcode doch geschrieben?
Moorky Dragonstrike schrieb:
Hey Leute,
ich habe ein kleines Snake-Spiel programmiertNun suchst Du Dir die Stelle, wo die Schlange sich vorwärts bewegt. Dort musst Du doch den Kopf eins weiter setzen und das letzte Schwanzstück löschen.
Wenn Du nun willst, dass die Schlange länger wird, machst Du alles wie bisher, lässt nur das Löschen des letzten Schwanzstücks weg.
-
@Belli
Nein, der Quellcode aus dem Programm funktioniert ein bisschen anders.
Dieser löscht nicht den letzten Teil vom Schwanz, sondern er löscht ALLES was auf der 2D Map ist und behält nur die Koordinaten von dem Kopf.
-
Das ist ja nicht so ein großer Unterschied. Jetzt musst Du beim Vorwärtsbewegen dem Kopf neue Koordinaten geben.
Wenn die Schlange länger werden soll, musst Du die Position des Kopfes als Stück des Körpers behalten und die neue Position des Kopfes davor 'hängen'. Je länger Deine Schlange wird, desto mehr Positionen 'sammelst' Du dabei.
Wenn Du dann irgendwann ans Zeichnen kommst, zeichnest Du alle gesammelten Positionen, statt wie bisher nur den Kopf.
Zum Sammeln benötigst Du natürlich einen geeigneten Container, zum Beispiel einen Vector, wie theconflict vorgeschlagen hat. Da Du aber ständig am Anfang und am Ende die Positionen hinzufügen oder löschen musst, eignet sich vermutlich eine deque besser dafür.
Wie auch immer, Du kommst nicht darum herum, Dir irgendwie die Positionen aller von der Schlange zu belegenden Felder zu merken, sonst kannst Du sie ja nicht auf Deine gelöschte Map zeichnen.