# spieleprogrammierung >> snake



## sumpfhuhn (9. März 2003)

Ok, dacht ich mir warum net mal snake coden. Nun bin ich schon angeeckt das muss man doch irgendwie in ner schleife laufen lassen oder so ne? so weit bin ich schon  


```
#include <stdio.h> 

#define KEY_UP 72 
#define KEY_DOWN 80 
#define KEY_LEFT 75 
#define KEY_RIGHT 77 
// kein plan wies weiter geht ;)
```

kann mir da einer helfen oder hat da schon Erfahrungen?

thx, schön Sonntag noch


----------



## ShabbY (9. März 2003)

der anfang kommt mir irgendwie recht bekannt vor 

naja ich hab schOn n tread offen wo mein bissheriger code drin steht.

http://www.tutorials.de/tutorials74221.html

denk ma das er dir n bisschen weiterhilft, da ich schOn n paar meder weiter bin ;D

der is aber auch noch nicht perfekt. die fehler die ich atm hab stehen auch im thread ich hoff das ich dir helfen konnte


----------



## sumpfhuhn (9. März 2003)

wie erfährt man eigentlich die nr. für die tasten? fängt man oben bei esc an zu zählen?  bin da totaler nuub in spiele coden. ;-)

ahja und thx


----------



## ShabbY (9. März 2003)

schreib dir einfach ein programm wo du mit getch(); einen tastenwert einliest und lasst dir den wert dann einfach wieder ausgeben


----------



## ernieB (26. März 2006)

Also ich hab mal ein Snake-spiel geschrieben und ich muss dir sagen setz dich nicht so auf die deatils fest.
Also Ich hab da 2 2-deminsionale Arrays benutzt: den einen als Spielfeld und den anderen für die Koordinaten der Schlange. dann musst du die koordinaten in das Spielfeld reinkopieren und da abfragen, ob das Feld nicht schon belegt ist(mit der Schlange oder mit einer Frucht).

Jetzt kommt das schwierigst Die Schlange muss wachsen können. Ich hab es mit einem Index für das Schlangen-Array gemacht, welche sich beim essen einer Frucht erhöht.
Dann übergibst du die Chlangenkoordinaten entlang des Array von Hinten nach vorne.
und gelegentlich machst du eine Abfrage, ob es einen Knopfdruck gegeben hat(Das geht mit "kbhit" ganz gut).

Hier mein ganzer Code kannst dich davon inspirieren lassen(ist aber auch nicht perfekt):
// SnakeGame.cpp : Defines the entry point for the console application.
//

```
#include "stdafx.h"
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

#define MAX_SNAKE 400

int field[20][20];//Das Spielfeld
int snake[MAX_SNAKE][2];//Die Schlange
unsigned int x = 5;//X-Koordinate der Schlange 
unsigned int y = 10;//Y-Koordinate der Schlange
int ArrayIndex = 0;//Index der Schlange
int Control = 0;

int CurrentIndex = 0;

unsigned int randomX;//X-Koordinate der Frucht
unsigned int randomY;//Y-Koordinate der Frucht
int a, b;
//Das Feld wird anulliert
void NullField()
{
    int i = 0;
    int j = 0;
    for(i = 0; i < 40; i++)
    {
        field[i][j] = 0;
        for(j = 0; j < 40;j++)
        {
            field[i][j] = 0;
        }
    }
}
//Die Schlange wird anulliert
void NullSnake()
{
    int i = 0;
    int j = 0;
    for(i = 0; i < 400; i++)
    {
        snake[i][j] = 0;
        for(j = 0; j < 2; j++)
        {
            snake[i][j] = 0;
        }
    }
}
//Verlierbedigungen
int Lose()
{
    if(x == 18 ||x == 1 ||y == 19 ||y == 0)
    {
    return 1;
    }
    else if(field[x][y] == 1)
    {
        return 1;
    }
    else
        return 0;
}
////Dies sind die Bewegungsmethoden in alle vier Richtungen//////////
void MoveForward()
{
    do
    {
    x++;
    }
    while(_kbhit == 0);
}
void MoveBack()
{
    do
    {
    x--;
    }
    while(_kbhit == 0);
}
void MoveUp()
{
    do
    {
    y--;
    }
    while(_kbhit == 0);
}
void MoveDown()
{
    do
    {
    y++;
    }
    while(_kbhit == 0);
    
}
//////////////////////////////////////////////////////////////////////
void Move()
{
    _kbhit();//Das Programm prüft, ob die Klaviatur gedrückt wurde
    if(_kbhit() != 0)
    {
        Control = _getch();    //Hier wird geprüft, was gedrückt wurde
    }            
        if(Control == 'a')
        {
            MoveBack();
        }
        else if(Control == 's')
        {
            MoveDown();
        }
        else if(Control == 'w')
        {
            MoveUp();
        }
        else if(Control == 'd')
        {
            MoveForward();
        }
    Sleep(500);// wartet, damit das Spiel nicht zu schnell wird

}


//Druckt das Spielmit Spielfeld aus
void PrintGame()
{
    int k = 0;
    int l = 0;
    for(k = 0;k < 20; k++)
    {
        for(l = 0; l < 20; l++)
        {
            if(field[k][l] == 1)
            {
                printf("*");
                
                
            }
            else if(field[k][l] == 2)
            {
                printf("x");
            }
            else if(k == 0)
            {
                printf("-");
            }
            else if(k == 19)
            {
                printf("-");
            }
            else if(l == 0)
            {
                printf("|");
            }
            else if(l == 19)
            {
                printf("|");
            }
            else
            {
                printf(" ");    
            }
            if(l == 19)
            {
                printf("\n");
            }
        }
        if(k == 19)
        {
            printf("\n");
        }
    }
}


void ClearField()
{
    int n = 0;
    int o = 0;
    for(n = 0; n < 20; n++)
    {
        for(o = 0; o < 20; o++)
        {    
            if(field[n][o] ==1)
            {
                field[n][o] = 0;
            }
        }
    }
}


void MoveSnake()
{
    
    for ( int i = 0; i < CurrentIndex; i++ )
    {
        snake[i+1][0] = snake[i][0];
        snake[i+1][1] = snake[i][1];

    }
    snake[0][0] = x;
      snake[0][1] = y;
}

void DrawSnake()
{

    for ( int i = 0; i <= CurrentIndex; i++ )
    {

        int iX = snake[i][0];
        int iY = snake[i][1];
        field[iY][iX] = 1; 
    }

}


void Food()
{
    randomX = rand();
    randomY = rand();
    
    randomX = randomX%19;
    randomY = randomY%19;
    
    field[randomY][randomX] = 2;//Zufällig ein Essen auf dem Feld erscheinen
lassen
    
}


void main()
{    
    Control = 'w';
    int m = 0;
    int n = 0;
    NullField();
    NullSnake();
    Food();

    printf("\n\n\n");
    do
    {
        
        
                    
        
        Move();
        if(randomY == y && randomX == x)//wenn die Schlange auf das Essen trifft, 
        {                                //wird die Wachstumsmethode aufgerufen
            CurrentIndex++;
            Food();
        }

        DrawSnake();
        MoveSnake();
        PrintGame();
        //clrscr();        
        ClearField();
        
        
    }
    while(Lose() != 1);
    printf("\t\tGAME OVER\n");

}
```


----------



## mike4004 (27. März 2006)

Hi


ich wäre auch an dem prog interresiert ernieB.

jetzt hätte ich die frage was ist die stdafx.h? //was steht da drinen? ClearField();?

mfg mike4004


----------



## FireFlow (27. März 2006)

Tipp: Hört auf die Konsole für solche Spiele zu missbrauchen, oder nehmt eine anständige Library die das erledigt.

Gruß


----------



## ernieB (28. März 2006)

Also die "stdafx.h" ist eine inkludierte Standartbibleothek von C, die solche Schen, wie Konsole aufrufen, oder die einfachsten Funktionen(print, get ...) hat.

Die funktion "void ClearField()" (säubere Feld) läuft das gante Feld ab und setzt es auf 0(null), damit alte Zustände gelöscht werden und das Feld einen neuen Zustand annehmen kann.

PS: an FireFlow Ich finde deinen Beitrag sehr produktiv, und werde darauf eingehen. Danke.
Aber für Anfänger, die, die Sprache erst lernen, ist das wohl der einfachste Weg. Ich finde jeder Anfang sollte gefördert und ermutigt werden, anstatt ihn niederzuschlagen und dem Anfänger die Chanse zu rauben etwas zu lernen. trotzdem würde es mich interessieren, was su mit deinem"...oder nehmt eine anständige Library" meinst.


----------



## FireFlow (28. März 2006)

An sowas versaut man sich den Programmierstil. Die C(++)-Standardbibliothek kennt solche Sachen wie getch und goto nicht. stdafx.h hat auch nix mit dem Standard zu tun, sondern was mit Precompilled Headern und dem MS VC++.


----------



## ernieB (28. März 2006)

Stimmt hast recht mit stdafx, aber ich benutze kene goto(weiss auch grad nicht wie du dadrauf kommst).

Will mich ja mit dir auch nicht streiten, bin selber kein profi. Aber eigentlich ist das Programm doch korrekt geschrieben.


----------



## mike4004 (28. März 2006)

Hi

frage was ist mit der datei jetzt?

hab keine ahnung was ich damit machen soll.
programmiere C sollte aber trotzdem laufen.

mfg mike4004


----------



## ernieB (28. März 2006)

also eigentlich kannst du den gesammten Quelltext von mir nehmen und den in ein neues c-Projekt kopieren und dann kompelieren. Jetzt erscheint die Shell mit einem Spielfeld und einem Sternchen als Schlange. Gann nur noch mit 'a''s''w' und 'd' lenken.


----------



## R3VOLT (22. Februar 2008)

hi ich dachte ich geb auch mal mein senf zum thema, da ich auch snake für die konsole programmiert habe...
wollte mal fragen ob ernieB's programmtext bei euch funktioniert!
bei mir nämlich erst nachdem ich einige änderungen vorgenommen habe.
bin bei meinem programm schon ein ganzes stückchen weiter, mir fehlt eig nur noch eine sinnvolle steigerung der geschwindigkeit, die durch den befehl 
Sleep(zahl);
geregelt wird...
wenn meine schlange eine frucht frisst steigert sich meine variable 'score' um 5...
jetz will ich dass alle 50 punkte die geschwindigkeit gesteigert wird, das problem ist dass die angezeigte geschwindigkeit eine zahl von 1-10 sein soll und aus dieser ein wert berechnet werden soll, der dann in Speed(); steht. dieser wert muss ja kleiner werden wenn meine zahl von 1-10 größer wird, habt ihr ne idee?
mein text:


> //steigerung der geschwindigkeit um 1
> if(score%50==0)
> {
> speed++;
> ...


----------



## ernieB (25. Februar 2008)

HaliHalo!
Zu dem Programm muss ich sagen, dass ich nicht mehr geau weiss, wie ich das gemacht habe, es is ja mitlerweile auch 2 Jahre alt. und wenn ich mich recht erinnere hatte es einen bug beim Punkteessen. aber wenn ich mir das so im nachhinein angucke hätte ich das ander gemacht. das ganze porgramm hätte man viel mehr unterteilen müssen.

Nun zu deinem Problem. ich würde eine extra Klasse für die "Spielbetrueung" anlegen, in der du eine Variable hast, von, die den sleepwert beinhaltet. und von ihr ziehst du immer eine menge ab. das mit den Punkten hast du vermutlich schon hinbekommen.
also letzendlich hast du zwei schleifen in der inneren zählst du die punkte bis zu einem grenzwert hoch(in 5er Schritten bis 50) und wenn du dann di schleife verlassen hast, dann erhöhst du den abzugswert von deiner sleepvariablen. 

gruß ernieB


----------

