simple snake-game for dos, using c++

jackbaker

Grünschnabel
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..:p

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


;)
 
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
 
Code:
#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...

:-)
 
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
 
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
 
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 :rolleyes:

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)':
C:/Dokumente und Einstellungen/Hatachy/Eigene Dateien/C++/snake.cpp:22: `
delay' undeclared (first use this function)
C:/Dokumente und Einstellungen/Hatachy/Eigene Dateien/C++/snake.cpp:22: (Each
undeclared identifier is reported only once for each function it appears
in.)

C:/Dokumente und Einstellungen/Hatachy/Eigene Dateien/C++/snake.cpp: In
function `void outro(int)':
C:/Dokumente und Einstellungen/Hatachy/Eigene Dateien/C++/snake.cpp:64: `
_NORMALCURSOR' undeclared (first use this function)

C:/Dokumente und Einstellungen/Hatachy/Eigene Dateien/C++/snake.cpp: At
global scope:
C:/Dokumente und Einstellungen/Hatachy/Eigene Dateien/C++/snake.cpp:277: `main'

must return `int'

C:/Dokumente und Einstellungen/Hatachy/Eigene Dateien/C++/snake.cpp: In
function `int main(...)':
C:/Dokumente und Einstellungen/Hatachy/Eigene Dateien/C++/snake.cpp:278: `
_NOCURSOR' undeclared (first use this function)

Ausführung beendet

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

Neue Beiträge

Zurück