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 ...


Anmelden zum Antworten