WORT-SPIEL



  • Hallo,
    zwischendurch hab ich mal versucht, ein kleines Spielchen zu programmieren. Eigentlich klappt auch alles ganz gut, doch vieles könnte man noch vereinfachen und für manche Probleme finde ich auch keine Lösung dafür.
    Nur mal vorweg: Der "goto-Befehl" am Ende war, ach wie soll ich's sagen...ääähm.....eine Art Notlösung. Ich hab mir schon gedacht, daraus ne "do-while-Schleife" zu machen. Wie auch immer, schaut euch doch mal den Code an:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	string wort, loesungswort;
    	char buchstabe, jn, jn_2;
    	char a = 'J';
    
    	while(a == 'J' || a == 'j')
    	{
    	cout << "\t\t\t***** WORT-SPIEL ***** \n\n" <<endl;
    	cout << "SPIELER 1: " <<endl
    		 << "Geben Sie ein Wort in Grossbuchstaben ein mit " <<endl
    		 << "maximal 10 Buchstaben." <<endl<<endl;
    	cin  >>wort;                                                             //FRAGE 1
    	cout << "\a\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" <<endl;       //FRAGE 4
    	cout << "SPIELER 2:" <<endl
    		 << "Das Wort enthaelt " <<wort.length() << " Buchstaben. " <<endl
    		 << "Sie haben jetzt 10 Versuche, einzelne Buchstaben " <<endl
    		 << "zu raten, um damit das Loesungswort zu finden.\n\n " <<endl;
    
    		for(int i=1 ; i <= 10 ; ++i)
    		{
    		cout <<i << ". VERSUCH: " ;
    		cin  >>a;
    		buchstabe = toupper(a);
    
    		if(buchstabe == wort[0])
    			cout << "\t\t\tDas ist der 1. Buchstabe im Wort!!!" <<endl;
    		if(buchstabe == wort[1])
    			cout << "\t\t\tDas ist der 2. Buchstabe im Wort!!!" <<endl;
    		if(buchstabe == wort[2])
    			cout << "\t\t\tDas ist der 3. Buchstabe im Wort!!!" <<endl;
    		if(buchstabe == wort[3])
    			cout << "\t\t\tDas ist der 4. Buchstabe im Wort!!!" <<endl;
    		if(buchstabe == wort[4])
    			cout << "\t\t\tDas ist der 5. Buchstabe im Wort!!!" <<endl;
    		if(buchstabe == wort[5])
    			cout << "\t\t\tDas ist der 6. Buchstabe im Wort!!!" <<endl;
    		if(buchstabe == wort[6])
    			cout << "\t\t\tDas ist der 7. Buchstabe im Wort!!!" <<endl;
    		if(buchstabe == wort[7])
    			cout << "\t\t\tDas ist der 8. Buchstabe im Wort!!!" <<endl;
    		if(buchstabe == wort[8])
    			cout << "\t\t\tDas ist der 9. Buchstabe im Wort!!!" <<endl;
    		if(buchstabe == wort[9])
    			cout << "\t\t\tDas ist der 10. Buchstabe im Wort!!!" <<endl;
    		if(buchstabe != wort[0] && buchstabe != wort[1] && buchstabe != wort[2] && buchstabe != wort[3]  && buchstabe != wort[4] && buchstabe != wort[5] && buchstabe != wort[6] && buchstabe != wort[7] && buchstabe != wort[8] && buchstabe != wort[9])    //FRAGE 2
    			cout << "\t\t\tDas war der falsche Buchstabe!!!" <<endl;
    
    		cin.sync();
    		cin.clear();
    		}
    	cout << "\a\nLoesungswort in Grossbuchstaben eingeben: ";
    	cin >>loesungswort;
    	if(loesungswort == wort)
    		cout << "\n\nSIE HABEN GEWONNEN!!!" <<endl;
    	else
    		cout << "\n\nL O O S E R\tDas Loesungswort lautet: " <<wort <<endl;
    
    	cin.sync();
    	cin.clear();
    wiederholen:	
    	cout << "\n\nWollen Sie das Spiel wiederholen <J/N> ";
    	cin >> jn;
    	jn_2 = toupper(jn);
    	if( jn_2 == 'J')
    		a = 'J';
    	else if (jn_2 == 'N') 
    		a = 'N';
    	else
    	{	cout <<"\nDas war nicht der entsprechende Buchstabe!!!" <<endl<<endl;
    	    goto wiederholen;        //FRAGE 3
    	}
    	cout << "\a\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" <<endl;
    	}
    
    	return 0;
    }
    

    Für die Fragen wird im Quellcode die passende Stelle markiet:

    FRAGE 1: Wie kann ich einen eingelesenen String komplett in Großbuchstaben umwandeln???
    FRAGE 2: Wie kann ich das vereinfachen??? (diese if-Anweisung soll eine Meldung ausgeben, wenn keiner der Buchstaben im Wort zutrifft)
    FRAGE 3: Wie vermeide ich den "goto-Befehl" und mache daraus eine "do-while-Schleife"???
    FRAGE 4: Wie kann ich den kompletten Bildschirm löschen, sodass der 2. Spieler das vom ersten Spieler eingegebene Wort nicht sehen kann???

    ZUM PROGRAMM:
    Der erste Spieler gibt ein Wort ein und der 2. Spieler muss innerhalb von 10 Versuchen einzelne Buchstaben zu raten, um damit auf das Lösungswort zu kommen.

    Es wäre nett, wenn ihr mir weiterhelfen könntet.
    Testet das Programm doch mal, vielleicht gefällts euch???
    Schreibt doch, was ihr besser machen würdet oder wie man es erweitern kann.

    Übrigens bin ich Anfänger und schon die Funktionalität und, dass das Programm überhaupt läuft, macht mich stolz und glücklich.

    Ciao...
    euer zocker001 🙂 🙂 🙂



  • Hi!

    Erstmal reicht 1 Thread.
    Frage 1: Benutze die Suchfunktion, wurde bereits des öfteren behandelt
    Frage 2:
    Es einfacher eine Schleife zu benutzen statt 10-if-Anweisungen. Ich habe mal eine Variable eingebaut, die den Status enthält. Gefunden oder nicht gefunden. Wenn nicht gefunden und die Schleife ist zu Ende dann wird die Fehlermeldung ausgegeben. Die Variable wortlaenge lege ich nur an um Zeit zu sparen, damit nicht nach jedem Schleifenaufruf die Funktion length() aufgerufen werden muss:

    size_t wortlaenge = wort.length();
    bool gefunden = false; // false==buchstabe nicht gefunden, ansonsten true
    for(int j=0; j<wortlaenge; ++j) // jeden Buchstaben pruefen
      if(buchstabe == wort[i]) {
        cout << "\t\t\tDas ist der " << j+1 << ". Buchstabe im Wort!!!" << endl;
        gefunden = true; // buchstaben gefunden
      }
    
    if(!gefunden) // wenn Buchstabe nicht gefunden wurde im Wort -> Fehlermeldung
      cout << "\t\t\tDas war der falsche Buchstabe!!!" <<endl;
    

    Frage 3:
    Ganz einfach. Hau die if-Anweisungen raus. Frage solange bis J oder N eingegeben wurde, weise danach einfach an a zu. Danach bricht die umklammernde while-Schleife aber oder nicht, je nach Buchstaben. Außerdem kannst du in der Whileschleife das prüfen auf 'j' weglassen, da du eh immer den Großbuchstaben speicherst dun verwendest.

    do {   
      cout << "\n\nWollen Sie das Spiel wiederholen <J/N> ";
      cin >> jn;
      jn_2 = toupper(jn);
    } while(jn_2!='N' && jn_2!='J')
    a = jn_2;
    

    Frage 4:
    Entweder gibst du 25 Leerzeilen aus, wobei man ja scrollen kann. Da du das denke ich nicht willst musst du den Bildschrim löschen und das geht nur Systemabhängig. Aber du könntest in Windows einfach den Befehl cls aufrufen:

    system("cls");
    

    Code-Hacker



  • Hallo erstmal,
    also da bin ich ratlos...das ist ja nun seltsam.
    Gestern wolt ich den Threat schreiben, doch beim Absenden hat nichts mehr funktioniert. Also hab ich versucht, nochmals neu ins Internet zu gehen und es nochmals versucht. Wieder vergeblich. Dann hatte ich auch noch Probleme, ins Forum zu gelangern...alles wie verhext. Was ich allerdings nich wusst, dass
    dann der Bericht doch noch im Forum landet (und das mehrmals 😡 ,sorry).
    Ich wollt es dann heute nochmals versuchen, als es dann zu spät war...

    Wie kann ich die restlichen Threat's im Forum löschen???

    Danke nochmalst für die Antworten...
    Ciao, euer zocker001 🙂



  • CodeHacker:

    Naja da könnte er ja auch gleich die WinAPI nutzen anstatt system("CLS");

    oder z.B.

    for(unsigned int i = 0; i < 30; i++) 
             cout << endl;
    

    machen. Das würde dann sogar unter jedem OS funktionieren auf dem C++ & STL läuft.

    MfG



  • Also die Antwort auf die Frage 4 hab ich nicht verstanden. Wie kann man in der Konsole scrollen. Ich kann den Bildschirm nur mit den Tasten steuern...
    Reicht es einfach, wenn ich

    system("cls");
    

    schreibe und dann ist der Bildschirm gelöscht???

    zocker001 🙂 🙂 🙂



  • Hi!

    @eViLiSSiMo:
    Habe natürlich auch an die WinAPI gedacht. Aber da ich nicht mehr wusste wie habe ich die Lösung genommen die mir sofort einfiel. Aber andere Lösungen findet man im Forum zu genüge.

    @zocker1:
    Ja, das ist der Kommandozeilenbefehel zum löschen der Konsole. Die Lösung die eViLiSSiMo noch gegeben hat, hatte ich auch beschrieben, allerdings ist dabei der nachteil das man sich die alte Ausgabe immer noch Anzeigen lassen könnte, wenn man wieder hochscrollt.

    Code-Hacker



  • Es gibt x Threads darüber warum system("CLS") grauslich ist, bitte einfach mal danach suchen.
    (Und das goto ist wirklich unnötig, do while oä wäre besser.)



  • Hallo,
    ich verstehe immer noch nicht, wie man in der Konsole scrollen (mit der Maus???)kann.

    Habe hier nochmal eine FRAGE:
    Warum werden die case-Marken in der switch-Anweisung nocht als Konstante
    gelesen. Ich habe doch das Wort dem string schon überbracht.

    int main()
    {
         string wort = "APFEL";
         char buchstabe, a;
    
         cout << "Geben sie einen Buchstaben ein: ";
         cin >> buchstabe;
         a = toupper(buchstabe);
         switch(a)
         {
            case wort[0]: 
                    cout << "Das war der 1. Buchstabe!!!" <<endl;
            case wort[1]:
                    cout << "Das war der 2. Buchstabe!!!" <<endl;
            ....
            ....
            ....
            default:
                    cout << "Das war der falsche Buchstabe!!!" <<endl;
          }
          ......
          ......
          ......
    

    zocker001 🙂 🙂 🙂



  • Naja, es ist eben keine Konstante. Theoretisch könnte operator[] von string einen Wert zurückgeben, der nicht zur Compilezeit ermittelt werden kann.



  • Hi!

    Wieso benutzt du switch-case-Verteiler? Das ist hier viel zu umständlich (gesetz dem Fall es würde funktionieren), immerhin gibst du immer den selben Text aus, nur mit einer anderen Zahl (1., 2., 3. ...). Macht o.g. Schleife von mir doch wunderbar, ist kürzer und übersichtlicher.

    Wenn du nur ein kleines Konsolenfenster geöffnet hast, kannst du daran scrollen. Falls du das im Programm vor hast, so gab es bereits mehrere Vorschläge. Ansonsten benutze die Suchfunktion.

    Code-Hacker



  • zum glück kann man auf diese fragen 3mal antworten 🤡 😃



  • Die switch-Anweisung hatte ich als erste Idee, doch als dies nich funktionierte,
    habe ich das Programm umgeschrienben. Ich wollt halt nur mal wissen, warum
    das mit der switch-Anweisung nicht klappt.

    Das mit den 3 Threat's war keine Absicht (grrrr)!!! 🙂

    Ciao
    zocker001 😉



  • Hi,
    Was zum Spiel: Es ist vielleicht besser, die richtig geratenen Buchstaben im Kontext anzuzeigen, also z.B. bei Hello World => H_llo _o_l_.



  • Hi

    Nur eine kleine Randbemerkung zu deinem Prog:
    Der Übersichtlichkeit halber würd ich die Variablen erst deklarieren wenn du sie auch wirklich brauchst.

    cu



  • Das mit der Anzeige hab ich mir auch schon überlegt. Sonst hab ich immer ein Blatt Papier zu Hilfe genommen, aber es ist jetzt die Aufgabe, dieses durch den Computer zu ersetzten...
    Aber wie macht man sowas???? Werd wohl in nächster Zeit etwas rumprobieren müssen!!!

    Ciao...mfg
    zocker001
    😉



  • Ganz einfach. Da du weißt, welcher Buchstabe an welcher Stelle steht, kannst du nach jeder Eingabe checken, welcher Buchstabe denn schon geraten wurde. Diese zeigst du normal an, für alle anderen schreibst du ein '_' literal.



  • 😡 😡 😡 😡 😡
    Was mach ich denn zur Zeit für einen Mist.
    Erst das mit dem dreifachen Threat und jetzt gebe ich mich auch noch unregistriert mit "ansi" aus.

    Zur Erklärung: ansi == zocker001

    zocker001 🙂


Anmelden zum Antworten