# simple snake-game for dos, using c++



## jackbaker (11. August 2003)

Hier gibt es zwar schon ein paar Threads zum Thema Snake-Coding, hat mir aber nicht weitergeholfen.... 

Vorweg:
Den ganzen Code kann ich momentan hier nicht posten - der ist auf nem
anderen PC...
Das "Gerüst" ist schonmal fertig,d.h., die Schlange bewegt sich schön,
kann was fressen usw....
Variablen sind auch schon alle da, array für das Spielfeld usw. ...

Das Problem ist nur, sie wird noch nicht größer, wenn sie was gefressen hat, sie besteht bis jetzt nur aus einem Kopf, ohne Schwanz.. 
Man kann also diesen Kopf in alle Richtungen bewegen, schönes
ASCII-Symbol.. 

Ich weiss allerdings nicht, wie ich jetzt weiter fortfahren kann,d.h.,
wie ich die Snake-Bewegung implementieren kann!
Gedacht hab ich an folgendes:
Das Array field[22][80] = {0} wird hiermit mit Nullen gefüllt, dann
wird immer die aktuelle Position des Kopfes ins Array abgespeichert:
field[x][y] = 1, und an allen Stellen, die > 0 sind das entsprechende
Symbol für den Schwanz gezeichnet - aber damit wär es ja noch lange nicht gelöst!!

Also, habt ihr irgendwelche Tips für mich??
Wäre nett von euch!!

Es soll ein reines, simples Snake-Game für Dos werden,
Sprache ist C++, genutzt werden Ansi-Escape-Frequenzen...


----------



## Sinac (11. August 2003)

> Das Problem ist nur, sie wird noch nicht größer, wenn sie was gefressen hat, sie besteht bis jetzt nur aus einem Kopf, ohne Schwanz..



Ist doch supa, jetzt haste zumindest schonma nen Pacman  

Ne mal im Ernst, poste mal was von dem Code oder häng ihn an, dann fällt es uns bestimmt leichter dir zu helfen!

Greetz und wilkommen auf dem Board!
SinaC


----------



## jackbaker (13. August 2003)

> _Original geschrieben von Sinac _
> *Ist doch supa, jetzt haste zumindest schonma nen Pacman
> *



 

Sehr witzig....
Na, dann poste ich mal...


----------



## jackbaker (13. August 2003)

```
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <time.h>

#define cls printf("\033[2J")
#define nl printf("\n");
#define setmode(x) printf("\033[=%dh", (x))
#define resetmode(x) printf("\033[=%d1", (x))
#define setattr(a,v,b) printf("\033[%d;%d;%dm", (a), (v), (b))
#define delattr printf("\033[m")
#define movecursor(x,y) printf("\033[%d;%dH", x,y);

void intro(int high, int wide, int wait)    
{
 int i,k;
 const int gr = 178;

 for (i = 0; i < wide; i++)
 {
    delay(wait);
    printf ("%c", gr);
 }

 for (i=0; i < high; i++)
 {
    delay(wait);
    printf ("%c", gr);
    for (k=0; k < wide-2; k++)
    printf(" ");
    printf ("%c", gr);
 }

 for (i = 0; i < wide; i++)
 {
    delay(wait);
    printf ("%c", gr);
 }
}

void clear_field(int high, int wide)        
{
  int i,k,z=2;

  movecursor(z,2);

  for (i = 0; i < high-1; i++)
 {
     for (k = 0; k < wide-2; k++)
     printf (" ");
     z++;
     movecursor(z,2);
 }

}

void outro(int t)
{
 delay(t);
 cls;
 delattr;
 resetmode(18);
 _setcursortype(_NORMALCURSOR);
 exit(0);
}

void colormode()
{
 int rn_c = 31 + (rand() % (35+1-1));
 setattr(1,rn_c,40);
}

void snake(int wait)
{
  int i,input,x = 11,y = 40,score = 0,rn_x = 5,rn_y = 5,tail = 1;
  int field [22][80] = {0},fx,fy;
  bool up = false, down = false, left = false, right = false;
  const int gr1 = 1, gr2 = 48, sc = 248;

  enum key {UP = 72, DOWN = 80, LEFT = 75,
            RIGHT = 77, ENTER = 13};

  movecursor(rn_x,rn_y);
  printf ("%c", sc);
  movecursor(x,y);

  printf ("%c", gr1);
  movecursor(25,9);
  printf ("%d", score);
  movecursor(25,77);
  printf ("%d", tail);
  movecursor(x,y);

  do
   {
                 
     input = getch();                            // Zeichen einlesen

     if (input == 0)                   // Pfeil oder Funktionstaste
      {
        input = getch();             // Scancode des Zeichens holen

        switch(input)
        {

        Up:
        case UP:

         while(! kbhit()) 
        {
          up = true; down = false; left = false; right = false;

          delay(wait);
          x--;
          printf(" ");
          movecursor(x,y);
          printf ("%c", gr1);
          movecursor(x,y);

          if (x < 2)
            outro(2000);

            if ((x == rn_y) && (y == rn_x))
           {
            colormode();
            score += 12;
            tail  += 1;
            movecursor(25,9);
            printf ("%d", score);
            movecursor(25,77);
            printf ("%d", tail);
            srand((unsigned) time(NULL));
            rn_x = 2 + (rand() % (78+1-1));
            rn_y = 2 + (rand() % (20+1-1));
            movecursor(rn_y,rn_x);
            printf ("%c", sc);
            movecursor(x,y);            //back to smiley!!
           }
        }

        input = kbhit();
        break;                // (!)

        Down:
        case DOWN:

        while(! kbhit())
        {
        up = false; down = true; left = false; right = false;

        x++;
        delay(wait);
        printf(" ");
        movecursor(x,y);     // new position
        printf ("%c", gr1);
        movecursor(x,y);     // back to smiley!

        if (x > 23)
           outro(2000);

        if ((x == rn_y) && (y == rn_x))
           {
            colormode();
            score += 12;
            tail  += 1;
            movecursor(25,9);
            printf ("%d", score);
            movecursor(25,77);
            printf ("%d", tail);
            srand((unsigned) time(NULL));
            rn_x = 2 + (rand() % (78+1-1));
            rn_y = 2 + (rand() % (20+1-1));
            movecursor(rn_y,rn_x);
            printf ("%c", sc);
            movecursor(x,y);
           }


      }

        input = kbhit();
        break;

        Left:
        case LEFT:

        while(! kbhit())
        {
        up = false; down = false; left = true; right = false;

        y--;
        delay(wait);
        printf(" ");
        movecursor(x,y);     // new position
        printf ("%c", gr1);
        movecursor(x,y);     // back to smiley!

        if (y < 2)
           outro(2000);

           if ((x == rn_y) && (y == rn_x))
           {
            colormode();
            score += 12;
            tail  += 1;
            movecursor(25,9);
            printf ("%d", score);
            movecursor(25,77);
            printf ("%d", tail);
            srand((unsigned) time(NULL));
            rn_x = 2 + (rand() % (78-1+1));
            rn_y = 2 + (rand() % (20-1+1));
            movecursor(rn_y,rn_x);
            printf ("%c", sc);
            movecursor(x,y);
           }


      }

        input = kbhit();
        break;

        Right:
        case RIGHT:

        while(! kbhit())
        {
        up = false; down = false; left = false; right = true;

        y++;
        delay(wait);
        printf(" ");
        movecursor(x,y);     // new position
        printf ("%c", gr1);
        movecursor(x,y);     // back to smiley!

        if (y > 79)
           outro(2000);

        if ((x == rn_y) && (y == rn_x))
           {
            colormode();
            score += 12;
            tail  += 1;
            movecursor(25,9);
            printf ("%d", score);
            movecursor(25,77);
            printf ("%d", tail);
            srand((unsigned) time(NULL));
            rn_x = 2 + (rand() % (78-1+1));
            rn_y = 2 + (rand() % (20-1+1));
            movecursor(rn_y,rn_x);
            printf ("%c", sc);
            movecursor(x,y);
           }
      }

        input = kbhit();
        break;
    }


    }  else if (up) goto Up;
            else if (down) goto Down;
                 else if (left) goto Left;
                      else if (right) goto Right;


} while (input != ENTER);
  outro(2000);

}

void main()
{
 _setcursortype(_NOCURSOR);
 movecursor(0,0);
 //setmode(18);    //optional
 setattr(1,36,40);    //optional
 intro(22,80,50);
 movecursor(11,35);
 delay(500);setattr(1,35,40);printf("S");delay(500);setattr(1,34,40);printf("N");delay(500);setattr(1,33,40);printf("A");
 delay(500);setattr(1,32,40);printf("K");delay(500);setattr(1,31,40);printf("E  ");
 delay(500);setattr(1,31,40);printf("2");delay(500);setattr(1,32,40);printf("0");
 delay(500);setattr(1,33,40);printf("0");delay(500);setattr(1,34,40);printf("3");delay(500);setattr(1,35,40);
 movecursor(14,27);
 printf("<press any key to continue>");
 getch();
 clear_field(22,80);
 movecursor(25,2);
 printf("SCORE: ");
 movecursor(25,70);
 printf("TAILS: ");
 movecursor(11,40);
 snake(100);
}
```

So, hoffentlich ist der Code einigermaßen in Ordnung...


----------



## jackbaker (16. August 2003)




----------



## Kachelator (23. August 2003)

> Also, habt ihr irgendwelche Tips für mich


 1. Zunächst könntest Du anstatt der Arrays Container aus der STL verwenden (z.B. std::vector). Schliesslich arbeitest Du ja mit C++. Außerdem ist das eine gute Vorbereitung für 2. 





> Das Problem ist nur, sie wird noch nicht größer, wenn sie was gefressen hat, sie besteht bis jetzt nur aus einem Kopf, ohne Schwanz


 2. Merk dir einfach für eine Schlange der Länge X die X vorhergehenden Kopfpositionen (z.B. 9 Stück für eine Schlange der Länge 10) und mal dort Schwanzteile hin, wenn das Spielfeld angezeigt wird. So hab ich das jedenfalls damals auf meinem VC20 gemacht 
Die Positionen könntest Du z.B. in eine Liste (std::list) packen.

HTH


----------



## ShabbY (25. August 2003)

ich hab snake schon geproggt, halt nicht in c++ sondern nur in C. 
kann dir denquellcode ja mal schiken, wenn du willst.

grob gesagt musst du 2 neue arrays anlegen in denen du die positionswerte der schlage speicherst (x und y). mit denen musst du dann arbeiten


----------



## Hatachy (25. August 2003)

Sorry, wenn das hier etwas unpassend ist, aber ich bin ganz neu in C++ (bis auf die theoretischen grundlagen, die kenn ich alle )
aber mal zu meiner dummen frage: wieso kennt mein Compiler (Dev-C++) delay nicht bei diesem script ?
anscheinend  es ja bei anderen, wieso bei mir net  



> Führt  g++.exe... aus
> g++.exe "C:\Dokumente und Einstellungen\Hatachy\Eigene Dateien\C++\meinekleinentests\snake.cpp" -o "C:\Dokumente und Einstellungen\Hatachy\Eigene Dateien\C++\meinekleinentests\snake.exe"    -I"E:\Dev-Cpp\include\c++"  -I"E:\Dev-Cpp\include\c++\mingw32"  -I"E:\Dev-Cpp\include\c++\backward"  -I"E:\Dev-Cpp\include"   -L"E:\Dev-Cpp\lib"
> C:/Dokumente und Einstellungen/Hatachy/Eigene Dateien/C++/snake.cpp: In
> function `void intro(int, int, int)':
> ...



irgendwie steig ich da net durch. im script find ich keine fehler die den fehler erklären soweit ich das kann. und ne suche, in welcher datei die delay funktion enthalten ist, find ich irgendwie net (mag sein, dass ich zu blöd bin). will ja keinen code klauen, aber verstehen und auch funktionstüchtig haben, würd ich ihn doch schon gerne


----------



## ShabbY (25. August 2003)

delay is nur ne warte funktion die warscheinlich bei deinem compiler nicht dabei ist.  is auch nicht wichtig, früher hab ich mit turbo C2 geproggt  da konnt ich auch noch ne delay funktion benutzen, seit dem ich mit borland compile nehm ich halt die Sleep in der Windows.h


----------



## jackbaker (27. August 2003)

So, Leute Danke erstmal für eure Hilfe 

@Hatachy

Anstelle von windows.h einzubauen kannst du auch einfach eine
Verzögerungsschleife benutzen:

for (i = 0; i < 4000000; i++);

Und lass den _NORMALCURSOR etc. weg, dann dürfte es auch bei dir klappen!
Wenn du auf den blinkenden Cursor verzichten willst, dann lass einfach
die Kommentarstriche vor setmode(18) weg... 

@Shabby

Kannst du gerne machen... 
Bin für jede Hilfe dankbar..


----------



## Kachelator (27. August 2003)

> for (i = 0; i < 4000000; i++);


Solch gewalttätige Verzögerungstaktiken sind in einer Multitasking-Umgebung nicht sehr empfehlenswert. Schliesslich legst Du damit das ganze System lahm und nervst den User. Nimm lieber Sleep() oder noch besser: Mach was mit GetTickCount().

PS: Die for-Schleife wie oben hat auch noch den Nachteil, dass sie auf unterschiedlich schnellen Rechner auch noch unterschiedlich schnell läuft.


----------

