spieleprogrammierung >> snake

sumpfhuhn

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

Code:
#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
 
der anfang kommt mir irgendwie recht bekannt vor :D

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
 
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 :)
 
Zuletzt bearbeitet:
schreib dir einfach ein programm wo du mit getch(); einen tastenwert einliest und lasst dir den wert dann einfach wieder ausgeben
 
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.
//
Code:
#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");

}
 
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
 
Tipp: Hört auf die Konsole für solche Spiele zu missbrauchen, oder nehmt eine anständige Library die das erledigt.

Gruß
 
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.
 
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++.
 
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.
 
Zurück