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