C++ Hangman 2 Spieler Modus (Fragen zur Umsetzung)



  • Hallo zusammen, ich bin das erste mal hier im Forum. Ich habe mich angemeldet weil ich vor kurzem mit der Programmiersprache C++ angefangen habe und nun mein erstes Spiel (Hangman (Galgenmaennchen) mit den bisher gelernten Mittel Programmieren möchte.

    Für den Singleplayer Modus habe ich bereits eine fertige Version. Dabei müssen dann einige vorgegebene Suchbegriffe (die per Zufallszahl ausgewählt werden) vom Spieler erraten werden. Diese Version ist aber sehr statisch, da die länge der Strings ja bereits bekannt ist und ich deshalb auch wusste wie oft ein Buchstabe im Wort vorkommt und an welche Stelle des Wortes er muss.

    Nun möchte ich gerne einen 2 Spieler Modus machen, wobei ich mir das so vorstelle, das ein Spieler einen Suchbegriff eingeben soll. Und der andere Spieler muss diesen dann erraten.

    Dabei habe ich bisher folgenden Ansatz verfolgt. Ich habe das Array [b]char worteingabe[20];[\b] definiert. An dieser Stelle wird von Spieler 1 das Wort eingegeben das Spieler 2 dann erraten muss.

    Mit [b]int l = strlen(worteingabe);[\b] wird die Anzahl der Buchstaben, des Wortes Ermittelt das Spieler 1 eingegeben hat, ermittelt.

    Bei diesem Spiel geht es ja um das Vergleichen von Strings. Aber es werden ja nicht gleich 2 ganze Wörter miteinander verglichen sondern, ein Wort wird von einem Spieler eingegeben und es muss ja nach jedem Buchstaben den Spieler 2 eingibt gesucht werden ob der Buchstabe in den Wort vorkommt, wie oft er vorkommt und an welcher Stelle des wortes er muss. Wie lässt sich das lösen?

    Mit der Funktion [b]strncmp()[\b] kann man soweit ich weiss nur 2 ganze strings mit einander vergleichen. Das ist aber nicht das was ich will. Es muss ja nach jedem Buchstaben geguckt werden.

    Ich bin für jede Hilfestellung dankbar.

    Gruß

    4enima


  • Mod

    4enima schrieb:

    Für den Singleplayer Modus habe ich bereits eine fertige Version. Dabei müssen dann einige vorgegebene Suchbegriffe (die per Zufallszahl ausgewählt werden) vom Spieler erraten werden. Diese Version ist aber sehr statisch, da die länge der Strings ja bereits bekannt ist und ich deshalb auch wusste wie oft ein Buchstabe im Wort vorkommt und an welche Stelle des Wortes er muss.

    mag sein dass diese beschreibung fuer dich logisch klingt, da ich aber deine implementierung nicht kenne, kommt mir das etwas spanisch vor. du darfst hier ruhig code posten, um zu verdeutlichen was du erreichen willst.

    Nun möchte ich gerne einen 2 Spieler Modus machen, wobei ich mir das so vorstelle, das ein Spieler einen Suchbegriff eingeben soll. Und der andere Spieler muss diesen dann erraten.

    waere es nicht einfacher wenn du sehr viel mehr woerter in ein woerterbuch (also eine txt datei) eintragen wuerdest?

    Bei diesem Spiel geht es ja um das Vergleichen von Strings. Aber es werden ja nicht gleich 2 ganze Wörter miteinander verglichen sondern, ein Wort wird von einem Spieler eingegeben und es muss ja nach jedem Buchstaben den Spieler 2 eingibt gesucht werden ob der Buchstabe in den Wort vorkommt, wie oft er vorkommt und an welcher Stelle des wortes er muss. Wie lässt sich das lösen?

    indem du buchstaben fuer buchstaben vergleichst, bzw das char array durchgehst und mit dem eingegebenem buchstaben eintrag fuer eingrag vergleichst.
    (du weisst doch wie arrays funktionieren, oder?)

    Mit der Funktion [b]strncmp()[\b] kann man soweit ich weiss nur 2 ganze strings mit einander vergleichen. Das ist aber nicht das was ich will. Es muss ja nach jedem Buchstaben geguckt werden.

    schreib dir am besten eine eigene funktion, ist vielleicht eine kleine, neue herausforderung beim lernen 😉



  • Wenn du C++ programmierst, rate ich dir, auch dessen Möglichkeiten zu nutzen. In der C++-Standardbibliothek gibt es die Klasse std::string , die viel einfacher und sicherer als char -Arrays zu handhaben ist. Zum Beispiel bist du da nicht auf eine fixe Länge eingeschränkt und kannst mit operator== auf Gleichheit prüfen.

    char -Arrays sind ein Relikt von C. Das heisst nicht, dass man sie in C++ nicht braucht, aber gerade als Anfänger kann man sich ohne sie einigen Ärger ersparen. Du wirst später sicher noch genügend Gelegenheit haben, dich mit ihnen auseinanderzusetzen.



  • Hallo rapso.

    Du hast recht ich hätte ruhig mal mehr code Posten können. Danke du dir die zeit genommen hast. 🙂
    Ich will dieses Problem unbedingt lösen.(lernen ^^)

    Also für den Singleplayer haben ich folgendes gemacht um zu vergleichen.
    char wort1[] = "HAUSTUER"; // ist das zu eratende wort.

    Dann habe ich ein weiteres Array definiert.

    // Striche für die fehlenden Buchstaben
    char sA1[11];
    sA1[0] = '_';
    sA1[1] = '_';
    sA1[2] = '_';
    sA1[3] = '_';
    sA1[4] = '_';
    sA1[5] = '_';
    sA1[6] = '_';
    sA1[7] = '_';
    
    // Abfrage ob der Buchstabe im Wort enthalten ist
    switch(eingabe)
                     {
                              case 'H': { sA1[0]=wort1[0] ;
                                          ++ab;}
                                     break;
                              case 'A': { sA1[1]=wort1[1] ;
                                          ++ab;}
                                      break;
                              case 'U': { sA1[2]=wort1[2] ;
                                          sA1[5]=wort1[5] ;
                                          ++ab;}
                                     break;
                              case 'S': { sA1[3]=wort1[3] ;
                                          ++ab;}
                                      break;
                              case 'T': { sA1[4]=wort1[4] ;
                                          ++ab;}
                                      break;
                              case 'E': {sA1[6]=wort1[6] ;
                                          ++ab;}
                                      break;
                              case 'R': {sA1[7]=wort1[7] ;
                                          ++ab;}
                                      break;                    
    
                              default:  ++x;
                              }
    

    Die Variable ab zählt in diesem Fall die Anzahl der richtigen Eingaben.
    In diesem Fall ist es so das wenn ab den wert 7 (das wort haustuer hat zwar 8 buchstaben aber das U kommt doppelt vor) erreicht, dann erscheint die Ausgabe , das der Spieler das Wort richtig erraten hat. Für jeden Fehlversuch allerding wird x um eins nach oben gezählt. Erreicht x den Wert 7, ist das Spiel verloren.

    Hier der Code dazu:

    }while(x<7 && ab<7);
    // wenn das Wort erraten wurde
    if (ab==7)
    {
              cout <<"   |--------------------------| "<< endl;  
              cout <<"   |     Sie haben das        | "<< endl;
              cout <<"   |     Wort erraten         | " << endl;
              cout <<"   |--------------------------| "<< endl;
              }
    // wenn das Wort nicht erraten wurde
    if (x==7)
    {
              cout <<"   |--------------------------| "<< endl;  
              cout <<"   |   Sie haben das          | "<< endl;
              cout <<"   |   Wort nicht erraten     | " << endl;
              cout <<"   |--------------------------| "<< endl;
             }
    

    Das meinte ich nun mit sehr statisch. Der ganze Programmcode ist auf größe der Arrays und deren genauen Inhalt(Buchstaben) zugeschnitten.

    Da ich nun aber was machen will, wo jemand sich das zu erraten wort aussuchen kann und dann dynamich geguckt werden muss, wie groß ist das array, wie viele zeichen hat das wort, wo und an welcher stelle stehen die buchstaben, habe ich ein Problem.

    Mein Ansatz um den Multiplayer Modus zu realisieren sieht bisher wie folgt aus.

    int main()
    {
    
    cout << "Bitte Wort eingeben: " << endl;
    char test[30];
    cin >> test;    
    
    int l = strlen(test); // ermittelt die länge des Strings
    
    /* Gibt für jeden Buchstaben des Wortes einen Unterstrich und ein Leerzeichen aus, damit der ratende Spieler weiss wieviele Buchstaben das Wort hat. Das Leerzeichen wird Ausgegeben damit man einzelne unterstriche auch als solche erkennen kann
    */
    
    for(int j = 0; j < l; j ++)
     {
       cout << "_";
       cout << " ";      
     }
    

    Das Problem das ich nun habe ist. Das ich nicht weiss wie ich nun einen einzelnen Buchstaben mit einem ganzen Wort vergleichen kann um herauszufinden, dass er in dem Wort enthalten ist und an welche Stelle er gehört.

    Ich kenne bisher nur eine funktion die ganze strings miteinander vergleichen kann und das ist.

    // Funktion gibt den Wert 0 zurück wenn die Strings gleich sind
    if(strcmp(test,eingabe) !=0)
    {
        cout << "strings sind nicht gleich!!!!" << endl;              
    }
    else
    {
       cout << "strings sind gleich!!" << endl;
    

    Aber wir Stellt man das an das man nach jeder eingabe eines einzigen Buchstaben, mit dem ratebegriff vergleicht?? 😕

    Zu deienr Frage: " Ich weiss schon wie ich ein array erstellen kann und wie man es füllt. Wie man jedoch bei einem Array vergleiche zieht ohne vorher (beim Programmieren) zu wissen wie genau das Wort aussieht, weiss ich leider noch nicht.

    Ich hoffe du verstehst nun besser was ich meine. bei Rückfragen werde ich gerne noch präziser. Nochmals vielen Dank für deine Hilfe.

    @ Nexus

    Ich bin wie gesagt noch totaler Anfänger was das Programmieren mit C++ angeht, und kenne mich deshalb mit der Klasse "string" noch nicht aus. Ich würde aber gerne einen Ansatz damit versuchen wenn der funktioniert. 🙂


Anmelden zum Antworten