Snake

Chri$

Mitglied
Hi,.:( :(
ich habe ein einfaches Snake im Interet gefunden, aber ich weiß nicht wie man den Quellcode verändern kann, dass sich die Schlange bei jedem gefressenen Futter verlängert.
Vielleicht könnt ihr mir helfen


Code:
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<dos.h>
#include<stdlib.h>
#include<time.h>

/**********Diese Variablen werden für die Konsolenroutinen benötigt**********/
	HANDLE hStdIn,hStdOut;
	DWORD dwInputEvents;
	COORD xypos;
	CONSOLE_CURSOR_INFO cci;
                     INPUT_RECORD inputBuffer;
	DWORD NRofEvents;
	DWORD dwMode; 
/****************************************************************************/

/*************************Prototypendeklaration******************************/

void draw_frame(char linetype);			  /* Rahmen aus "linetype" zeichnen */
void move(int key);                 /* Schlangenbewegung auf Cursor-Tasten  */
void update(void);                 /* Verschiebt die Arrays um einen Index  */
void place_target(void);  /* Setzt Zeichen zum fressen an Zufalls-Position  */




/*****Deklaration, Definition, Initialisierung globaler Variablen************/

int speed=80, score=0, new_target=1, eatcount=0, level=1;
short target_x, target_y, alive=1, direction=77;
int snake_array_x[11]={11,12,13,14,15,16,17,18,19,20,21};
int snake_array_y[11]={11,11,11,11,11,11,11,11,11,11,11};




/*******************************Hauptprogramm********************************/

void main(void)
{

	srand(time(0));					     /* Zufallsgenerator initialisieren */
	draw_frame(219);                                     /* Rahmen ausgeben */
	gotoxy(1,24);
	printf("Start mit Return...");
	getchar();
	for(i=0; i<10; i++)                                /* Schlange ausgeben */
	{
		gotoxy(snake_array_x[i], snake_array_y[i]);
		printf("#");
	}
	while(alive)                    /* Solange wiederholen bis Rand berührt */
	{
		if(eatcount==5)             /* Immer nach 5 gefressenen Zeichen die */
		{                           /* Geschwindigkeit erhöhen und einen    */
			speed-=20;              /* Level hochzählen                     */
			level++; 
			eatcount=0;             /* Fress-Zähler zurücksetzen            */
		}
		Sleep(speed);
		if(kbhit())                /*  Prüfen, ob eine Taste gedrückt wurde */
			move(getch());         /* Falls ja, diese Taste an move() geben */
		else                       /* Andernfalls vorherige Richtung nehmen */
			move(direction);
		if(new_target)             /* Wenn das Zeichen gefressen wurde,     */
			place_target();        /* dann ein neues setzen                 */
		gotoxy(1,24);

//Textfarben setzen
	SetConsoleTextAttribute(hStdOut,3|FOREGROUND_INTENSITY);
	SetConsoleTextAttribute(hStdOut,2);
		/*Punkte + Level-Anzeige aktualisieren */
		printf("Punktestand: %d     Level: %d",score,level);
	}
	getchar();                  /* Vor dem Beenden noch ein Return abwarten */
}
/*************************Ende des Hauptprogramms****************************/



/************************Definition von draw_frame***************************/
void draw_frame(char linetype)
{
	int i=0;
	gotoxy(1,1);
	for(i=1; i<80; i++)                 /* Obere Waagerechte Zeile ausgeben */
		printf("%c",linetype);
	printf("\n");
	for(i=1; i<22; i++)             /* Linke und rechte Senkrechte ausgeben */
	{
		gotoxy(1,i);                                               /* links */
		printf("%c",linetype);
		gotoxy(80,i);                                             /* rechts */
		printf("%c\n",linetype);
	}
	gotoxy(1,22);
	for(i=1; i<=80; i++)               /* Untere waagerechte Linie ausgeben */
	printf("%c",linetype);
}
/****************************Ende draw_frame********************************/




/**************************Definition von move******************************/
void move(int key)
{
	gotoxy(snake_array_x[0], snake_array_y[0]); /* Letztes Zeichen der      */
	printf(" ");                                  /* Schlange löschen         */
	switch (key)
	{
	
		case 77:	snake_array_x[10]=snake_array_x[9]+1;    /* nach rechts */
					snake_array_y[10]=snake_array_y[9];
					update();
					gotoxy(snake_array_x[9], snake_array_y[9]);
					printf("#");
					direction=77;
					break;

		case 75:	snake_array_x[10]=snake_array_x[9]-1;     /* nach links */
					snake_array_y[10]=snake_array_y[9];
					update();
					gotoxy(snake_array_x[9], snake_array_y[9]);
					printf("#");
					direction=75;
					break;

		case 72:	snake_array_x[10]=snake_array_x[9];        /* nach oben */
					snake_array_y[10]=snake_array_y[9]-1;
					update();
					gotoxy(snake_array_x[9], snake_array_y[9]);
					printf("#");
					direction=72;
					break;

		case 80:	snake_array_x[10]=snake_array_x[9];       /* nach unten */
					snake_array_y[10]=snake_array_y[9]+1;
					update();
					gotoxy(snake_array_x[9], snake_array_y[9]);
					printf("#");
					direction=80;
					break;
	}
	if(snake_array_x[9]<2 || snake_array_x[9]>78   /* Falls Rand berührt... */
	 ||snake_array_y[9]<2 || snake_array_y[9]>21)
	{
//		sound(500);
		Sleep(300);
		system("cls");
		gotoxy(30,11);
		printf("G A M E  O V E R");
//		nosound();
		alive=0;                          /* Globale Variable für Spielende */
		getch();
		exit(1);
	}
	if(snake_array_x[9]==snake_array_y[11] || snake_array_x[9]<snake_array_y[11])
	{
		system("cls");
		Sleep(300);
		gotoxy(30,11);
		printf("G A M E  O V E R");
		alive=0;
		getch();
		exit(1);
	}
	if(snake_array_x[9] == target_x && snake_array_y[9] == target_y)
	{
		z++;
		score+=100*level;     /* Bei gefressenem Zeichen Punkte hochzählen  */
		new_target=1;   /* Hiermit main() zeigen, daß neues Zeichen her muß */
		eatcount++;                        /* Zähler für gefressene Zeichen */
	}
}
/******************************Ende move*************************************/



/**********************Definition von update*********************************/
void update(void)
{
	for(i=0; i<10; i++)
	{                    /* Element 0 beider Arrays löschen und die anderen */
		snake_array_x[i] = snake_array_x[i+1];    /* nach vorne aufschieben */
		snake_array_y[i] = snake_array_y[i+1];
	}
}
/******************************Ende update***********************************/



/**********************Definition von place_target***************************/
void place_target(void)
{
	new_target=0;
	target_x = rand()%76+2;
	target_y = rand()%19+2;                  /* Zufalls-Position ermitteln */
	gotoxy(target_x, target_y);

//Handles erzeugen
	hStdIn = GetStdHandle(STD_INPUT_HANDLE);
	hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
//Textfarben setzen
	SetConsoleTextAttribute(hStdOut,4|FOREGROUND_INTENSITY);
	SetConsoleTextAttribute(hStdOut,9);
	printf("@");

}
/****************************Ende place_target*******************************/
 
Die Positionen der Körperteile scheinen in snake_array_x und snake_array_y zu stehen. Im Moment sieht es so aus, als ob die Länge fest auf 10 festgelegt ist.

Du müsstest einen Variable für die Länge der Schlange einbauen, z.B: int snake_length = 1;. Die Schlänge würde mit einer Länge von 1 beginnen.

Beim Darstellen und Bewegen musst du natürlich die veränderbare Länge berücksichtigen. Wichtig sind da hauptsächlich die Stellen, wo mit der Laufvariablen i bis 10 gezählt wird.

Beim Fressen müsstest du snake_length erhöhen, aber es darf nicht grösser werden, als es die Länge des Array mit den Snake-Koordinaten erlaubt. Eventuell das Array vergrössern?

snake_array_x[9] und entsprechend für y scheint die Koordinaten für den Kopf der Schlange zu enthalten, also da müsstest du dir überlegen, ob du nicht besser sagst, dass Index 0 die Kopfposition beinhalten soll. Das würde besser mit dem Verlängern der Schlange am Schwanz zusammenpassen.

Hoffe, das hilft weiter.
 
Zurück