Snake-Schlange wächst nur einmal korrekt



  • Hallo, liebe c++-Community!

    Wie der Titel bereits vermuten lässt, habe ich ein Problem mit meinem ersten aufwendigeren Spiel, einem Snake-Klon.
    Der unten auffindbare Code lässt sich kompilieren und liefert im Grunde genommen auch ein snakeartiges Spiel. Zumindest solange, bis man mehr als einen Stern einsammelt (die Teile, die man einsammeln muss, um irgendwann zum nächsten Level voranschreiten zu können habe ich mit einem Sternchen '*' dargestellt).
    Eigentlich sollte die Schlange pro "gefressenem" Sternchen um 2 Felder anwachsen. Nach dem Verspeisen des ersten Sterns tut sie das auch fleißig. Nur danach nicht. Ich habe den Inhalt meiner Arrays überprüft und erkannt, dass merkwürdigerweise der Rumpf, sowie das erste Schwanzsegment eigene Werte aufweisen. ALLE weiteren Segmente sind nach dem Verspeisen des 2., 3. oder weiteren Sterns identisch, was bedeutet, dass sie sich im Prinzip überlagern. Doch wieso das der Fall ist, ist mir absolut schleierhaft. Die Prozedur, mit der die ersten zwei Schwanzsegmente an den Rumpf angekoppelt werden, ist identisch mit der, mit der alle weiteren an das jeweils letzte Segment gehängt werden. Wo liegt bloß der Fehler? Bevor das hier noch zu einem Roman ausufert, werde ich euch meinen Code präsentieren. Der Fehler dürfte lediglich in den Zeilen 200 bis 492 liegen, der Rest kann meiner Meinung nach nichts damit zu tun haben und kann also vernachlässigt werden.

    Ich möchte mich schonmal herzlich im Voraus bedanken und hoffe darauf, dass ein Außenstehender mehr sieht als ich es als Papa dieses Codes zu können scheine.

    Also, hier der Code (ich hoffe, die Länge geht in Ordnung):

    //Codeanfang
    /******************SNAEJK************************
    Diese Datei enthaelt den Code fuer ein Spiel, in dem
    es im wesentlichen darum geht, mit der Tastatur eine
    Schlange ueber ein 40x40 Felder grosses Areal zu bewegen.
    Dabei ist das Ziel, alle Sternchen auf dem Spielfeld
    zu "fressen", indem man den Schlangenrumpf darueber 
    manoevriert. Bei jedem gefressenen Stern waechst die 
    Schlange um zwei Felder an. Beim verlassen des Spiel-
    feldes auf einer Seite, taucht die Schlange nach und
    nach auf der gegenueberliegenden Seite wieder auf.
    ***************************************************/
    //VERSION: 0.01
    //AUTOR: Paiam
    //SPRACHE: Deutsch
    /**************************************************/
    
    //header
    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    using namespace std;
    
    //Deutsche Umlaute 
    #define ae <<umlae<<
    char umlae = 132;
    #define AE <<umlAE<<
    char umlAE = 142;
    #define oe <<umloe<<
    char umloe = 148;
    #define OE <<umlOE<<
    char umlOE = 153;
    #define ue <<umlue<<
    char umlue = 129;
    #define UE <<umlUE<<
    char umlUE = 154;
    #define ss <<umlss<<
    char umlss = 225;
    
    //Beliebiges Feld ansteuern (in der Konsole)
    void gotoxy(int x,int y)
    {
       COORD cur={x,y};
       SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cur);
    } 
    
    //Den Cursor verschwinden/auftauchen lassen
    int ShowConsoleCursor( bool show )
    {
        CONSOLE_CURSOR_INFO ci = {0};
        if ( ! GetConsoleCursorInfo( GetStdHandle(STD_OUTPUT_HANDLE), &ci ) )
            return 1;
        ci.bVisible = show;
        if ( ! SetConsoleCursorInfo( GetStdHandle(STD_OUTPUT_HANDLE), &ci ) )
            return 1;
        return 0;
    } 
    
    //Wartefunktion - am besten eignen sich Werte zwischen 100 und 400
    void wait(unsigned int mseconds)
    {
    clock_t goal = mseconds + clock();
    while (goal > clock());
    } 
    
    //Hauptfunktion
    int main()
    {
        HANDLE wHnd;    // Handle zum Beschreiben der Konsole
        HANDLE rHnd;    // Handle zum Auslesen der Konsole
    
        // handles fuer das Lesen und Beschreiben
        wHnd = GetStdHandle(STD_OUTPUT_HANDLE);
        rHnd = GetStdHandle(STD_INPUT_HANDLE);
        // Fenstertitel
        SetConsoleTitle("Snajk");
        // Fenstergroesse
        SMALL_RECT windowSize = {0, 0, 40, 40};
        // Konsolenfenstergroesse
        SetConsoleWindowInfo(wHnd, TRUE, &windowSize);
          // COORD fuer Buffergroesse
        COORD bufferSize = {41, 41};
        // Interne Buffergroesse
        SetConsoleScreenBufferSize(wHnd, bufferSize);
    
        //--------GRUNDEINSTELLUNGEN DES SPIELS--------------//
        //Spielfeld (40 mal 40 Felder)
        //1. Dim.: X-Koordinate; 2. Dim.: Y-Koordinate
        int field[40][40];//die Elemente des Arrays koennen folgende Werte annehmen:
                          //0=leer 1=Schlangenteil 2=Stern
        srand( (unsigned) time(NULL) );//fuer Zufallszahlen
    
        ShowConsoleCursor(FALSE);//kein Cursor
    
        int row;    //Zeile
        int column; //Spalte
    
        //Alle Felder auf "leer" setzen (0)
        for(row=0; row<40; row++)
        {
                column=0;
                while (column<40)
                {
                      field[row][column]=0;
                      column++;
                }
        }
        //Position des Schlangenkopfes (Startpunkt)
        int xPos = 19;
        int yPos = 30;
        field[19][30] = 1; //ist von Schlangenkopf besetzt, deswegen '1'
        int direction = 1; //direction beinhaltet die Informationen fuer
                           //die Richtung, in die sich die Schlange bewegt.
                           //Moeglichkeiten sind nach: 1=oben 2=rechts 
                           //                          3=unten 4=links
                           //am Start schaut die Schlange nach oben (1)
        int randStarPosX = 0;
        int randStarPosY = 0;
        char input = ' ';
        int collected = 0; //Anzahl eingesammelter Sterne (zu Beginn = 0)
        int level = 0; // diese Variable gibt an, wieviele Sterne
                       //zum Minimum (5) addiert werden
        int starsTotal = 5+level; //Mindestanzahl an Sternen = 5
        int waitingTime = 200;//Anfaengliche Reaktionszeit, die spaeter dem
                              //aktuellen Level angepasst wird
        int length = 0;//Laenge des Schwanzes. Zu Beginn ist keiner vorhanden
    
        int tailPosX[30];//Positionen der Schwanzsegmente (X- und Y-Koordinaten)
        int tailPosY[30];
        for(int i=0; i<30; i++)//Startwerte fuer noch nicht vorhandene Segmente
        {
                tailPosX[i]=99;//(99/99) ausserhalb des Spielfeldes
                tailPosY[i]=99;
        }        
        int tailEndPosX = 19;//Position des Schlangenendes (am Start der Kopf)
        int tailEndPosY = 30;
    
        //-------------------SPIELBEGINN----------------------//
        //Intro
        cout << "****************SNäJK********************";
        cout << "*                                       *";
        cout << "*Willkommen zu SnÄjk. In diesem Spiel   *";
        cout << "*geht es darum, mit einer Schlange      *";
        getch();//auf Tastendruck zum Beginnen warten
    
        //------------------HAUPTSCHLEIFE---------------------//
     while(level<=10)//solange keine 10 Level absolviert wurden
     {  
        if(randStarPosX==0)//Falls Level/Spiel neu, Anfangsstern zuweisen
        {
               randStarPosX = 2 + (rand() % (38-2+1));
               randStarPosY = 2 + (rand() % (38-2+1));
               for(int i=0; i<1; i++)
                 {
                  if(field[randStarPosX][randStarPosY]==0)//falls Feld leer, Stern pltz.
                  {
                           field[randStarPosX][randStarPosY]=2;
                  }else{//ansonsten neues Feld auswaehlen
                           randStarPosX = 2 + (rand() % (38-2+1));
                           randStarPosY = 2 + (rand() % (38-2+1));
                           i--;//for-Schleife erneut durchgehen
                  }
                 }
        }
        field[xPos][yPos]=0;//Schlange wird zum Startpunkt zurueckgesetzt
                            //deswegen wird vorherige Position auf 'leer' gesetzt
        xPos        = 19; //wieder zum Startpunkt zurueck bei Levelstart
        yPos        = 30;
        tailEndPosX = 19;//Schwanz zuruecksetzen
        tailEndPosY = 30;
    
        for(int i=0; i<30; i++)//Startwerte fuer noch nicht vorhandene Segmente
        {
                if(tailPosX[i]<=39 && tailPosY[i]<=39)//Falls betreffendes Segment
                                                    //innerhalb des Spielfeldes
                {field[tailPosX[i]][tailPosY[i]]=0;}//Felder leeren, auf denen Seg-
                                                    //mente waren
                tailPosX[i]=99;//(99/99) ausserhalb des Spielfeldes
                tailPosY[i]=99;
        }   
        starsTotal = 5+level; //Anzahl Sterne fuer aktuellen Level festlegen
    
        collected = 0; //neuer Level, neue Sterne zum Sammeln  
        while(collected < starsTotal)//Levelbeginn
        {
               waitingTime = 200-(level*10);//Reaktionszeit dem Level anpassen
               //Zufaellige Positionen fuer Sterne:
                if(field[randStarPosX][randStarPosY]!=2)//falls kein Stern im Spiel:
                {
                 collected++;//Stern muss eingesammelt worden sein
                 length = length+2;//Schwanzsegmente anfuegen
                 switch(direction)
                 {
                          case 1: tailPosX[length-2]=tailEndPosX;//Erstes Neues
                                  tailPosY[length-2]=tailEndPosY+1;
                                  tailPosX[length-1]=tailEndPosX;//Zweites Neues
                                  tailPosY[length-1]=tailEndPosY+2;
                                  tailEndPosX=tailPosX[length-1];//Neues Ende
                                  tailEndPosY=tailPosY[length-1];
                                  //Auch als Schlangenteil annehmen/Feld fuellen
                                  field[tailPosX[length-2]][tailPosY[length-2]]=1;
                                  field[tailPosX[length-1]][tailPosY[length-1]]=1;
                                  break;
                          case 2: tailPosX[length-2]=tailEndPosX-1;//Erstes Neues
                                  tailPosY[length-2]=tailEndPosY;
                                  tailPosX[length-1]=tailEndPosX-2;//Zweites Neues
                                  tailPosY[length-1]=tailEndPosY;
                                  tailEndPosX=tailPosX[length-1];//Neues Ende
                                  tailEndPosY=tailPosY[length-1];
                                  //Auch als Schlangenteil annehmen/Feld fuellen
                                  field[tailPosX[length-2]][tailPosY[length-2]]=1;
                                  field[tailPosX[length-1]][tailPosY[length-1]]=1;
                                  break;
                          case 3: tailPosX[length-2]=tailEndPosX;//Erstes Neues
                                  tailPosY[length-2]=tailEndPosY-1;
                                  tailPosX[length-1]=tailEndPosX;//Zweites Neues
                                  tailPosY[length-1]=tailEndPosY-2;
                                  tailEndPosX=tailPosX[length-1];//Neues Ende
                                  tailEndPosY=tailPosY[length-1];
                                  //Auch als Schlangenteil annehmen/Feld fuellen
                                  field[tailPosX[length-2]][tailPosY[length-2]]=1;
                                  field[tailPosX[length-1]][tailPosY[length-1]]=1;
                                  break;
                          case 4: tailPosX[length-2]=tailEndPosX+1;//Erstes Neues
                                  tailPosY[length-2]=tailEndPosY;
                                  tailPosX[length-1]=tailEndPosX+2;//Zweites Neues
                                  tailPosY[length-1]=tailEndPosY;
                                  tailEndPosX=tailPosX[length-1];//Neues Ende
                                  tailEndPosY=tailPosY[length-1];
                                  //Auch als Schlangenteil annehmen/Feld fuellen
                                  field[tailPosX[length-2]][tailPosY[length-2]]=1;
                                  field[tailPosX[length-1]][tailPosY[length-1]]=1;
                                  break;
                          default: system("cls"); //Falls die Variable
                                   cout<<"Fatal Error!\a";//'direction' andere
                                   getch();//Werte als 1,2,3 oder 4 enthaelt:
                                   exit(0);//Abbruch des Spiels
                 }
                 //zwischen 2 und 38 (sowohl X- als auch Y-Koordinaten)
                 randStarPosX = 2 + (rand() % (38-2+1));
                 randStarPosY = 2 + (rand() % (38-2+1));
                 for(int i=0; i<1; i++)
                 {
                  if(field[randStarPosX][randStarPosY]==0)//falls Feld leer, Stern pltz.
                  {
                           field[randStarPosX][randStarPosY]=2;
                  }else{//ansonsten neues Feld auswaehlen
                           randStarPosX = 2 + (rand() % (38-2+1));
                           randStarPosY = 2 + (rand() % (38-2+1));
                           i--;
                  }
                 }
                }
    
                          system("cls"); //Bildschirm leeren
                          if(kbhit()) // Taste wurde gedrueckt
                          {
                                      input = getch();//gedrueckte Taste
                                      switch(input) //kontrolliert, welche Taste
                                                 //gedrueckt wurde (w,a,s,d,default)
                                      {
                                     //Uebernahme der neuen Ausrichtung/Taetigkeit
                 //nach: oben, rechts, untern, links, Programm beenden, unveraendert
                 //Spielende. Damit keine Kehrtwende moeglich ist, darf die neue
                 //Richtung nicht entgegengesetzt der alten sein.
                                               case 'w':
                                                    if(direction!=3)
                                                    { 
                                                       direction = 1;break;
                                                    }else{
                                                        break;
                                                    } 
                                               case 'd':
                                                    if(direction!=4)
                                                    { 
                                                       direction = 2;break;
                                                    }else{
                                                        break;
                                                    }
                                               case 's':
                                                    if(direction!=1)
                                                    { 
                                                       direction = 3;break;
                                                    }else{
                                                        break;
                                                    }
                                               case 'a':
                                                    if(direction!=2)
                                                    { 
                                                       direction = 4;break;
                                                    }else{
                                                        break;
                                                    }      
                                               case 'x': system("cls");
                                                         cout<<"Vielen Dank, dass"
                                                             <<" Sie Sn"ae"jk gespi"
                                                             <<"elt \nhaben!";
                                                         getch();exit(0);//Ende
                                               default: break;//ohne Aenderung
                                      }
                          }else{ //Falls keine Taste gedrueckt wurde, wird keine 
                              ;  //Aenderung vorgenommen
                          }
    
                           switch(direction)//welche Richtung?
                           {
                                  case 1: if(yPos==1)//hat oberen Rand erreicht
                                          {
                                          if(length==0)
                                          {
                                          field[xPos][yPos]=0;
                                          }else{
                                          //Feld mit letztem Schwanzsegment ist nun leer                                                  
                                          field[tailPosX[length-1]][tailPosY[length-1]]=0;  
                                          for(int i=1;i<length;i++)//alle Segmente
                                                               //nachruecken lassen
                                          {
                                          tailPosX[i]=tailPosX[i-1];
                                          tailPosY[i]=tailPosY[i-1];
                                          field[tailPosX[i]][tailPosY[i]]=1;
                                          }                                    
                                          tailPosX[0]=xPos;//erstes Segment rueckt nach
                                          tailPosY[0]=yPos;
                                          tailEndPosX = tailPosX[length-1];
                                          tailEndPosY = tailPosY[length-1];
                                          }
                                          yPos=40; //unten auftauchen
                                          field[xPos][yPos]=1;          
                                          }else{
                                          field[xPos][yPos-1]=1;
                                          if(length==0)
                                          {
                                          field[xPos][yPos]=0;
                                          }else{
                                          //Feld mit letztem Schwanzsegment ist nun leer                                                  
                                          field[tailPosX[length-1]][tailPosY[length-1]]=0;
                                          for(int i=1;i<length;i++)//alle Segmente
                                                               //nachruecken lassen
                                          {
                                          tailPosX[i]=tailPosX[i-1];
                                          tailPosY[i]=tailPosY[i-1];
                                          field[tailPosX[i]][tailPosY[i]]=1;
                                          }                                      
                                          tailPosX[0]=xPos;//erstes Segment rueckt nach
                                          tailPosY[0]=yPos;
                                          tailEndPosX = tailPosX[length-1];
                                          tailEndPosY = tailPosY[length-1];
                                          }
                                          yPos--; //eine Reihe nach oben
                                          }
                                          break;
                                  case 2: if(xPos==40)//hat rechten Rand erreicht
                                          {
                                          if(length==0)
                                          {
                                          field[xPos][yPos]=0;
                                          }else{
                                          //Feld mit letztem Schwanzsegment ist nun leer                                                  
                                          field[tailPosX[length-1]][tailPosY[length-1]]=0;      
                                          for(int i=1;i<length;i++)//alle Segmente
                                                               //nachruecken lassen
                                          {
                                          tailPosX[i]=tailPosX[i-1];
                                          tailPosY[i]=tailPosY[i-1];
                                          field[tailPosX[i]][tailPosY[i]]=1;
                                          }                                      
                                          tailPosX[0]=xPos;//erstes Segment rueckt nach
                                          tailPosY[0]=yPos;
                                          tailEndPosX = tailPosX[length-1];
                                          tailEndPosY = tailPosY[length-1];
                                          }
                                          xPos=1;  //links auftauchen
                                          field[xPos][yPos]=1;          
                                          }else{
                                          field[xPos+1][yPos]=1;
                                          if(length==0)
                                          {
                                          field[xPos][yPos]=0;
                                          }else{
                                          //Feld mit letztem Schwanzsegment ist nun leer                                                  
                                          field[tailPosX[length-1]][tailPosY[length-1]]=0;
                                          for(int i=1;i<length;i++)//alle Segmente
                                                               //nachruecken lassen
                                          {
                                          tailPosX[i]=tailPosX[i-1];
                                          tailPosY[i]=tailPosY[i-1];
                                          field[tailPosX[i]][tailPosY[i]]=1;
                                          }                                      
                                          tailPosX[0]=xPos;//erstes Segment rueckt nach
                                          tailPosY[0]=yPos;
                                          tailEndPosX = tailPosX[length-1];
                                          tailEndPosY = tailPosY[length-1];
                                          }
                                          xPos++;
                                          }
                                          break;
                                  case 3: if(yPos==40)//hat unteren Rand erreicht
                                          {
                                          if(length==0)
                                          {
                                          field[xPos][yPos]=0;
                                          }else{
                                          //Feld mit letztem Schwanzsegment ist nun leer                                                  
                                          field[tailPosX[length-1]][tailPosY[length-1]]=0;
                                          for(int i=1;i<length;i++)//alle Segmente
                                                               //nachruecken lassen
                                          {
                                          tailPosX[i]=tailPosX[i-1];
                                          tailPosY[i]=tailPosY[i-1];
                                          field[tailPosX[i]][tailPosY[i]]=1;
                                          }                                      
                                          tailPosX[0]=xPos;//erstes Segment rueckt nach
                                          tailPosY[0]=yPos;
                                          tailEndPosX = tailPosX[length-1];
                                          tailEndPosY = tailPosY[length-1];
                                          }
                                          yPos=1; //oben auftauchen
                                          field[xPos][yPos]=1; 
                                          }else{
                                          field[xPos][yPos+1]=1;
                                          if(length==0)
                                          {
                                          field[xPos][yPos]=0;
                                          }else{
                                          //Feld mit letztem Schwanzsegment ist nun leer                                                  
                                          field[tailPosX[length-1]][tailPosY[length-1]]=0;
                                          for(int i=1;i<length;i++)//alle Segmente
                                                               //nachruecken lassen
                                          {
                                          tailPosX[i]=tailPosX[i-1];
                                          tailPosY[i]=tailPosY[i-1];
                                          field[tailPosX[i]][tailPosY[i]]=1;
                                          }                                      
                                          tailPosX[0]=xPos;//erstes Segment rueckt nach
                                          tailPosY[0]=yPos;
                                          tailEndPosX = tailPosX[length-1];
                                          tailEndPosY = tailPosY[length-1];
                                          }
                                          yPos++;
                                          }
                                          break;
                                  case 4: if(xPos==1)//hat linken Rand erreicht
                                          {
                                          if(length==0)
                                          {
                                          field[xPos][yPos]=0;  
                                          }else{
                                          //Feld mit letztem Schwanzsegment ist nun leer                                                  
                                          field[tailPosX[length-1]][tailPosY[length-1]]=0;
                                          for(int i=1;i<length;i++)//alle Segmente
                                                               //nachruecken lassen
                                          {
                                          tailPosX[i]=tailPosX[i-1];
                                          tailPosY[i]=tailPosY[i-1];
                                          field[tailPosX[i]][tailPosY[i]]=1;
                                          }                                      
                                          tailPosX[0]=xPos;//erstes Segment rueckt nach
                                          tailPosY[0]=yPos;
                                          tailEndPosX = tailPosX[length-1];
                                          tailEndPosY = tailPosY[length-1];
                                          }
                                          xPos=40; //rechts auftauchen
                                          field[xPos][yPos]=1; 
                                          }else{
                                          field[xPos-1][yPos]=1;
                                          if(length==0)
                                          {
                                          field[xPos][yPos]=0;
                                          }else{
                                          //Feld mit letztem Schwanzsegment ist nun leer                                                  
                                          field[tailPosX[length-1]][tailPosY[length-1]]=0;
                                          for(int i=1;i<length;i++)//alle Segmente
                                                               //nachruecken lassen
                                          {
                                          tailPosX[i]=tailPosX[i-1];
                                          tailPosY[i]=tailPosY[i-1];
                                          field[tailPosX[i]][tailPosY[i]]=1;
                                          }                                      
                                          tailPosX[0]=xPos;//erstes Segment rueckt nach
                                          tailPosY[0]=yPos;
                                          tailEndPosX = tailPosX[length-1];
                                          tailEndPosY = tailPosY[length-1];
                                          }
                                          xPos--;
                                          }
                                          break;
                                 default: system("cls"); //Falls die Variable
                                          cout<<"Fatal Error!\a";//'direction' andere
                                          getch();//Werte als 1,2,3 oder 4 enthaelt:
                                          exit(0);//Abbruch des Spiels
    
                           }   //Ende der Richtungsaenderung 
    
                           //-----------Bild erzeugen----------
                           row=0; column=0; //oben links beginnen mit Neuzeichnen
    
                           for(row=0; row<40; row++) //Zeilen
                           {
                                      for(column=0; column<40; column++)//Spalten
                                      {
                                                    gotoxy(row, column);
                                                    switch(field[row][column])
                                                    //was ist auf diesem Feld?
                                                    {
                                                          //nichts/leer
                                                          case 0: cout<<" ";
                                                          break;
                                                          //Schlange(nteil/-kopf)
                                                          case 1: cout<<"O";
                                                          break;
                                                          //Futter/Stern
                                                          case 2: cout<<"*";
                                                          break;
                                                          //Falls nicht:
                                                          default: system("cls"); 
                                                          cout<<"Fatal Error!\a";
                                                          getch();//Spielabbruch
                                                          exit(0);//wegen falschen
                                                                 //Objekts auf Feld
                                                    }
                                      }//Ende einer Zeile
    
                                      /***ZUM DEBUGGING!!!!!***
                                      gotoxy(tailEndPosX, tailEndPosY);
                                      cout<<"H";//Zeigt das momentane Schwanzende an
                                      gotoxy(20, 10);cout<<tailEndPosX;
                                      gotoxy(20, 9);cout<<"4 "<<tailPosX[3];
                                      gotoxy(20, 8);cout<<"3 "<<tailPosX[2];
                                      gotoxy(20, 7);cout<<"2 "<<tailPosX[1];
                                      gotoxy(20, 6);cout<<"1 "<<tailPosX[0];
                                      gotoxy(20, 5);cout<<"Schwanzsegmente ";
                                      gotoxy(20, 4);cout<<"xPos "<<xPos;
                                      gotoxy(20, 3);cout<<"length "<<length; */
                                      //if(tailPosX[2]==tailPosX[3]&&length>=4)
                                      //{system("cls");cout<<"ERROR!";getch();}
                                      //************************/
    
                           } //Ende der Bilderzeugung               
    
                           wait(waitingTime);//dem Spieler Zeit zum Reagieren geben         
    
        }//Ende des Levels
        level++;//naechsten Level vorbereiten
        length = 0;//Schwanzlaenge wieder zuruecksetzen
        field[randStarPosX][randStarPosY]=0;//zuletzt erzeugten Stern entfernen
        randStarPosX = 0;//Zufallsfelder zuruecksetzen
        randStarPosY = 0;
        while(input!=VK_RETURN)//Enter zum Fortfahren abwarten
        {      
          system("cls");
          gotoxy(14,14);//formatierte Textausgabe
          cout<<"LEVEL "<<level+1<<"\n\n      Enter zum Fortfahren dr"ue"cken";
          input=getch();//Eingabe aufnehmen (Enter erforderlich zum Fortfahren)
          if(input=='x')//Spielende durch Druecken von 'x'
          {
                  system("cls");
                  cout<<"Vielen Dank, dass"
                      <<" Sie Sn"ae"jk gespi"
                      <<"elt\nhaben!";
                  getch();
                  exit(0);
          }
        }
    
     }//ENDE DER HAUPTSCHLEIFE
    
     //Spielende (Sieg)
     system("cls");
     cout<<"Herzlichen Gl"ue"ckwunsch, Sie haben das Spiel gewonnen!"
         <<"\n\nCredits:\n\nSn"ae"jk by Paiam (c)2009"
         <<"\n\n\nZum Beenden des Programms beliebige Taste dr"ue"cken...";
     getch();
    } //Ende der Hauptfunktion
    
    //Codeende
    

    Gruß, Paiam!



  • das zauberwort heißt debuggen.
    da es hier anscheindend niemand für dich machen möchte, musst du es wohl selbst tun.
    mfg.



  • Hallo!

    Ich habe nun endlich die Lösung meines Problems gefunden. Selbst mit Debugging, welches ich bereits vor meinem ersten Post hier durchgeführt habe, kam ich bis heute nicht darauf, was denn nun falsch ist. Dann fiel es mir plötzlich ins Auge. Es ist mir durchaus bewusst, dass keiner die Arbeit für einen anderen machen möchte. Das habe ich auch nicht erwartet. Ich hoffte nur, dass jemandem der Fehler direkt ins Auge fällt, wie es heute bei mir der Fall war. Es war lediglich ein kleiner Logikfehler, der alles aufhielt. Anstatt der Schlange von hinten nach vorne jeweils mitzuteilen, wo jeder Teil des Schwanzes zu sein hat, tat ich das von vorn nach hinten, was zur Folge hatte, dass im Endeffekt alle Segmente die Position des ersten hatten. Somit lag der Fehler nicht im Code, wo ich ihn suchte, sondern in meiner Denkweise, was alles so unglaublich schwierig für mich machte.
    Da das nun endlich geklärt ist, kann dieser Thread gern geschlossen werden.
    Ich möchte mich, auch wenn die Lösung nicht von hier kam, dafür bedanken, dass sich so viele die Zeit genommen haben, sich meine Frage aus dem ersten Post zumindest durchzulesen.



  • Paiam schrieb:

    Somit lag der Fehler nicht im Code, wo ich ihn suchte, sondern in meiner Denkweise

    Du hattest keinen Fehler in deiner Denkweise, sondern bei der Portierung in den Code, was ihn falsch machte.



  • Na dann eben so 😉
    Dann beinhaltete sogar beides Fehler, da ich den in Code gefassten Fehler tausendfach betrachtete, er mir als solcher aber erst bewusst wurde, nachdem ich erkannte, dass es unlogisch ist, einer Variable den Wert einer anderen zuzuweisen, die den ihren selbst aber auch überliefert bekommen hat. Naja, wie auch immer, bin jedenfalls froh, dass ich endlich wieder voran komme.
    Bevor das hier in Spam ausartet, darf der Thread geschlossen werden (falls das hier gängige Praxis ist, nachdem Fragen geklärt wurden).

    Gruß, Paiam!



  • Möchte nocheinmal nerven: Bei dem nächsten Projekt könntest du ja mal nach dem ADP verfahren vorgehen: Analyse - Desgin - Programmierung. Wenn du das strukturiert einhältst sind sogar weniger Denkfehler oder ähnliches gewährleistet. Außerdem berücksichtigst du wichtige Dinge beim Design, die wichtig für die spätere Programmierung sind.



  • Kóyaánasqatsi schrieb:

    Möchte nocheinmal nerven: Bei dem nächsten Projekt könntest du ja mal nach dem ADP verfahren vorgehen: Analyse - Desgin - Programmierung. Wenn du das strukturiert einhältst sind sogar weniger Denkfehler oder ähnliches gewährleistet. Außerdem berücksichtigst du wichtige Dinge beim Design, die wichtig für die spätere Programmierung sind.

    Und es funktioniert nicht.



  • volkard schrieb:

    Und es funktioniert nicht.

    Nichts gegen deine Aussage, bei mir funktioniert's oft genug selbst nicht - aber wie gehst du denn vor?



  • Badestrand schrieb:

    volkard schrieb:

    Und es funktioniert nicht.

    Nicht's gegen deine Aussage, bei mir funktioniert's oft genug selbst nicht - aber wie gehst du denn vor?

    Hauptvorgehen: In das Problem Eintauchen durch Lösen von Detailproblemen. Immer das einfachste Stück herausrauspicken und lösen. Solange damit weitermachen, bis alles ferig ist. Dadurch lerne ich die ganze Zeit über, während ich schon produktiven Code baue. Gelegentlich Erzeugen von Kronkorken und sie beschriften und sie auf dem Schreibtisch umherschieben.
    Nebenvorgehen: Projektkritische Fragen vorziehen. Skaliert mein Ansatz überhaupt gut genug? Kann ein Programm in winxp überhaupt flackerfrei im Konsolefenster laufen?



  • Klingt gut, danke 🙂



  • Naja, ich muß gestehen ich habe wieder mal gesündigt. Das Programm steht jetzt. War was Kleines. Ich habe zwei Tage lang mich vor dem Anfangen gedrückt, weil immer, wenn ich mich mal kurz dransetzte, einfach kein hübscher Anfang da war. Gegen heute mitternacht kam die Erleuchtung. Jetzt steht die erste Hälfte, die bereits Daten sammeln kann. Habe nicht das leichteste zuerst gemacht, sondern sage und schreibe 120 Zeilen von vorn nach hinten in die main() geklopft und es ist trotzdem gut. Es skaliert schlecht, ist aber erstmal egal.
    Die Auswertung kommt dann später. Die ist kompliziert und muß aus Performancegründen objektorientiert werden. Die Klassen werden ganze Blöcke aus der fetten main() übernehmen können und der Datensammler wird die Klassen des Auswerters bekommen und schneller werden.
    Also entgegen dem, was ich predige, habe ich wohl zwei Tage (halbherzig) geplant, um dann 5.5 Stunden zu coden. Entgegen dem, was ich predige, ist mein Prog flach wie für den 64-er.
    Ich kann nur sagen: Alle Generalisierungen sind falsch.


Anmelden zum Antworten