Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

}

Geschrieben

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

Geschrieben

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

}

Geschrieben

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

Geschrieben

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.

Geschrieben

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;

}

Geschrieben

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.

Geschrieben

@ 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

Geschrieben

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.

Geschrieben

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?

Geschrieben

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.

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben


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

Geschrieben

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

Geschrieben

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?

Geschrieben

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?

Geschrieben

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.

Geschrieben

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?

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