Zum Inhalt springen

Random Zahlen


noli88

Empfohlene Beiträge

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";

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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) );

Link zu diesem Kommentar
Auf anderen Seiten teilen

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++;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)).

Link zu diesem Kommentar
Auf anderen Seiten teilen


#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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...