Snake in Konsole wächst nicht
-
Hallo
Ich habe versucht ein snake spiel in der Konsole zu programmieren. Ich bekomm es auch soweit hin, nur ich weiß nicht wie ich die Schlange wenn sie eine Frucht gegessen hat zum wachsen bringen kann!
Ich habe die Schlange und das Feld in einem Vector gespeichert!int main() { SetConsoleTitle("Snake"); vector <char> feld (800); vector <char> snake (10); int x = 0; int merke = 0; int i = 0; // position des Kopfes char c; int obst; int score = -1; int life = 3; int anzahl = 1;//anzahl wieviele teile der körper hat ... //bestimmt zufallszahl wo das obst ist und bewegt den kopf der schlange i; if (feld[i] == feld [obst]) { if (snake[anzahl] < snake.size()) { if( c == 'd')// soll eigentlich (von welcher seite man kommt) die nächsten teile der schlange ausgeben { snake[anzahl] = feld[obst] + 1; } if( c== 'w') { snake[anzahl] = feld[obst] - 40; } if( c == 'a') { snake[anzahl] = feld[obst] - 1; } if ( c== 's') { snake[anzahl]= feld[obst] + 40; } feld[anzahl] = snake[anzahl]; anzahl++; } srand(GetTickCount()); obst = rand()%800; // wählt neue zuffalszahl für Obst ++score; } ... // gibt noch spielfeld und schlange aus
-
Schaue dir mal Klassen und ggf. eine grafische Library an (z.B. SFML 2.0, gut und einfach) und komme dann wieder.

-
...
-
Und genau das meinte ich mit Klassen... :p
-
Swordfish schrieb:
class texception_t { private: std::shared_ptr< tchar_t > message; public: texception_t::texception_t( tchar_t const * const what ) : message( new tchar_t[ ( _tcsclen( what ) + 1 ) * sizeof( tchar_t ) ] ) { _tcscpy( message.get(), what ); } tchar_t const * what() { return message.get(); } };Spätestens wenn der
shared_ptrzerstört wird, ist das undefiniertes Verhalten.
Da wird zu viel Speicher angefordert.void * message_buffer = nullptr; ... tstring_t error_message( reinterpret_cast< tchar_t* >( message_buffer ) );static_castwürde reichen.
-
ich hab mir jezt klassen gelernt aber ich weiß immer noch nicht so richtig wie ich die Schlange mit Klassen zum wachsen bringe

-
So jetzt lernst du die Grundlagen eines Spiels mit SFML 2.0.
Grafisch ist das nämlich wesentlich einfacher.
-
wollt eig erstmal nur in der Konsole...
aber ich bekomms iwi trotzdem nicht hin, dass die Schlange wächst
-
lolipoplol schrieb:
wollt eig erstmal nur in der Konsole...
aber ich bekomms iwi trotzdem nicht hin, dass die Schlange wächstmuttu füttern

-
Mache erst einmal eine Klasse, die ein zweidimensionales char-Array als Map verwaltet.
Eine Funktion update() fügt an zufälliger Stelle Obst hinzu, draw() zeichnet das Array auf der Konsole.
-
ok hab ich soweit gemacht
hab aber das feld immer noch in eine vector da ich es besser finde 
-
Wunderbar!
Das ist auch die bessere Wahl.
Als nächstes machst du die Schlange.
Die hat wiederum einen vector als Speicher. Der speichert den Index für jedes Element der Schlange. Die Zeichen-Funktion setzt in der Map die Zeichen an jedem gespeicherten Index durch das Schlangenzeichen.
Die update-Funktion kümmert sich um die Benutzereingabe und bewegt die Schlange entsprechend. Anschließend kümmert sich eine Kollsionsabfrage darum, dass wenn das Feld in der Map, auf dem der Kopf nun ist, Obst war, dass hinten im Vector ein Feld hinzugefügt wird.
-
ist es besser wenn ich die funktionen draw() und update() auch in die klasse mach? Hab da im moment nämlich nur den Vektor drin ...
-
Ja klar in der Klasse, Memberfunktion.
-
jetz gibt das immer ein Fehler aus...
Hab nochmal komplett neu angefangen mit dem code um die funktionen in die klasse zu tun. Nun weiß ich aber nicht, wo der Fehler liegt
class cfeld{ public: void draw(vector<char>); // fkt die feld ausgibt void update (); //fügt obst hinzu static vector<char> feld; // private: static int merke; }; vector<char> cfeld::feld (800); int cfeld::merke = 0; void draw (vector<char> feld) { for(int x = 0; x < 800; x++)// gibt spielfeld aus (40 * in einer reihe dann endl) { feld.at(x) = '*'; cout << feld[x]; cfeld::merke++; if (cfeld::merke == 40)// gibt wenn die for schleife 40 mal durchgelaufen ist eine endl aus { cout<< endl; cfeld::merke = 0; } } } int main() { cfeld feld; feld.draw(cfeld::feld); return 0; }
-
class map { std::vector<char> data_; std::size_t width_, height_; public: map(std::size_t width, std::size_t height) : data_(width * height, '*'), width_(width), height_(height) {} void update(); void draw(std::ostream &os = std::cout); }; void map::draw(std::ostream &os) { for (std::size_t y = 0; y < height_; ++y) { for (std::size_t x = 0; x < width_; ++x) os << data_[y * width_ + x]; os << '\n'; } }?
-
das gibt bei mir nach dem linken auch den Fehler aus:
undefined reference to...
-
update
-
Danke
bin fast fertig
jetz häng ich wieder daran, die Schlange wachsen zu lassen
hab die Schlange und das Feld ja in einen Vector gespeichert aber jetz weiß ich wieder nicht, wie ich das Verknüpfen soll...class cfeld{ ... public: void draw(vector<char>, vector<int>); // fkt die feld ausgibt void update (int&); static vector<char> feld; static int obst; static vector<int> snake; }; ...jetzt weiß ich nicht, wie ich, wenn die Schlange wächst, das auf der konsole ausgeben soll und wie ich das mache, dass wenn man die Schlange steuert die hinteren Teile nicht von dem Kopf getrennt werden. hab im moment einfach nur den kopf zum starten
feld.at(cfeld::snake[0]) = 'O';
-
Danke
muss nur noch ne kollisionsabfrage machen
hab die bewegung der schlange aber ein bisschen umständlich gemacht 
if(kbhit()) // Nur wenn auch eine Taste gedrückt ist { c = getch(); switch(c) { case 'w': cfeld::snake[9] = cfeld::snake[8]; cfeld::snake[8] = cfeld::snake[7]; cfeld::snake[7] = cfeld::snake[6]; cfeld::snake[6] = cfeld::snake[5]; cfeld::snake[5] = cfeld::snake[4]; cfeld::snake[4] = cfeld::snake[3]; cfeld::snake[3] = cfeld::snake[2]; cfeld::snake[2] = cfeld::snake[1]; cfeld::snake[1] = cfeld::snake[0]; cfeld::snake[0] = cfeld::snake[0] -40 ; break; case 'a': cfeld::snake[9] = cfeld::snake[8]; cfeld::snake[8] = cfeld::snake[7]; cfeld::snake[7] = cfeld::snake[6]; cfeld::snake[6] = cfeld::snake[5]; cfeld::snake[5] = cfeld::snake[4]; cfeld::snake[4] = cfeld::snake[3]; cfeld::snake[3] = cfeld::snake[2]; cfeld::snake[2] = cfeld::snake[1]; cfeld::snake[1] = cfeld::snake[0]; cfeld::snake[0]--; break; case 's': cfeld::snake[9] = cfeld::snake[8]; cfeld::snake[8] = cfeld::snake[7]; cfeld::snake[7] = cfeld::snake[6]; cfeld::snake[6] = cfeld::snake[5]; cfeld::snake[5] = cfeld::snake[4]; cfeld::snake[4] = cfeld::snake[3]; cfeld::snake[3] = cfeld::snake[2]; cfeld::snake[2] = cfeld::snake[1]; cfeld::snake[1] = cfeld::snake[0]; cfeld::snake[0] = cfeld::snake[0] +40; break; case 'd': cfeld::snake[9] = cfeld::snake[8]; cfeld::snake[8] = cfeld::snake[7]; cfeld::snake[7] = cfeld::snake[6]; cfeld::snake[6] = cfeld::snake[5]; cfeld::snake[5] = cfeld::snake[4]; cfeld::snake[4] = cfeld::snake[3]; cfeld::snake[3] = cfeld::snake[2]; cfeld::snake[2] = cfeld::snake[1]; cfeld::snake[1] = cfeld::snake[0]; cfeld::snake[0]++; break; } } else { if( c == 'd') { cfeld::snake[9] = cfeld::snake[8]; cfeld::snake[8] = cfeld::snake[7]; cfeld::snake[7] = cfeld::snake[6]; cfeld::snake[6] = cfeld::snake[5]; cfeld::snake[5] = cfeld::snake[4]; cfeld::snake[4] = cfeld::snake[3]; cfeld::snake[3] = cfeld::snake[2]; cfeld::snake[2] = cfeld::snake[1]; cfeld::snake[1] = cfeld::snake[0]; cfeld::snake[0]++; } if( c == 'w') { cfeld::snake[9] = cfeld::snake[8]; cfeld::snake[8] = cfeld::snake[7]; cfeld::snake[7] = cfeld::snake[6]; cfeld::snake[6] = cfeld::snake[5]; cfeld::snake[5] = cfeld::snake[4]; cfeld::snake[4] = cfeld::snake[3]; cfeld::snake[3] = cfeld::snake[2]; cfeld::snake[2] = cfeld::snake[1]; cfeld::snake[1] = cfeld::snake[0]; cfeld::snake[0]=cfeld::snake[0]-40; } if( c == 'a') { cfeld::snake[9] = cfeld::snake[8]; cfeld::snake[8] = cfeld::snake[7]; cfeld::snake[7] = cfeld::snake[6]; cfeld::snake[6] = cfeld::snake[5]; cfeld::snake[5] = cfeld::snake[4]; cfeld::snake[4] = cfeld::snake[3]; cfeld::snake[3] = cfeld::snake[2]; cfeld::snake[2] = cfeld::snake[1]; cfeld::snake[1] = cfeld::snake[0]; cfeld::snake[0]--; } if ( c== 's') { cfeld::snake[9] = cfeld::snake[8]; cfeld::snake[8] = cfeld::snake[7]; cfeld::snake[7] = cfeld::snake[6]; cfeld::snake[6] = cfeld::snake[5]; cfeld::snake[5] = cfeld::snake[4]; cfeld::snake[4] = cfeld::snake[3]; cfeld::snake[3] = cfeld::snake[2]; cfeld::snake[2] = cfeld::snake[1]; cfeld::snake[1] = cfeld::snake[0]; cfeld::snake[0] = cfeld::snake[0]+40; }