# snake programmierung mit C



## ShabbY (7. März 2003)

hi, ich habe im moment folgendes problem und wäre über tips und hilfen dankbar :>

das ganze funktioniert bereits aber nur eigeschränkt, die schwierigsten sache bekomm ich halt nich hin. problem nr.1 die schlange bewegt sich via knopfdruck zwar aber nur um ein feld, ich kann das ganze zwar in einer schleife laufen lassen, doch dann kann man die richtung nicht ändern. gibt es vll einen befehl wie getch(); der aber weiterläuft wenn keine eingabe vorgenommen wird ?

das andere problem ist die darstellung des schwanzes, da die schlange in wirklichkeit bei mir keine schlange ist sondern nur ein punkt 

naja ich komm echt nicht weiter und wäre für jede hilfe dankbar, 

thx im vorraus

MfG ShabbY


----------



## Dario Linsky (7. März 2003)

Zeig doch mal den Code, den Du bis jetzt schon hast.


----------



## ShabbY (7. März 2003)

Auch wenn der quellcode bestimmt nicht der beste ist will ich ihn euch mal nicht vorenthalten 


#include <conio.h>
#include <stdio.h>

#define KEY_UP    72
#define KEY_DOWN  80
#define KEY_LEFT  75
#define KEY_RIGHT 77

#define STD gotoxy(80,25)

void scores(punkte,bpunkte,laenge,blaenge,speed)
 {

  textcolor(WHITE);

  gotoxy (55,3); cprintf ("Punkte : %05d",punkte-10);
  gotoxy (55,4); cprintf ("Beste Punktzahl: %05d",bpunkte-10);
  gotoxy (55,7); cprintf ("Laenge : %05d",laenge);
  gotoxy (55,8); cprintf ("Laengste Schalge: %05d",blaenge);
  gotoxy (55,10); cprintf ("Speed  : %05d",speed);
  STD;

  textcolor (GREEN);
 }



void main(void)
 {



 int i=0,control;
 int punkte=0,bpunkte=0,laenge=1,blaenge=1,speed=5;
 int lx,ly,px,py;


 retry:

 textbackground(LIGHTBLUE);
 textcolor (LIGHTRED);

 clrscr();

 gotoxy(1,1);cprintf ("ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»");;printf ("\n");

 while (i<23)
  {
  cprintf ("º                                                º");printf ("\n");i++;
  }

 cprintf ("ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¼");

  scores(punkte=10,bpunkte=10,laenge,blaenge,speed);

 STD;


 punkte = 0;
 laenge = 0;
 lx=5,ly=5,px=5,py=5;


 textcolor (LIGHTGREEN); 

 gotoxy (lx,ly);cprintf ("\1");STD;


 srand((unsigned) time());
 px = rand() %48;

 srand((unsigned) time());
 py = rand() %23;

 px=px+2;
 py=py+2;

 gotoxy (px,py); printf ("Ï");STD;

 punkte = punkte+10;
 laenge++;


 while (lx<50&&lx>1&&ly<25&&ly>1)
  {
  textcolor (LIGHTGREEN); 

  control=getch();

  switch(control)
   {
   case KEY_UP    : ly--;  gotoxy (lx,ly);cprintf("\1");gotoxy(lx,ly+1); textcolor(LIGHTRED);cprintf(" ");STD; break;  


   case KEY_DOWN  : ly++;  gotoxy (lx,ly);cprintf("\1");gotoxy(lx,ly-1); textcolor(LIGHTRED);cprintf(" ");STD; break; 


   case KEY_LEFT  : lx--;  gotoxy (lx,ly);cprintf("\1"); textcolor(LIGHTRED);cprintf(" ");STD; break;  


   case KEY_RIGHT : lx++;  gotoxy (lx,ly);cprintf("\b");textcolor(LIGHTRED); cprintf (" ");textcolor(LIGHTGREEN); cprintf ("\1");STD; break;  
   }


  if (lx==px&&ly==py)
   {
   srand((unsigned) time());
   px = rand() %48;

   srand((unsigned) time());
   py = rand() %23;

   px=px+2;
   py=py+2;

   gotoxy (px,py); printf ("Ï");STD;

   punkte = punkte+10;
   laenge++;
   }


  if (punkte>bpunkte) bpunkte=punkte;

  if (laenge>blaenge) blaenge=laenge;


  scores(punkte,bpunkte,laenge,blaenge,speed);


  }


 textcolor(WHITE);

 gotoxy (30,15); cprintf ("GAME OVER");   
 gotoxy (30,17); cprintf ("RetrY ? [J/N]");STD;

 textcolor (GREEN);

 i=0;
 while (i<2)
  {
  control = getch();

  if(control=='n'||control=='N')
   {
   i=2;
   } 
  else if (control=='j'||control=='J')
   {
   goto retry;
   }
  }

 }


----------



## rook (16. März 2003)

also dein code bringt bei mir glatte 19 errors... zumal ich das sowieso nich peile...


```
void scores(punkte,bpunkte,laenge,blaenge,speed)
```

was gibt das? =)


----------



## ShabbY (17. März 2003)

ya, ich weiss. der code is deswegen n bisschen komisch da er auf turbo c2  abgestimmt ist, und das programm hat schon n paar jahre auf dem buckel...

naja mitlerweile ist das snake eigendlich so gut wie fertig,  muss nur noch anstatt der delay funktion ne funktion schreiben die, x hunterstel sekunen wartet, da es nervtig ist wenn das programm immer die prozessor gescheindigkeit nimmt, auf schlechten rechnern ist dann die schlange viel zu lahm. 

naja was ich wissen wollte war eigentlich ob es eine funktion wie kbhit() gibt, das hab ich aber dann von nem freund erfahren, naja thX trozdem.


----------



## rook (18. März 2003)

ein tip wie es eingentlich klappen sollte..
speicher die zeit einmal in einem int, und überprüfe die gespeicherte zeit +5 meintwegen, mit der jezigen zeit... so zält er 100%, 5 sekunden lang und nicht in der prozessor geschwindigkeit


----------



## Daniel Toplak (18. März 2003)

Ein anderer Tip zu dem Prozessor-Zeit Problem:
Ich habe mir deinen Code jetzt zwar nicht angesehen, aber lass doch das ganze Spiel in einer Hauptschleife ablaufen und bau eine Frame-Bremse ein, so sind übrigens auch modernere Spiele aufgebaut. Nur die brauchen meisst keine Bremse sondern nen Schnellen Rechner *g*.


```
// pseudo-Code:
bool spielende=false;
zeit start, ende, dif; // zeit in millisekunden

// hauptschleife
while(!spielende)
{
  start=Now();
    .
    .
    .
  LeseTastaturEingaben();
    .
    .
    .
  BerechneKollisionen();
    . 
    .
    .
  ZeichneAufDenBildschirm();
    .
    .
    .
  ende = Now();
    .
  dif = ende - start
  if(dif<40)     // bei 25 FPS sind 40 ms ein Frame
  {
    sleep(40-dif);  // warte die differenz zu 40 ms ab
  }
}
// ende der hauptschleife, spiel wurde beendet
```

Somit kannst du sicher sein, daß dein Spiel mit maximal 25 Schleifendurchläufen pro Sekunde läuft und nicht schneller, egal auf welchem Rechner.
Diese Technik wird zwar meisst bei 3D Spielen verwendet, da man pro Schleifendurchlauf ein Bild "rendert" = zeichnet, aber man kann das ohne probleme auf andere Spiele-Arten umbauen.

Gruss Homer


----------



## ShabbY (20. März 2003)

yo danke für den tip, mit den fps, muss ich mir merken 

hab das ganze jetzt aber doch ohne gemacht, da es sich bei einem solchem game nicht wirklich rentiert.

hab einfach die windows.h eingebunden und die Sleep() funktion benutzt. da diese wie ich heute erfahren hab nich wie in der sleep() funktion aus der dos.h x sekunken wartet sondern x hundertstel sekunden.


----------

