Nimm Spiel
-
Hallo!
Meine neue Aufgabe besteht darin ein Nimm Spiel zu schreiben!
Es funktioniert auch wunderbar aber ich hätte gerne noch 2 Sachen geändert.
Ich habe diese im Quelltext kommentiert!Danke für Hilfe!!
#include <iostream> #include <time.h> using namespace std; int main() { cout << endl; cout <<"+----------------!Willkommen beim Nimm-Spiel!-----------------+" << endl; cout <<"| Bei diesem Spiel gibt es eine von ihnen angegebene Zahl |" << endl; cout <<"| von Streichhoelzern. |" << endl; cout <<"| Abwechselnd ziehen sie und der Computer 1-3 Streichhoelzer. |" << endl; cout <<"| Wer am Ende das letzte Streichholz zieht, hat verloren! |" << endl; cout <<"| Fuer den Anfang sollte man mit 10 Streichhoelzern spielen! |" << endl; cout <<"+-------------------------------------------------------------+" << endl; cout << endl; int hoelzer; int ki; int spieler; int nochmal; do { cout <<"Legen sie nun die Anzahl von Streichhoelzern fest: " << endl; cin >> hoelzer; cout <<"Sie haben sich fuer " << hoelzer <<" Streichhoelzer entschieden!" << endl; cout << endl; do { cout <<"Ziehen sie jetzt 1-3 Streichhoelzer!" << endl; do { cin >> spieler; if(spieler > 3) cout <<"Sie duerfen keine hoehere Zahl als 3 eingeben!" << endl; else if(spieler < 1) cout <<"Sie duerfen keine niedrigere Zahl als 1 eingeben!" << endl; }while(spieler > 3 || spieler < 1); hoelzer = hoelzer - spieler; if(hoelzer == 1) cout <<"Sie haben gewonnen!" << endl; else if(hoelzer < 1) cout <<"Sie haben verloren!" << endl; else { cout <<"Es sind noch " << hoelzer <<" Streichhoelzer uebrig!" << endl; cout <<"Nun zieht der PC!" << endl; srand(time(0)); while(ki == 0)ki = rand()%4; //Meistens ergibt das immer die selbe //Variable!! gibt es noch eine andere //Möglichkeit? hoelzer = hoelzer - ki; if(hoelzer == 1) { cout <<"Sie haben leider verloren!" << endl; cout <<"Es ist nur noch 1 Streichholz uebrig!" << endl; } else if(hoelzer < 1) { cout <<"Sie haben gewonnen!" << endl; cout <<"Der PC hat " << hoelzer <<" Streichhoelzer gezogen!" << endl; } else if(ki == 1) cout <<"Der PC hat " << ki <<" Streichholz gezogen!" << endl; else { cout <<"Der PC hat " << ki <<" Streichhoelzer gezogen!" << endl; cout <<"Es sind noch " << hoelzer <<" Streichhoelzer uebrig!" << endl; } } }while(hoelzer > 1); cout << endl; cout << endl; cout <<"Moechten sie nochmal spielen?" << endl; cout <<" (1) JA" << endl; cout <<" (2) NEIN" << endl; cin >> nochmal; }while(nochmal != 2); cout <<"Danke, dass sie dieses Spiel gespielt haben!" << endl; cin.get(); return 0; //Den letzten Satz kann man fast nicht lesen, da sich das Fenster immer sofort //schließt //Gibt es eine Möglichkeit, das um ein paar Sekunden zu verzögern? }
MfG, Alex
-
srand(static_cast<unsigned>(time(NULL)));
->Ist das einzige was mir einfällt um die Zahlen zufälliger zu machen
cin.clear(); cin.ignore(); cin.get();
So sollte es offen bleiben...
-
Hi Alex,
zu 1. srand sollte nur einmal zu begin jedes Programmstarts aufgerufen werden.
zu 2. siehe FAQ
-
Um zufällig Zahlen auszugeben ist da hier geeignet:
#include <cmath>//Wichtig! int tmp; srand( (unsigned)time(NULL) ); tmp = rand() % 9 + 1 //Zahl zwischne 9 und 1
Verzögern mit
system("pause")
oder
getchar();//Warten bis die Eingabe-Taste gedrückt wird.
Diese Funktionen oben sind aber sehr System abhängig!
Was mir am besten gefällt ist das hier:#include <cmath> //wichtig! ..... void warten() { int x, y; for(x=0;i < 1000; x++) for(y=0; y < 1000; y++) sin(x+y); }
Du kannst aber auch eine andere Funktion ausführen lassen!
Ihnen und Sie schreibt man groß.
Wegen der Anrede!mfg CSS
-
Hallo!
Erstmal danke euch beiden!Die Lösung für das schließen des Fensters funktioniert!
Die Zufallszahl ist allerdings immer noch die selbe.
Ich hab jetzt srand ganz nach oben geschrieben und mit static_cast aber die Zahl ist trotzdem immer die gleiche...
Hier nochmal mein Quellcode:#include <iostream> #include <time.h> #include <conio.h> using namespace std; int main() { cout << endl; cout <<"+----------------!Willkommen beim Nimm-Spiel!-----------------+" << endl; cout <<"| Bei diesem Spiel gibt es eine von ihnen angegebene Zahl |" << endl; cout <<"| von Streichhoelzern. |" << endl; cout <<"| Abwechselnd ziehen sie und der Computer 1-3 Streichhoelzer. |" << endl; cout <<"| Wer am Ende das letzte Streichholz zieht, hat verloren! |" << endl; cout <<"| Fuer den Anfang sollte man mit 10 Streichhoelzern spielen! |" << endl; cout <<"+-------------------------------------------------------------+" << endl; cout << endl; int hoelzer; int ki; int spieler; int nochmal; srand(static_cast<unsigned>(time(NULL))); do { cout <<"Legen sie nun die Anzahl von Streichhoelzern fest: " << endl; cin >> hoelzer; cout <<"Sie haben sich fuer " << hoelzer <<" Streichhoelzer entschieden!" << endl; cout << endl; do { cout <<"Ziehen sie jetzt 1-3 Streichhoelzer!" << endl; do { cin >> spieler; if(spieler > 3) cout <<"Sie duerfen keine hoehere Zahl als 3 eingeben!" << endl; else if(spieler < 1) cout <<"Sie duerfen keine niedrigere Zahl als 1 eingeben!" << endl; }while(spieler > 3 || spieler < 1); hoelzer = hoelzer - spieler; if(hoelzer == 1) cout <<"Sie haben gewonnen!" << endl; else if(hoelzer < 1) cout <<"Sie haben verloren!" << endl; else { cout <<"Es sind noch " << hoelzer <<" Streichhoelzer uebrig!" << endl; cout <<"Nun zieht der PC!" << endl; while(ki == 0)ki = rand()%4; hoelzer = hoelzer - ki; if(hoelzer == 1) { cout <<"Sie haben leider verloren!" << endl; cout <<"Es ist nur noch 1 Streichholz uebrig!" << endl; } else if(hoelzer < 1) { cout <<"Sie haben gewonnen!" << endl; cout <<"Der PC hat " << hoelzer <<" Streichhoelzer gezogen!" << endl; } else if(ki == 1) cout <<"Der PC hat " << ki <<" Streichholz gezogen!" << endl; else { cout <<"Der PC hat " << ki <<" Streichhoelzer gezogen!" << endl; cout <<"Es sind noch " << hoelzer <<" Streichhoelzer uebrig!" << endl; } } }while(hoelzer > 1); cout << endl; cout << endl; cout <<"Moechten sie nochmal spielen?" << endl; cout <<" (1) JA" << endl; cout <<" (2) NEIN" << endl; cin >> nochmal; }while(nochmal != 2); cout <<"Danke, dass sie dieses Spiel gespielt haben!" << endl; getch(); return 0; }
-
Hallo CSS!
Erstmal danke für deine Antwort!Nach der neuen Rechtschreibung schreibt man ihnen und sie klein :p
Deine letzte Lösung verstehe ich irgendwie überhaupt nicht!
Aber die beiden anderen werde ich mal ausprobieren!
Danke!
-
Nein. das verstehst du falsch!
Ihnen und Sie schreibt man groß!
Das ist die höfliche Anrede, auch nach der neuen Rechtschreibung.Die letzte Lösung rechnet den Sinus von x+y, du kannst auch jede andere Funktion verwenden.Es geht nur darum, dass das Programm beschäftigt ist. Du könntest genauso gut 2 Zahlen addieren oder die Quadrate von 1-10 berechnen lassen.
Diese Funktion kann man auch auf UNIX Systemen verwenden!
mfg CSS
-
OK, hast mich mit der Anrede überzeugt
Finde die Lösung mit system("pause"); auch nicht schlecht aber wenn die nicht überall läuft, werd ich den PC wohl rechnen lassen
Vielen Dank für deine Hilfe!!
MfG, Alex
-
-
@s
Danke
-
Das mit dem Rechnen lassen finde ich keine gute Idee. Während ich auf meinem 433Mhz-Rechner dann ein paar Minuten warten darf, weil Deine Schleife für nen 1,4Ghz-Rechner gebaut ist, merkt jemand anders mit nem schicken neuen P4 vielleicht garnichts von der Schleife. Wenn der Compiler merkt, daß nix davon jemals verwendet wird, dann optimiert er Dir die Schleife vielleicht sogar weg. Dann lieber mit cin.get() warten.
MfG Jester
-
EDIT: wurde schon gesagt.
-
Die beste Lösung wäre es wenn eine Schleife implementiert die eine bestimmte Zeit wartet so was in der Art:
#include <ctime> ..... int wait; clock_t start; wait = 3*CLOCKS_PER_SEC; start = clock(); while(clock() < start + wait) ;
Diese Schleife wartet genau 3 Sekunden und ist System unabhängig!!
mfg CSS
PS: Wieso steht da 11 mal bearbeitet, hab ich doch gar nicht????
-
mit 1. liegst Du falsch. Ich besitze keinen Rechner dieser Leistungsklasse.
und wenn 2. wirklich stimmt. Dann möchte ich nicht wissen wie lange ich darauf warten müßte... Und was ist in 10 Jahren? Da kannste sowas auch wegwerfen. Deshalb immer so schreiben, daß es auf jedem Rechner funktioniert. Hier gibt's dabei ne gewisse Auswahl.a) Entweder, man legt sich auf ne Plattform fest, dann bietet einem das Betriebssystem normalerweise ne Möglichkeit. Vorteil: Das Betriebssystem weiß, daß man nur warten möchte und man verbraucht keine Rechenzeit.
Oder b) mann nimmt sich die Funktionen aus <ctime> und schreibt ne Funktion, die so lange die Zeit abfragt und zusammenzählt, bis die gewünschte Wartezeit erreicht ist.
Im Fall b) hat man halt trotzdem Prozessorlast (wie bei Deiner Lösung auch), dafür funktioniert sie aber auch in 10 Jahren noch (und auf meinem Rechner auch).
MfG Jester
edit: Dein Posting sah eben noch anders aus
Genau sowas meinte ich!
-
Wenn man allerdings eine Zufallszahl nimmt ist die Chance des Computer gleich 1:100 das er gewinnt.
Wie bekommt man eine Möglichkeit das er nicht immer gewinnt, verwendet man %4 gewinnt man nur wenn man immer drei nimmt.
Gibt es eine Möglichkeit das der Rechner manchmal gezielt versagt???
-
nichts leichter als das: der rechner rechnet weiterhin was er optimal
nehmen sollte und per zufall nimmt er eine andere zulässige lösung.
bei 1 bis 3 hölzchen gibt es doch immer drei lösungsmöglichkeiten oder?mfg f.-th.