noli88 Geschrieben 20. Dezember 2004 Geschrieben 20. Dezember 2004 Hy! Bin grad dabei eine Art Elfmeterspiel zu entwerfen. Ganz einfach. Z.B: wenn ich Links Oben schiessen will, drück ich 1 , Links Unten 2, Rechts Unten 3 Rechts Oben 4 und in die Mitte 5. Nun wüsste ich aber gerne wie ich es schaffen würde, das der PC durch die Erschaffung einer Random Zahl 1-5 den "Tormann" in eine Ecke wirft. Hier habe ich den Tormann fix in die Ecke 4 geworfen. Bräuchte aber zwecks Wiederspielwert halt Randomzahlen. cout << "\n\nSchiessen sie!\n"; cin >> Schuss; if (Schuss !=4) { cout << "Tor fuer Oesterreich!\n"; Treffer++; } else { cout << "Daneben!\n"; } Zitieren
Bubble Geschrieben 20. Dezember 2004 Geschrieben 20. Dezember 2004 Die Funktion rand() liefert Dir eine Pseudo-Zufallszahl im Bereich von 0 bis RAND_MAX. Um also eine Zahl von 1-5 zu erzeugen: Zahl = 1 + (rand()%4); Damit bei jedem Programmstar andere Pseudo-Zufallszahlen erzeugt werden, rufst Du zu Beginn Deines Programms noch einmal die Funktion srand mit einem immer anderen Startwert auf, z.B. so: srand( (unsigned int)time(NULL) ); Zitieren
noli88 Geschrieben 20. Dezember 2004 Autor Geschrieben 20. Dezember 2004 gleiche Datei, anderes Problem: Ich komm einfach nicht drauf wo hier der Fehler liegen soll. Die 2fache Fehlermeldung in der gleichen Zeile lautet: unknown escape sequence '\T' so sieht der Teil aus wo der Fehler auftaucht if (Schuss !=4) { cout << "Tor fuer Oesterreich!\n"; Treffer++; } Zitieren
Klotzkopp Geschrieben 20. Dezember 2004 Geschrieben 20. Dezember 2004 An diesem Codefragment ist nichts falsch. Benutzt du irgendwelche defines? Wenn der Code nicht allzu lang ist, zeig ihn ganz. Oder nimm soviel wie möglich weg, so dass der Fehler bestehen bleibt. Zitieren
noli88 Geschrieben 20. Dezember 2004 Autor Geschrieben 20. Dezember 2004 Der Code ist ziemlich lang. so um die 350 Zeilen. Aber der Fehler ist nur in diesen 5 Zeilen, ich versteh auch nich wieso... Kennt wer von euch einen Link wo "Random" erklärt wird? In meinem Buch ist es nicht aufgeführt... Zitieren
Klotzkopp Geschrieben 21. Dezember 2004 Geschrieben 21. Dezember 2004 Ich sag's auch gern nochmal: Benutzt du irgendwelche defines? Der Code ist ziemlich lang. so um die 350 Zeilen.Auch das sag ich gern nochmal: Oder nimm soviel wie möglich weg, so dass der Fehler bestehen bleibt. Aber der Fehler ist nur in diesen 5 Zeilen, ich versteh auch nich wieso...Der Fehler wird nicht immer da verursacht, wo der Compiler ihn meldet. Kennt wer von euch einen Link wo "Random" erklärt wird? In meinem Buch ist es nicht aufgeführt... Eine Funktion names Random gibt es im Standard nicht. Wenn du dazu Informationen suchst, solltest du sagen, welchen Compiler/IDE/Bibliothek du benutzt. Du brauchst eigentlich nur rand und srand. Zitieren
noli88 Geschrieben 21. Dezember 2004 Autor Geschrieben 21. Dezember 2004 Das vorige Problem hab ich schon gelöst, danke. Hab aber jetzt aus den ca. 250 mittels Funktionen nur noch 55 Zeilen. Eins klappt jetzt aber nicht, wollte ich deshalb fragen: Erläuterúng: Dies ist ein Elferspiel mit "Skript". Randomzahlen kommen später, zuerst soll es einmal so funktionieren. mein Problem ist es, das immer nachdem beide Mannschaften einen Elfer geschossen haben, das momentane Ergebnis angezeigt werden soll Z.B. österreich trifft, deutchland auch, soll AUT 1 GER 1 angezeigt werden. Das klappt auch, ab der 2 Runde bleibt es dann aber die ganze Zeit bei 1:1, also es steht nicht 2:2 oder 3:3 wenn die Mannschaften weiter treffen. Hier der ganze Code, gebt es mal in euren Compiler ein (sorry, ich weis nicht wie man hier die Zeilen reinschiebt): #include <iostream> using namespace std; #include <conio.h> int Team1 (int Schuss, int Treffer) { cout << "\n\nSchiessen sie!\n"; cin >> Schuss; if (Schuss !=2) { cout << "Tor f. AUT!\n"; Treffer++; } else { cout << "\nKein Tor f. AUT!\n"; } } int Team2(int Gegner, int Schuss, int Treffer) { cout << "\nHalten sie!\n"; cin >> Schuss; if (Schuss !=2) { cout << "GER trifft!\n"; ++Gegner; } else { cout << "GER trifft nicht!\n"; } cout << "\nAut: " << Treffer; cout << "\nGer: " << Gegner; } int main() { int Schuss=0, Gegner=0, Treffer=0; cout << "AUT-GER\n"; cout << "Links Unten druecken sie 1, Links Oben(2), Re. Oben(3), Re.Unten(4), Mitte(5)"; Team1(Schuss, Treffer); Team2(Gegner, Schuss, Treffer); Team1(Schuss, Treffer); Team2(Gegner, Schuss, Treffer); Team1(Schuss, Treffer); Team2(Gegner, Schuss, Treffer); Team1(Schuss, Treffer); Team2(Gegner, Schuss, Treffer); Team1(Schuss, Treffer); Team2(Gegner, Schuss, Treffer); getch(); return 0; } Zitieren
Klotzkopp Geschrieben 21. Dezember 2004 Geschrieben 21. Dezember 2004 Ganz einfach: Deine Funktionen Team1 und Team2 arbeiten mit Kopien der Variablen Treffer und Gegner. Änderungen an diesen Variablen wirken sich nicht auf die Variablen auf, mit denen du die Funktionen aufgerufen hast. Du kannst das beheben, indem du Treffer und Gegner als Referenz (int&) übergibst. Es gibt übrigens keinen Grund, die Variable Schuss zu übergeben. Deklarier sie einfach als lokale Variable in den Funktionen. Zitieren
noli88 Geschrieben 21. Dezember 2004 Autor Geschrieben 21. Dezember 2004 @ Klotzlopp Ich weis nicht ob du das ausprobiert hast, aber mir ist nun aufgefallen, das für Österreich gar nicht aungezreigt wird. Auch wenn Österreich beim ersten mal trifft wird 0 angezwigt. Dabei sieht alles genauso aus wie für Team2 Zitieren
Klotzkopp Geschrieben 22. Dezember 2004 Geschrieben 22. Dezember 2004 Ich habe es gerade ausprobiert, und es funktioniert. Ich musste nur vorher Team1 und Team2 von int auf void ändern. Welchen Compiler verwendest du, dass der das akzeptiert? Du hast zwei int-Funktionen, die nichts zurückgeben. Zitieren
noli88 Geschrieben 22. Dezember 2004 Autor Geschrieben 22. Dezember 2004 Ich habe die Freeware Dev-C++ Nein es funktioniert auch mit void nicht. Auch wenn Österreich beim ersten mal trifft, wird 0 angezeigt. eh aber keinen Grund für diesen Fehler, du vielleicht? Zitieren
U-- °LoneWolf° Geschrieben 22. Dezember 2004 Geschrieben 22. Dezember 2004 Hi hab das ganze mal eben Überflogen und mir die freiheit genommen deinen code anzupassen #include <iostream> using namespace std; #include <conio.h> void Team1 (int Schuss, int& Treffer) { cout << "\n\nSchiessen sie!\n"; cin >> Schuss; if (Schuss !=2) { cout << "Tor f. AUT!\n"; Treffer++; } else { cout << "\nKein Tor f. AUT!\n"; } } void Team2(int Schuss, int& Treffer) { cout << "\nHalten sie!\n"; cin >> Schuss; if (Schuss !=2) { cout << "GER trifft!\n"; ++Treffer; } else { cout << "GER trifft nicht!\n"; } } void Ergebnis(int Home,int Gast, int SchussNR) { cout<<"nach "<<SchussNR<<" Schuessen steht es"<<endl; cout << "\nAut: " << Home; cout << "\nGer: " << Gast; } int main() { int Schuss=0, Gegner=0, TrefferAT=0, TrefferGER=0; cout << "AUT-GER\n"; cout << "Links Unten druecken sie 1, Links Oben(2), Re. Oben(3), Re.Unten(4), Mitte(5)"; Team1(Schuss, TrefferAT); Team2(Schuss, TrefferGER); Ergebnis(TrefferAT, TrefferGER, 1); Team1(Schuss, TrefferAT); Team2(Schuss, TrefferGER); Ergebnis(TrefferAT, TrefferGER, 2); Team1(Schuss, TrefferAT); Team2(Schuss, TrefferGER); Ergebnis(TrefferAT, TrefferGER, 3); Team1(Schuss, TrefferAT); Team2(Schuss, TrefferGER); Ergebnis(TrefferAT, TrefferGER, 4); Team1(Schuss, TrefferAT); Team2(Schuss, TrefferGER); Ergebnis(TrefferAT, TrefferGER, 5); getch(); return 0; } So besteht das Problem mit dem Hochzählen nicht mer. Hinzukommend wird es ist etwas übersichtlicher (wobei es noch lange nicht übersichtlich ist). Wie klotzkop schon sagte für die Treffer must du mit Refernzen arbeiten sonst geht das nicht. Zitieren
nic_power Geschrieben 22. Dezember 2004 Geschrieben 22. Dezember 2004 Hallo, wie Klotzkopp bereits erwähnt hat, verwendest du lokale Variablen, die nur innerhalb der Funktion gültig sind und nach dem Verlassen der Funktion wieder "zerstört" werden. D.h. int Team2(int Gegner, int Schuss, int Treffer) { cout << "\nHalten sie!\n"; cin >> Schuss; if (Schuss !=2) { cout << "GER trifft!\n"; ++Gegner; } else { cout << "GER trifft nicht!\n"; } cout << "\nAut: " << Treffer; cout << "\nGer: " << Gegner; } Wenn Du "++Gegner" verwendest, so ist dieser Wert nur innerhalb der Funktion vorhanden. Nach verlassen steht er nicht mehr zur Verfügung (wie auch die Variable). Nic Zitieren
Warfox Geschrieben 22. Dezember 2004 Geschrieben 22. Dezember 2004 Wenn du noch mit dem rand() arbeitest mach davor einen randomize(); der initailisiert das rand dings...und um ne zufalszahl zwischen 0-5 zu bekommen machste einfach: rand()%6 Zitieren
Schlaubi Geschrieben 22. Dezember 2004 Geschrieben 22. Dezember 2004 Hallo, (sorry, ich weis nicht wie man hier die Zeilen reinschiebt): das kannst du indem du [ code ] als öffnendes Tag benutzt, deinen Code schreibst und [ /code ] als schließendes Tag benutzt, in etwa so sieht dann das aus (die beiden Leerzeichen nach [ und vor ] einfach weglassen): hier steht mein code Zitieren
noli88 Geschrieben 22. Dezember 2004 Autor Geschrieben 22. Dezember 2004 @U[[ °LoneWolf° Thx, es funktioniert. Hätte aber ein paar Fragen zum Aufbau. 2) Wieso weis der Compiler das TrefferAT = Treffer ist, obwohl du Treffer niemals TrefferAT zugewiesen hast? Würds auch funkzionieren wenn man einfach nur Treffer statt TrefferAT schreiben würde? 3) Wieso weis der Compiler das Home Österreich ist und Gast Deutschland ist. Das hast du ja auch nirgends zugewiesen. Zitieren
Klotzkopp Geschrieben 23. Dezember 2004 Geschrieben 23. Dezember 2004 2) Wieso weis der Compiler das TrefferAT = Treffer ist, obwohl du Treffer niemals TrefferAT zugewiesen hast? Würds auch funkzionieren wenn man einfach nur Treffer statt TrefferAT schreiben würde? 3) Wieso weis der Compiler das Home Österreich ist und Gast Deutschland ist. Das hast du ja auch nirgends zugewiesen. So ist das bei Funktionen. Die Variable, die beim Aufruf benutzt wird, wird in die Variable übertragen, die in der Parameterliste der Funktion steht. Die Namen sind dabei völlig egal. Bei dir waren sie jeweils gleich, das müssen sie aber nicht sein. Das gleiche gilt auch für Schuss. Die drei Variablen namens Schuss im Code haben nichts miteinander zu tun. Du könntest den ersten Parameter in Team1 und Team2 auch Hinz bzw. Kunz nennen (du könntest ihn auch ganz weglassen, aber ich wiederhole mich ). Zitieren
U-- °LoneWolf° Geschrieben 23. Dezember 2004 Geschrieben 23. Dezember 2004 #include <iostream> using namespace std; #include <conio.h> bool haltenschiessen(int richtung) { int richtung2=1 + (rand()%4); if (richtung =richtung2) { return true; } return false; } int main() { int anzahl=0 ,richtung=0, Heim=0, Gast=0; cout<<"Wilkommen beim Elferspiel \n\n\n\n"; cout<<"Wie oft wollen sie Schiessen?"; cin>>anzahl; cout<<endl; for (int i=0; i<anzahl;i++) { cout<<"Schuss Nr."<<i+1<<endl; cout<<"Bitte geben sie die Richtung ihres schusses an (Zahlen 1-5)"; cin>>richtung; cout<<endl; if (haltenschiessen(richtung)) { Heim++; cout<<"TOR! TOR! TOR!"<<endl; } else { cout<<"Leider gehalten!"<<endl; } cout<<"Stand \n Heim: "<<Heim<<"\n Gast:"<<Gast<<endl; cout<<"Versuchen sie den Schuss Nr."<<i+1<<"ihres gegners zu halten"<<endl; cout<<"Bitte geben sie die Richtung ihres schusses an (Zahlen 1-5)"; cin>>richtung; cout<<endl; if (haltenschiessen(richtung)) { Gast++; cout<<"MIST!"<<endl; } else { cout<<"GEHALTEN!"<<endl; } cout<<" Zwischenstand \n Heim: "<<Heim<<"\n Gast:"<<Gast<<endl; } cout<<"\n\n\n\n\n\n\n\n\n\n Endstand \n Heim: "<<Heim<<"\n Gast:"<<Gast<<endl; getch(); return 0; } Hier mal das ganze etwas übersichtlicher und ohne referenzen. Du must nur noch das random koriegieren das will bei mir nicht wirklich. Zitieren
nic_power Geschrieben 23. Dezember 2004 Geschrieben 23. Dezember 2004 Hallo, Du must nur noch das random koriegieren das will bei mir nicht wirklich. Könnte das an der folgenden Zeile liegen? Ich nehme an, dass dort eigentlich ein Vergleich stattfinden sollte. if (richtung =richtung2) Nic Zitieren
U-- °LoneWolf° Geschrieben 23. Dezember 2004 Geschrieben 23. Dezember 2004 ups ja genau Blöder Blöder tippfehler an sowas sucht man sich fuschich Zitieren
noli88 Geschrieben 23. Dezember 2004 Autor Geschrieben 23. Dezember 2004 Ich kenne mich mit C++ nicht so gut aus (bin grad am lernen), und mit random noch wenger. An welcher Stelle von U[[ °LoneWolf° Version muss ich jetzt srand( (unsigned int)time(NULL) ); eingeben damit sich die Zahlen immer ändern, und nicht immer die reihenfolge gleich ist? Zitieren
noli88 Geschrieben 23. Dezember 2004 Autor Geschrieben 23. Dezember 2004 Aja, eins noch.... Hab jetzt die Version von U[[ °LoneWolf° öfter gespielt. Bei einer Möglichkeit von 1-5 ist die Wahrscheinlichkeit das der Tormann den Ball hält bei 20%. 80% aller Spiele gehen in deiner Version aber 1:1 aus... also nicht sehr realistsich... Wie könnte man das ändern? Zitieren
U-- °LoneWolf° Geschrieben 24. Dezember 2004 Geschrieben 24. Dezember 2004 em hast du den RFehler in der If anweisung schon korriegeirt ? == anstat = Hinzukommend Hast du bei jedem schuss eine warscheinlichkeit von 1:5 d.h. wenn du das ganze über 1000 mal durchführst sollten die ergebnisse bei einem realen zufall in ihrer anzahl gleich bzw. sehr nah bei einander sein. Zitieren
noli88 Geschrieben 24. Dezember 2004 Autor Geschrieben 24. Dezember 2004 Klar hab ich den Fehler ausgebessert. Was aber das Problem ist, das bei 5 Schüssen das Spiel zu 80% 1:1 ausgeht. Und wieviele Spiele in der Realität gehen schon 1:1 aus??? Ich weis nicht woran das liegen kann, ihr vll? Zitieren
nic_power Geschrieben 24. Dezember 2004 Geschrieben 24. Dezember 2004 Hallo, schau Dir doch mal an, in welchem Bereich die Zufallszahlen liegen, die von Dir erzeugt werden und welchen Bereich Du verwenden möchtest: int richtung2=1 + (rand()%4); Nic Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.