falsche Variablenübergabe brauche Hilfe



  • Hi Leute!
    Ich hab folgendes Problem:
    Ich will Snake mit c++ programmieren. ich habe bereits einen code geschrieben, der ein einziges Körperteilchen über ein spielfeld bewegen kann und ein teilchen, das 'fressen' welches immer an der gleichen stelle bleibt, fressen kann. sobald das geschehen ist, erscheint an anderer (zufällig generierter) Stelle ein neues Teilchen. Das hat bis dahin prima geklappt. jetzt will ich aber noch zusätzlich schreiben, dass sobald ein teilchen gefressen wurde, die schlange nach hinten um 1 verlängert wird. und da liegt mein Problem (meine Probleme)
    1. Die Schlange bewegt sich nicht mehr automatisch - das programm wartet auf meinen Knopfdruck
    2. Sobald ich ein Teilchen gefressen habe erscheint nicht hinter meiner Schlange ein neues, sondern ganz oben, in der 1. Zeile. und dort auch nicht immer an der gleichen stelle.

    hier der Code, den ich leider nicht kürzen kann, weil alles nötig ist, um das problem zu verstehen:

    #include <iostream>
    #include <windows.h>
    #include <cstdlib>
    #include <conio.h>
    #include <time.h>
    using namespace std;
    
    int main()
    {
        char position[15][15];
        char richtung;
        int irichtung[225]={4};
        int f_x=0, f_y=0;
        int pos_s_x[225]={0}, pos_s_y[225]={0};
        int zs_pos_s_x[225], zs_pos_s_y[225];
        int score=1;
        bool tot;
        bool fressen_vorhanden=false;
        srand(time(NULL));
        for(int k=0; k<15; k++)
        {
                for(int l=0; l<15; l++)
                {
                        position[l][k]=' ';
                }
        }
        position[0][0]='S';
    
        while(!tot)
        {
             system("cls");
             for(int i=0; i<15; i++)
             {
                    for(int j=0; j<15; j++)
                    {
                            cout<<position[j][i];        
                    }
                    cout<<'|'<<endl;
             }
             cout<<"----------------"<<endl;
             cout<<endl<<irichtung[1]<<' '<<pos_s_x[1]<<' '<<pos_s_y[1];
             if(position[f_x][f_y]=='S')
             {
                    score++;
                    switch(irichtung[score-1])                          
                    {
                           case 1:
                                pos_s_x[score]=pos_s_x[score-1];
                                pos_s_y[score]=pos_s_y[score-1]-1; 
                                break;
    
                           case 2:
                                pos_s_x[score]=pos_s_x[score-1]-1;
                                pos_s_y[score]=pos_s_y[score-1];
                                break;
    
                           case 3:
                                pos_s_x[score]=pos_s_x[score-1];
                                pos_s_y[score]=pos_s_y[score-1]+1;
                                break;
    
                           case 4:
                                pos_s_x[score]=pos_s_x[score-1]+1;
                                pos_s_y[score]=pos_s_y[score-1];
                                break;                  
                    }
                    fressen_vorhanden=false;
             }
             if(!fressen_vorhanden)
             {
                    f_x=rand()%15+1;
                    f_y=rand()%15+1;
                    for(int p=0; p<score; p++)
                    {
                    if(f_x!=pos_s_x[p]&&f_y!=pos_s_y[p])
                    {
                          fressen_vorhanden=true;   
                          position[f_x][f_y]='o';
                    }      
                    }             
             }
             Sleep(100); 
             if(kbhit())
             {
                    richtung=getch();
                    switch(richtung)
                    {
                           case 'w':
                                if(irichtung[1]!=3){irichtung[1]=1;}
                                break;
    
                           case 'a':
                                if(irichtung[1]!=4){irichtung[1]=2;}
                                break;                
    
                           case 's':
                                if(irichtung[1]!=1){irichtung[1]=3;}
                                break;
    
                           case 'd':
                                if(irichtung[1]!=2){irichtung[1]=4;}
                                break;
                    }
             }
             for(int o=0; o<score; o++)
             {
             switch(irichtung[o])
             {
                    case 1:
                         position[pos_s_x[o]][pos_s_y[o]]=' ';
                         pos_s_y[o]=(pos_s_y[o]-1);
                         if(pos_s_y[o]<0){pos_s_y[o]=14;}
                         position[pos_s_x[o]][pos_s_y[o]]='S';
                         break;
    
                    case 2:
                         position[pos_s_x[o]][pos_s_y[o]]=' ';
                         pos_s_x[o]=(pos_s_x[o]-1);
                         if(pos_s_x[o]<0){pos_s_x[o]=14;}
                         position[pos_s_x[o]][pos_s_y[o]]='S';
                         break;
    
                    case 3:
                         position[pos_s_x[o]][pos_s_y[o]]=' ';
                         pos_s_y[o]=(pos_s_y[o]+1)%15;
                         position[pos_s_x[o]][pos_s_y[o]]='S';
                         break;
    
                    case 4:
                         position[pos_s_x[o]][pos_s_y[o]]=' ';
                         pos_s_x[o]=(pos_s_x[o]+1)%15;
                         position[pos_s_x[o]][pos_s_y[o]]='S';
                         break;          
    
             }
             }
             for(int p=score; p>=0; p--)
             {
                     irichtung[p]=irichtung[p-1];
             }
    
        }
    }
    


  • Initialisiere mal deine Variablen bevor du diese benutzt und es wird dir beim debuggen gleich auffallen warum deine Schlange zufällig wächst.
    Grüße



  • f_x=rand()%15+1;
    

    erzeugt Zufallswerte von 1..15, dein Array ist aber

    char position[15][15];
    

    , auf das du mit f_x zugreifst. Da dürfte schon mal ein Fehler liegen.
    Kapsele deine wesentlichen Funktionalitäten (Bildschirm neu malen, Tastaturabfrage, Berechnung) mal in eigene Funktionen (da du ja C++ machen willst, müssten das eigentlich Klassen sein, aber du gehörst auch zu den Leuten, die C++ an ihr Programm ranschreiben und doch nur C einsetzen), das Programm wird dann übersichtlicher und Fehler ( auch Designfehler ) offensichtlicher.


Anmelden zum Antworten