Eigenartiges einpendeln des "Zufalls" ?
-
Hey C++ler
ich arbeite gerade an einem kleinen 2D Spiel...
Die sogenannten "Guys" bewegen sich willkürlich (also in zufällige) Richtungen und zufällig lange.
Hier der nötige Code um das Problem nachzuvollziehen:
Die Funktion MoveGuy, die in der GameLoop jede 60tel sec aufgerufen wird, sie soll den "Guys" Bewegungsrichtungen zu weisen und die "Move..." Funktionen aufrufen:
void MoveGuy(vector<Guy> & guys) { for(unsigned int i = 0; i < guys.size(); i++) { if(guys[i].movetime > 0) { switch(guys[i].degree) //je nach degree den guy bewegen { case 0: MoveGuyUp(guys,i); break; case 45: MoveGuyUp(guys,i); MoveGuyRight(guys,i); break; case 90: MoveGuyRight(guys,i); break; case 135: MoveGuyDown(guys,i); MoveGuyRight(guys,i); break; case 180: MoveGuyDown(guys,i); break; case 225: MoveGuyDown(guys,i); MoveGuyLeft(guys,i); break; case 270: MoveGuyLeft(guys,i); break; case 315: MoveGuyUp(guys,i); MoveGuyLeft(guys,i); break; } guys[i].movetime--; } else //Ansonsten neue Zufallsrichting und neue Zufallszeit hohlen { guys[i].degree = RandDegree(); guys[i].movetime = RandTime(); } } }Die zugehörigen RandomFunktionen:
int RandDegree() { srand( (unsigned) time(NULL) ) ; int a = 1; int b = 8; //Weil es 8 versch. Richtungen gibt (horizontal = 1) int z = a + ( rand() % ( b - a + 1 ) ); switch (z) { case 1: return 0; break; case 2: return 45; break; case 3: return 90; break; case 4: return 135; break; case 5: return 180; break; case 6: return 225; break; case 7: return 270; break; case 8: return 315; break; } return false; } int RandTime() { srand( (unsigned) time(NULL) ) ; int a = 0; int b = 240; int z = a + ( rand() % ( b - a + 1 ) ); return z; }Wenn noch was fehlt bitte posten...
So weit so gut:
Die Funktion MoveGuy geht alse jeden Guy des vector guys durch und schaut ob seine movetime schon abgelaufen ist. Wenn nein dann bewegt sie ihn in seiner derzeiten ausrichtung weiter und zieht 1 von movetime ab.
Wenn movetime dann 0 ist, wird ein neuer Degree (Ausrichtung) per Zufallsgenerator eingeholt und eine neue Movetime.NUN DAS PROBLEM:
Es kommt mir für eine "zufällige" auswahl der degrees und movetimes doch sehr komisch vor, dass bei einer anzahl von ca. 20 guys auf dem bildschirm sie zum größten Teil alle ihre Richtung gleichzeitig und in die selbe Richtung ändern.....
Das wollte ich nicht erreichen...Wo liegt der Fehler?
Ich hoffe ihr könnt mir ein wenig weiterhelfen..
Danke schon mal im Vorraus

mfg
-
Nimm die srand()-Aufrufe aus deinen Funktionen raus. Du setzt dort bei jedem Aufruf die Zufallszahlensequenz zurück. srand rufst du im Normalfall exakt einmal in der main-Funktion auf.
-
Du initialisierst ständig den Zufallszahlengenerator neu. Und verwendest dafür die Systemzeit. Das Bewegen deiner Männchen geht aber sicherlich viel zu schnell als dass zwischen zwei aufeinanderfolgenden soviel Zeit vergehen könnte, dass time(NULL) etwas anderes zurückgibt.
Schau dir mal <random> an.
-
@bashar:
Klasse! Es hat funktioniert, vielen Dank!Danke @ all