Komischer Zufallsgenerator oder Fehler im Code?



  • Hi...nachdem ich mein altes Projekt abgeschlossen habe, begann ich ein neues für das 2. Ausbildungsjahr.
    Eine Simulation von '#': Das Zeichen '#' soll sich verhalten wie ein richtig lebendiges '#' ^^ naja soll ne schöne KI bekommen. jetzt wollt ich einfach mal 10 solcher '#' auf den bildschirm per zufall rumrasen lassen. Das komische ist aber, das nach min. 10 Sekunden alle oben links in der Ecke sind, weis einer Warum???

    Meine Frage jetzt: Ist der Zufallsgenerator falsch (bei mir oder allgemein) oder hab ich einen logischen fehler im Code???
    Für eure hilfe wär ich sehr dankbar.

    Hier der Code:

    #include <stdio.h>
    #include <windows.h>
    #include <time.h>
    
    int locate(a,b){
        HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD xy;
        xy.Y = a;
        xy.X = b;
        SetConsoleCursorPosition(stdOut,xy);
        return 0;
    }
    
    typedef struct points
    {
            int x;
            int y;
            int ri;
            int ykill;
            int xkill;
    }point;
    
    int proto()
    {
        int size = 10;
        int i=0;
    
        point po[size]; 
    
        srand(time(0)); //Aktiviere Zufallsgenerator
    
        for(i=0;i<size;i++)   // generiere fuer jeden Punkt die Position zufaellig und auch dir Richtung
        {
            po[i].x = rand()%79;
            po[i].y = rand()%24;
            po[i].ri = rand()%9;
        }
        // Richtungen:
        // 1 2 3
        // 4 5 6
        // 7 8 9
        //***********
        do
        {
    
            for(i=0;i<size;i++)
            {    
                po[i].xkill = po[i].x; //alte position speichern
                po[i].ykill = po[i].y; 
    
                switch(po[i].ri) // Fuehre bei den jeweiligen richtungsangaben folgende aktionen aus
                {
                    case 1: po[i].x--;po[i].y--;break;
                    case 2: po[i].y--;break;
                    case 3: po[i].x++;po[i].y--;break;
                    case 4: po[i].x--;break;
                    case 5: break;
                    case 6: po[i].x++;break;
                    case 7: po[i].x--;po[i].y++;break;
                    case 8: po[i].y++;break;
                    case 9: po[i].x++;po[i].y++;break;
                    default: break;
                }
    
                if(po[i].y < 0) {po[i].y = 0;}if(po[i].y > 23) {po[i].y = 23;} //Kollision
                if(po[i].x < 0) {po[i].x = 0;}if(po[i].x > 79) {po[i].x = 79;}
    
                po[i].ri = rand()%9;  //Neue Richtung zufaellig auswaehlen
    
                locate(po[i].ykill,po[i].xkill);printf(" "); //vorhrige Position loeschen
                locate(po[i].y,po[i].x);printf("#"); //Anzeigen
    
            } 
    
        }while(!kbhit()); //Abbruch bei Tastendruck
    
        return 0;
    }
    
    int main()
    {
        proto();
        return 0;
    }
    


  • Hallo,
    dieser Quellcode lässt sich so mit Sicherheit nicht kompilieren.

    Bei folgender Funktion fehlen die Typenbezeichner.

    int locate(a,b){
    

    Hier fehlt ein const vor "int size"

    int size = 10;// muss const sein...
    point po[size];//...sonst geht das so nicht
    

    Ansonsten ist mir erstmal nichts weiter aufgefallen, was zu deinem beschriebenen Verhalten führt.

    EDIT:
    Folgendes würde ich noch vor den switch-Block ziehen. Ist irgendwie logischer, da du ja im switch-Block auf die neue Richtung reagieren willst.

    po[i].ri = rand()%9;  //Neue Richtung zufaellig auswaehlen
    

    EDIT2:
    Deine Zufallsrichtung liegt zw 0 und 8 (nicht 1 bis 9). "case 9" wird nie ausgeführt



  • MiP schrieb:

    Bei folgender Funktion fehlen die Typenbezeichner.

    int locate(a,b){
    

    In C gibt es das sog. default-int. Damit sind alle Deklarationen, die keinen Typ mitbekommen, vom Typ int.

    Hier fehlt ein const vor "int size"

    int size = 10;// muss const sein...
    point po[size];//...sonst geht das so nicht
    

    Richtig in C++, falsch in C89. In C99 geht es allerdings auch ohne 'const'. Dafür ist in C99 "default-int" deprecated.



  • Ja, sorry, wusste wohl nicht mehr, in welchem Sub-Forum ich mich befinde.
    Aber entscheidend für den Fragesteller ist ja meine Antwort unter EDIT2. :p


Anmelden zum Antworten