Snake die Zweite



  • Hab mich auch an Snake gewagt, es funktioniert soweit auch gut... bin jetzt soweit, dass sich der Punkt Bewegen kann und zufällig neues Fressen erscheint.
    Nach zufälliger Zeit jedoch bleibt das Essen an der Schlange hängen, Selbsttest erwünscht. Hier der so gut wie möglich ausformulierte Quelltext aus dem Borland Builder 5:

    /*
    Spiel SCHNAKE von Torsten Scholze (c)
    Verfielfältigung oder Veröffentlichung dieses Quelltextes wird strafrechtlich verfolgt. 
    Also tut mir den Gefallen und fragt nach, bevor ihr ihn anderweitig verwendet :)
    */
    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    #include <iostream.h>
    #include <conio.h>
    #include <windows.h>
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    int main()
    {
    char richtung='k';                       //k nur, um das Programm nicht starten zu müssen
    int f=1,x=5,y=5,v=40,w=6;                         //f ist Hilfsvariable für Randberührung
    double long schleife=1;                  //schleife für Geschwindigkeit der Schlange
    gotoxy(v,w);
    cprintf("*");
    gotoxy(5,5);
     while (richtung != 't')
      {
        gotoxy(v,w);
        cprintf("+");
        gotoxy(1,20);
    
    textbackground(LIGHTBLUE);
    textcolor(YELLOW);
     cprintf("________________________________________________________________________________");
      cout << endl;
        cprintf("Links - a, rechts - d, unten - s, oben - w. Fuer Pause: Beliebiger Tastendruck!");
        gotoxy(x,y);
         while (schleife < 5000000)        //schleife für Geschwindigkeit der Schlange
          {schleife++;}
           schleife = 1;
            if (kbhit())                   //für Richtungsänderung
             {
              richtung = getch();
    
             }
    
        switch (richtung)                  //Nachprüfung der Richtung
    
         {
          case 'w': y--;
                    break;
          case 'a': x--;
                    break;
          case 's': y++;
                    break;
          case 'd': x++;
                    break;
         }
    
        clrscr();
        f=x;                               //Von hier bis unten ist der Randberührungsteleport
    
        if (x == 80)
         {
          f = 2;
         }
        if (x == 1)
         {
          f = 79;
         }
    
        x=f;
        f=y;
    
        if (y == 0)
         {
          f = 19;
         }
        if (y == 20)
         {
          f = 1;
         }
    
        y=f;
    
        if (x==v)                               //Überprüfung ob das Fressen gefunden worde
         {
          if (y==w)
           {
            v=0;
            w=0;
            Beep(900,20);
            randomize();
            if (v==0)
             {v=random(78d);}
             if (w==0)
              {w=random(18);}
            while (schleife < 1000)         //schleife wartet kurz
          {schleife++;}
           schleife = 1;
            //cprintf("Gratz!");
            //getch();
           }
         }
      gotoxy(x,y);
        cprintf("*");
    
       }
             getch();
            return 0;
    }
    //---------------------------------------------------------------------------
    


  • Einige kleinere Punkte:

    1. du mußt randomize() nur einmal bei Programmbeginn aufrufen, um den Zufallsgenerator zu initialisieren - danach läuft der alleine weiter.
    2. "random(78d)" - das sieht nach einem Tippfehler aus 😉
    3. du hast v und w gerade auf Null gesetzt - da ist es (sorry) Schwachsinn, nochmal zu überprüfen, ob sie 0 sind
    4. diese "f=x;if(f...)...;x=f;" Sequenz sieht auch unnötig kompliziert aus

    Ansonsten würde ich dir erst einmal raten, das Programm etwas besser zu strukturieren, vielleicht siehst du dann ja den Fehler.
    (und eine gute Idee wäre es, mit dem Debugger durchzulaufen)



  • du mußt randomize() nur einmal bei Programmbeginn aufrufen, um den Zufallsgenerator zu initialisieren - danach läuft der alleine weiter.

    Stimmt 😞

    "random(78d)" - das sieht nach einem Tippfehler aus

    Den Schreibfehler hab ich vorhin ausversehen rein gebaut, da "d" für rechts steht und das Prog langsam gestartet wurde. Sonst gehts ^^

    du hast v und w gerade auf Null gesetzt - da ist es (sorry) Schwachsinn, nochmal zu überprüfen, ob sie 0 sind

    Die if hab ich zu while-Schleifen gemacht. Dummer Fehler *schäm*
    (hab ich gemacht, damit nie ein Punkt auf die 0-Stelle kommt, was ja unerreichbar wäre 😉 )

    Hab also noch viel Arbeit vor mir... Danke für die Antworten 🙂



  • statt der "while(v==0) v=random(78);" solltest du lieber den Zufallswert um 1 erhöhen - das geht schneller:

    v = random(79)+1;//Zufällig im Bereich 1..78
    

    (übrigens solltest du die Richtungsbehandlung anders lösen - wenn der Spieler etwas anderes als asdf drückt, bleibt die Schlange stehen)



  • Hab extra drunter geschrieben "Für Pause: Beliebiger Tastendruck!"... asdw hab ich auch nur genommen, weil ich keine Ahnung hab wie ich auf die Pfeiltasten zugreifen kann.



  • die pfeiltasten:

    if (kbhit()) // für Richtungsänderung mit Pfeiltasten
    {
    richtung = getch(); // Richtung muss mit getch() abgefragt 0 sein!
    }

    if (richtung== 0) switch (getch()) // nun zur eigendlichen Richtungswahl
    {
    case 72:y--; // hoch
    break;
    case 75:x--; // links
    break;
    case 77:x++; // rechts
    break;
    case 80:y++; // runter
    break;
    }


Anmelden zum Antworten