Snake
-
Hey, ich bin's wieder. Nachdem mein erster Versuch, Snake zu programmieren, irgendwie nach hinten losgegangen war (http://www.c-plusplus.net/forum/279327), hab ich es noch einmal versucht und es dann irgendwie doch hingekriegt, ohne irgendwo nachzugucken, wie es geht. Das Ergebnis könnt ihr hier downloaden:
http://www.file-upload.net/download-8841953/Snake.zip.html
Ich hab das vor einer ganzen Weile programmiert und jetzt wiedergefunden. Es wäre nett, wenn sich jemand den Code ansehen könnte, besonders die Funktion new_object. Ich bin mir nicht sicher, ob ich einfach zwei Funktionen daraus machen sollte (new_wall und new_x) oder diese Angabe irgendwie als Parameter übergeben könnte. Oder wie ich diese unschöne Übergabe von "object" als Referenz umändern könnte. Aber auch alle anderen Fehler und Verschönerungs- und Verkürzungsvorschläge sind willkommen.
Danke schonmal
-
Bei mir gibt das gleich am Anfang eine "vector subscript out of range" Exception wenn man z.B. auf w drückt ...
if((snake[0].Ypos == snake[1].Ypos) && (snake[0].Xpos == snake[1].Xpos))
Size ist am Anfang 1.
Wozu ist die Zeile überhaupt da ?
Während des Spiels tritt noch eine weitere exception auf, deren Ursache noch gefunden werden muesste.
Es wäre auch nett die Cursortasten zu unterstützen:
unsigned mykey; while(!game_over) { if(kbhit()) { mykey = getch(); if(mykey == 0xe0) { unsigned tmp = getch(); mykey = (mykey << 8) | (tmp & 0xff); } ...
-
Danke für das Feedback!
Komisch, dass das bei mir nicht abgestürzt ist. Naja, den out of range Fehler hab ich eben behoben, ich hatte da nur einen Denkfehler gehabt. Hab die verbesserte Version schon hochgeladen. Fängt ja schonmal gut an.
merano schrieb:
Während des Spiels tritt noch eine weitere exception auf, deren Ursache noch gefunden werden muesste.
Es wäre auch nett die Cursortasten zu unterstützen:
unsigned mykey; while(!game_over) { if(kbhit()) { mykey = getch(); if(mykey == 0xe0) { unsigned tmp = getch(); mykey = (mykey << 8) | (tmp & 0xff); } ...
Eine andere Exception fällt mir sonst nicht auf. Bei mir läuft alles prima. Und was die Cursortasten angeht, bin ich mir nicht sicher, wie ich das angehen soll. Ich würde erstmal so herausfinden, welchen ASCII-Code die Pfeiltasten bei mir haben:
#include <conio.h> #include <iostream> int main() { while(true) std::cout << (int)(getch()) << '\n'; }
Aber wenn ich zb. Pfeil oben eintippe bekomme ich zwei Zahlen: 224 72. Weiter weiß ich schon nicht mehr.
Und deine Variante versteh ich nicht. Fängst du mit diesem 0xe0 die 224 ab? Und was soll diese Zeile mit mykey = (mykey << | (tmp & 0xff); bedeuten?
-
Die andere Debug-Exception wird in isctype.c (Zeile 56) ausgelöst.
Expression: (unsigned)(c+1)<=256
Wobei c den Wert 0xffffffe0 hat!!!
(Passiert wenn man z.B. Cursortasten drückt ...)
Das Problem entsteht in folgendem Quelltext-Block
if(isalnum(c)) { name.push_back(c); con::print(9, 62, "\t\t\t", con::RED); } else { ...
Laut Doku erwartet die Funktion isalnum() einen int, verwendet wird aber
char c = getche();
Laut Doku gibt getche() einen int zurück und ist zudem deprecated.
Compiler Hinweise:
'kbhit': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _kbhit.
'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch.Statt char also int verwenden, einen Unterstrich davor und es funktioniert wie es soll.
Um die Diskussion mit den erweiterten Scancodes abzukürzen,
hier die anderen zu ändernden Stellen:enum Key { ESCAPE = 27, SPACE = 32, ENTF = 83, ENTER = 13, BACK = 8, TAB = 9, CURS_UP = 0xe048, // Four arrow keys: CURS_LEFT = 0xe04b, CURS_RIGHT = 0xe04d, CURS_DOWN = 0xe050 };
Direction detect_direction(unsigned c) { switch(c) { case 'w': case con::Key::CURS_UP: // 0xe048 return up; break; case 's': case con::Key::CURS_DOWN: // 0xe050 return down; break; case 'a': case con::Key::CURS_LEFT: // 0xe04b return left; break; case 'd': case con::Key::CURS_RIGHT: // 0xe04d return right; break; } return no_direction; }
Ob das Verpacken der Scancodes (Konstanten) in einen Namespace den Code
lesbarer macht darf bezeifelt werden. Da es aber schon so war ...