Brauche Hilfe bei Galgenmännchen C++!



  • Hallo zusammen,
    Bin gerade dabei Galgenmännchen zu programmieren. Jetzt habe ich ein Problem,
    ich weiß nicht wie man vergleichen kann, ob der eingegebene Buchstabe in dem zu erratenden Wort vorkommt. Und wenn ja wie man ein _ durch den Buchstaben ersetzt.
    Programmiere in C++.
    Ich hoffe jemand kann mir helfen.

    Freundliche Grüße

    Niklas

    code

    #include <iostream>
    #include <string>
    #include <stdlib.h>
    #include <algorithm>
    #include <vector>
    #include <locale>
    using namespace std;

    string sp1; // Spieler 1
    string sp2; // Spieler 2
    char start='s'; //TAste zum Starten des Spiels
    string wort; //Worrt, das zu erraten ist.
    char buchstabe;
    int i =0;

    int main()
    {
    cout <<"\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ " << endl ;
    cout <<" WILLKOMMEN ZU GALGENMAENNCHEN " << endl;
    cout <<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ " << endl;

    cout <<" ||||||||||||||||||| " << endl;
    cout <<" || || " << endl;
    cout <<" || || " << endl;
    cout <<" || ____ " << endl;
    cout <<" || |X X| " << endl;
    cout <<" || | __ | " << endl;
    cout <<" || || " << endl;
    cout <<" || || || " << endl;
    cout <<" || || || " << endl;
    cout <<" || [][] " << endl;
    cout <<" || | || | " << endl;
    cout <<" || | || | " << endl;
    cout <<" || | || | " << endl;
    cout <<" || [--][--] " << endl;
    cout <<" || " << endl;
    cout <<" || " << endl;
    cout <<" ||
    " << endl;
    cout <<" || || " << endl;
    cout <<" ||
    _____|| " << endl << endl << endl;

    cout <<" Drueck s und Enter, um das Spiel zu starten! "<< endl;
    cout <<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ " << endl;
    cin >> start;

    system("cls");

    while (start != 's')
    {
    system("cls");
    cout << " Falsche Eingabe! " << endl;
    cout << " Drueck s und Enter, um das Spiel zu starten! " << endl;
    cin >> start;

    }

    cout << " Gebt eure Namen ein und bestaetigt sie mit Enter! " << endl;
    cout << " Spieler 1: ";
    cin >> sp1;

    system("cls");

    cout << " Gebt eure Namen ein und bestaetigt sie mit Enter! " << endl;
    cout << " Spieler 2: ";
    cin >> sp2;

    system("cls");

    cout << sp2<<", du musst jetzt weg gucken!"<< endl << endl;
    cout << sp1<< ", gib ein Wort ein! (In Kleinbuchstarben!!!)"<< endl << endl;
    cin >> wort;

    system("cls");

    cout << "OK, jetzt kann "<<sp2<< " das Wort erraten!(In Kleinbuchstaben!!!)" << endl << endl << endl;

    replace(wort.begin(), wort.end(),'a', '');
    replace(wort.begin(), wort.end(),'b', '
    ');
    replace(wort.begin(), wort.end(),'c', '');
    replace(wort.begin(), wort.end(),'d', '
    ');
    replace(wort.begin(), wort.end(),'e', '');
    replace(wort.begin(), wort.end(),'f', '
    ');
    replace(wort.begin(), wort.end(),'g', '');
    replace(wort.begin(), wort.end(),'h', '
    ');
    replace(wort.begin(), wort.end(),'i', '');
    replace(wort.begin(), wort.end(),'j', '
    ');
    replace(wort.begin(), wort.end(),'k', '');
    replace(wort.begin(), wort.end(),'l', '
    ');
    replace(wort.begin(), wort.end(),'m', '');
    replace(wort.begin(), wort.end(),'n', '
    ');
    replace(wort.begin(), wort.end(),'o', '');
    replace(wort.begin(), wort.end(),'p', '
    ');
    replace(wort.begin(), wort.end(),'q', '');
    replace(wort.begin(), wort.end(),'r', '
    ');
    replace(wort.begin(), wort.end(),'s', '');
    replace(wort.begin(), wort.end(),'t', '
    ');
    replace(wort.begin(), wort.end(),'u', '');
    replace(wort.begin(), wort.end(),'v', '
    ');
    replace(wort.begin(), wort.end(),'w', '');
    replace(wort.begin(), wort.end(),'x', '
    ');
    replace(wort.begin(), wort.end(),'y', '');
    replace(wort.begin(), wort.end(),'z', '
    ');
    replace(wort.begin(), wort.end(),'ä', '');
    replace(wort.begin(), wort.end(),'ü', '
    ');
    replace(wort.begin(), wort.end(),'ö', '');
    replace(wort.begin(), wort.end(),'ß', '
    ');

    cout << wort << endl;

    cin >> buchstabe ;

    return 0;

    }



  • Bitte editiere deinen Beitrag nochmal und packe den Code in C++ Code-Tags.

    Du mußt natürlich eine Kopie des Originalwortes erzeugen und nur bei dieser Kopie die Zeichen durch '_' ersetzen.

    Und die replace-Zeilen kannst du durch eine Schleife ersetzen:

    const char chars[] = "abc...xyzäöüß";
    
    for (char c : chars)
      replace(wort.begin(), wort.end(), c, '_');
    

    PS: Falsches Unterforum.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++/CLI mit .NET in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Ob etwas (z.B. ein Buchstabe) in einer ungeordneten Sequenz (z.B. einem Wort) vorkommt, prüft man, indem man die Sequenz von Anfang bis Ende durchgeht und an jeder Stelle guckt, ob es eine Übereinstimmung gibt. Es ist auch sehr wahrscheinlich, dass Klassen für solche Sequenzen (z.B. std::string) so etwas schon fix und fertig anbieten, denn das ist ein häufiges Problem; oder, wenn nicht, dann gibt es bestimmt auch einen fertigen Algorithmus in algorithms dafür. Da muss man halt in einer Referenz gucken. Wahrscheinlich hieße so etwas 'find' oder ähnlich.
    www.cplusplus.com/reference
    en.cppreference.com

    Du machst in deinem Programm einige Dinge krass falsch:
    * Mache Variablen niemals global, außer du hast einen extrem guten Grund dafür (Faulheit oder Unwissen ist kein guter Grund). Mach Variablen so lokal wie es nur irgendwie geht. Das ist sehr effizient bei der Fehlervermeidung und -suche, wohingegen bei globalen Variablen das genaue Gegenteil gilt.
    * Wenn sich eine Zeile Code zweimal (oder gar 30 Mal!) identisch oder nahezu identisch wiederholt, dann ist das ein ganz starkes Zeichen dafür, dass man stattdessen eine Schleife und/oder eine Funktion dafür machen möchte. Dazu gilt ebenfalls das gleiche bezüglich Fehlervermeidung und -suche wie bei den globalen Variablen. Und es ist zudem noch arbeitssparend für faule Programmierer¹. Win-Win!

    ¹: Ein guter Programmierer sollte faul sein, denn die Motivation hinter jedem Programm ist das Vermeiden von Arbeit!



  • Eine andere Lösungsidee: du speicherst
    a) das geheime Wort
    b) ein std::set<char> gerateneBuchstaben; der bereits geratenen Buchstaben.

    Dann gibst du aus:

    for (auto ch : geheimesWort) {
        if (gerateneBuchstaben.count(ch)) 
            cout << ch;
        else
            cout << '_';
    }
    

    oder so ähnlich.



  • Danke für die schnellen Antworten und die Tipps. Werde jetzt versuchen diese anzuwenden.



  • Wie baue ich die Vorschläge in meinen Code ein, stehe gerae ein bisschen auf dem Schlauch.



  • for(int i = 0; i < word.length(); ++i)
        shownString += "_ ";
    shownString.resize(word.length() - 1);
    

    Das erst einmal für die Anzeige.
    Dann immer nach einer Eingabe:

    std::vector<int> pos;
    int currentPos;
    while(true)
    {
        int p = word.find(input, currentPos);
        if(p != std::string::npos)
            pos.push_back(p);
        else
            break;
    }
    
    for(const auto& a : pos)
        shownString.replace(a * 2 - 1, input);
    

    Wie man die Variablen lokal macht, ist dir hoffentlich klar.
    Du solltest außerdem lernen, dass programmieren nachdenken und recherchieren ist.



  • humans_are_no_solution schrieb:

    Du solltest außerdem lernen, dass programmieren nachdenken und recherchieren ist.

    Das setzt dem Ganzen noch die Krone auf 👎 (Initialisieren von shownString umständlich [besser std::string shownString(word.length(), '_');], find liefert size_type [nicht int], currentPos nicht initialisiert [wenn initialisiert worden wäre auch nicht verändert -> Endlosschleife, wenn p gefunden wird], while(true) generell nicht schön, wozu Positionen speichern und nicht direkt ersetzen?, ...)

    Nicht schlecht für 16 Zeilen Code.



  • Was kommt wohl heraus, wenn man dein showString mit meinem showString vergleicht?
    Als Tipp: es ist nicht true.

    Zur einfachen Weiterverarbeitung ist es leichter, int zu nehmen. currentPos muss man natürlich im Fall, dass etwas gefunden wurde, den Wert von p + 1 zuweisen und mit 0 initialisieren.
    Endlosschleifen sind genauso in Ordnung wie normale Schleifen, wenn sie ordentlich unterbrochen werden können.
    Und ja, meinetwegen kann man auch die Positionen sofort ersetzen.

    Meine 16 Zeilen Code waren übrigens deutlich besser als deine. 😉
    Aber ich danke dir trotzdem für deine (teilweise berechtigte) Kritik. Es gibt immer etwas zu verbessern.



  • Danke für die ganzen Antworten und Tipps. Hab das Spiel jetzt fertig bekommen.

    Freundliche Grüße

    Niklas


Log in to reply