Snake Kein Wachstum

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Prokon
Beiträge: 4
Registriert: Sa Jan 19, 2013 5:19 pm

Snake Kein Wachstum

Beitrag von Prokon » Sa Jan 19, 2013 5:31 pm

Hallöchen,
ich sitze seit letzten Mittwoch dadran Snake zu Programmieren und bin soweit auch sehr zufrieden mit mir. Die meisten meiner Probleme hab ich selbst oder mithilfe von Google gelöst. Doch leider brauch ich jetzt eure Hilfe:(

Das Problem ist folgendes, mein Code funktioniert soweit von dem Spielablauf jedoch hat sich irgendwo ein Fehler eingeschlichen, sodass meine Schlange nur um 1 Körperteil wächst jedoch nicht weiter. Ich habe den Code mehrmals akribisch durchgescannt jedoch kein Fehler in der fürs Wachstum zuständigen Funktion gefunden.

Also erstmal hier der Code:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <unistd.h>
#include <windows.h>

/**Defines für das Array**/
#define Hoehe 20
#define Breite 60

/**Define Array Bedeutung**/
#define Wand 1
#define Platz 0
#define Kopf 2
#define Maus 4

/**Define Tastenbelegung**/
#define Hoch  119
#define Runter 115
#define Links 97
#define Rechts 100

/**Define Schlange**/
#define MaxSchlange Hoehe*Breite
unsigned int x_head=12;
unsigned int y_head=10;
int Schlange[MaxSchlange][2];
int Schlangenlaenge;
int Richtung;

/**Rest**/
unsigned int randomX,randomY;
int a,b;
int x=0;
int y=0;
int Speed;

/**Spielfläche**/
int Spielfeld[Hoehe][Breite];


/**Spielregeln etc**/
int GameOver(){
if(y_head==Hoehe-1||y_head==0||x_head==0||x_head==Breite-1){
return 1;}
if(Spielfeld[y_head][x_head]==2){
return 1;}
else{
return 0;}
}

void GameSpeed(){
if(Schlangenlaenge==4){
    Speed=60;}
if(Schlangenlaenge==6){
    Speed=2000;}
}


/**Bewegung**/
void BewegungRechts(){
x_head++;}

void BewegungLinks(){
x_head--;}

void BewegungHoch(){
y_head--;}

void BewegungRunter(){
y_head++;}



/**BewegungWASD**/
void Bewegung(){
kbhit();
if(kbhit()!=0)
{
Richtung = getch();
}
if(Richtung == 97)
{
BewegungLinks();
}
else if(Richtung == 115)
{
BewegungRunter();
}
else if(Richtung == 119)
{
BewegungHoch();
}
else if(Richtung == 100)
{
BewegungRechts();
}
Sleep(20);}



/**SpielfeldRelated**/
void FeldDrucken(){
int y,x;
for(y=0;y<Hoehe;y++){
    for(x=0;x<Breite;x++){
    if(Spielfeld[y][x]==0){
    printf(" ");}
    if(Spielfeld[y][x]==1){
    printf(".");}
    if(Spielfeld[y][x]==2){
    printf("o");}
    if(Spielfeld[y][x]==4){
    printf("x");}
    }
    printf("\n");}
    }


void SpielfeldNeu(){
for(a=0;a<Hoehe;a++){
    for(b=0;b<Breite;b++){
        if((a==0 || a==Hoehe-1) ||(b==0 || b==Breite-1)){
            Spielfeld[a][b]=1;}
        else Spielfeld[a][b]=0;
    }}}

void SpielfeldSauber()
{
int n = 0;
int o = 0;
for(n = 0; n < Hoehe; n++){
    for(o = 0; o < Breite; o++){
    if(Spielfeld[n][o] == 2){
        Spielfeld[n][o] = 0;}
    }}}


/**SchlangeAlles**/

void BewegenSchlange(){

for(int i = 0;i<=Schlangenlaenge;i++){
Schlange[i+1][0]=Schlange[i][0];
Schlange[i+1][1]=Schlange[i][1];
}
Schlange[0][0] = y_head;
Schlange[0][1] = x_head;
}

void PrintSchlange(){
for ( int i = 0; i <= Schlangenlaenge; i++ ){
int iY = Schlange[i][0];
int iX = Schlange[i][1];
Spielfeld[iY][iX] = 2;
}}


/**Random Etc.**/
void MausSpawn(){
randomX=rand();
randomY=rand();

randomX=randomX%59;
randomY=randomY%19;
if(randomX==0){
randomX++;}
if(randomY==0){
randomY++;
}
Spielfeld[randomY][randomX]=4;
}
void gotoxy(){
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

int main(){
Speed=10;
Richtung = 100;
SpielfeldNeu();
MausSpawn();

do{
GameSpeed();
Bewegung();
if(randomY == y_head && randomX == x_head){
Schlangenlaenge++;
MausSpawn();}

gotoxy(x,y);
BewegenSchlange();
PrintSchlange();
FeldDrucken();
SpielfeldSauber();


}while(GameOver() != 1);
x=15;
y=21;
gotoxy(x,y);
printf("GAME OVER\n");
Sleep(2000);
return 0;
}
Ich habe allles in Untergruppen aufgeteilt sodass es schön übersichtlich ist wie ich hoffe.
Das Problem scheint bei BewegenSchlange oder PrintSchlange zu liegen.Der Code ist noch nicht vollkommen fertig und es gibt auch Sachen wie die GameSpeed Funktion die noch kein Sinn ergeben weil ich sie grade einfach zum Testen nicht benutze:)

Falls ihr den Fehler findet weshalb die Schlange nur nach 1 mal Fressen anwächst wäre ich sehr dankbar dafür.

Da ich das erste mal in einem Programmier Forum was Poste bitte ich um verständnis falls ich nicht alle erforderlichen Informationen gepostet habe!Bei Fragen einfach Posten werde die so schnell wie möglich beantworten.
Gruß,
Prokon

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Snake Kein Wachstum

Beitrag von nufan » Sa Jan 19, 2013 5:45 pm

Hallo und willkommen im Forum :)

Ich hab mir jetzt mal nur einen groben Überblick verschafft, aber mir fällt folgender Teil auf:

Code: Alles auswählen

    for(int i = 0;i<=Schlangenlaenge;i++){
    Schlange[i+1][0]=Schlange[i][0];
    Schlange[i+1][1]=Schlange[i][1];
    }
Denk dir diesen Teil mal ganz genau durch. Angenommen du hast 5 Elemente in der Schlange. Dein Element mit Index 1 kommt auf die Position von dem Element mit dem Index 0. Als nächstes kommt dein Element mit Index 2 auf die Position von dem mit Index 1. Und hier liegt der Fehler: Element 1 befindet sich bereits auf der Position von 0 und jetzt verschiebst du auch noch Element 2 dort hin. Alle nachfolgenden Elemente kommen ebenfalls auf diese Position. Es sieht nur so aus als hättest du genau 2 Elemente, weil du danach das 0. Element "händisch" (außerhalb der Schleife) verschiebst.

Prokon
Beiträge: 4
Registriert: Sa Jan 19, 2013 5:19 pm

Re: Snake Kein Wachstum

Beitrag von Prokon » Sa Jan 19, 2013 5:58 pm

Ganz ehrlich du bist der beste :)
Ich danke dir vielmals!

Code: Alles auswählen

for(int i = Schlangenlaenge;i>=0;i--){
Schlange[i][0]=Schlange[i-1][0];
Schlange[i][1]=Schlange[i-1][1];
}
Schlange[0][0] = y_head;
Schlange[0][1] = x_head;
}
Hab es jetzt so gelöst!Hoffe du erkennst dort nicht ein Fehler der mir villeicht später Probleme machen könnte:)
Und danke nochmal!Bin an diesem kleinen Fehler echt verzweifelt!

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Snake Kein Wachstum

Beitrag von nufan » Sa Jan 19, 2013 6:01 pm

Prokon hat geschrieben:Ganz ehrlich du bist der beste :)
Haha naja fast... ;)
Prokon hat geschrieben:

Code: Alles auswählen

for(int i = Schlangenlaenge;i>=0;i--){
Schlange[i][0]=Schlange[i-1][0];
Schlange[i][1]=Schlange[i-1][1];
}
Schlange[0][0] = y_head;
Schlange[0][1] = x_head;
}
Hab es jetzt so gelöst!Hoffe du erkennst dort nicht ein Fehler der mir villeicht später Probleme machen könnte:)
Leider doch ^^ Du greifst beim letzten Schleifendurchlauf (i = 0) auf das Element mit Index -1 zu. Du merkst das Problem nur nicht, weil du nachher das 0. Element händisch setzt. Trotzdem würde ich das ändern.

Prokon
Beiträge: 4
Registriert: Sa Jan 19, 2013 5:19 pm

Re: Snake Kein Wachstum

Beitrag von Prokon » Sa Jan 19, 2013 6:18 pm

Das stimmt allerdings:P
Habs geändert.Vielen dank!

Mache mich jetzt ans implementieren einer Highscore Speicher Funktion die den Highscore in einer Datei abspeichert und diesen immer wieder beim Neustart einliest aus dieser Datei:)
Sollte nicht schwer sein aber falls ich mich wieder ganz doof anstelle bei etwas kommt hier sicher wieder ein Post^^

Schönen Samstag sonst noch!

Prokon
Beiträge: 4
Registriert: Sa Jan 19, 2013 5:19 pm

Re: Snake Kein Wachstum

Beitrag von Prokon » So Jan 20, 2013 4:35 am

So ich bin eiglt in der Finalen Phase grade, Highscore erstellung etc funktioniert einwandfrei, auch eine Textausgabe beim erreichen einer bestimmten Punktegrenze funktioniert super.

Ich hätte jedoch eine Frage, und zwar ob man die Konsolenausgabe beschleunigen kann?Hab alle Sleeps die ich eingebaut hatte entfernt.Die Schlange ist zwar nicht langsam, aber auch nicht sehr schnell, was ich eigtl erwartet hätte bei sonem einfachen Code.Ich meine mein Pc sollte nicht wirklich lange brauchen um eine neue ausgabe zu berechnen. Also versteh ich nicht wodurch die Konsolenausgabe limitiert ist!

Würde mich über jegliche Information diesbezüglich freuen!
Will nämlich dass sich die Geschwindigkeit mit den Punkten verändert, aber der Maxmögliche Speed ist mir zu gering um es SINNVOLL zu implementieren:)

Grüße,
Prokon

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Snake Kein Wachstum

Beitrag von Xin » So Jan 20, 2013 10:55 am

Prokon hat geschrieben:Ich hätte jedoch eine Frage, und zwar ob man die Konsolenausgabe beschleunigen kann?Hab alle Sleeps die ich eingebaut hatte entfernt.Die Schlange ist zwar nicht langsam, aber auch nicht sehr schnell, was ich eigtl erwartet hätte bei sonem einfachen Code.Ich meine mein Pc sollte nicht wirklich lange brauchen um eine neue ausgabe zu berechnen. Also versteh ich nicht wodurch die Konsolenausgabe limitiert ist!
Hier können wir auch nur raten.

Wenn Du Dir das "bb"-Demo ansiehst, wirst Du feststellen, dass die Konsole ziemlich flott sein kann.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten