Problem mit Hangman



  • Hallo Leute,

    ich habe ein mächtiges Problem. Ich bin eine totale C++-Anfängerin und soll jetzt ein Hangman-Spiel programmieren 😞 eigentlich wollte unser Lehrer was ganz einfaches nehmen, aber irgendsoein Trottel hat das vorgeschlagen.
    Wir sollen das ganze nur über char lösen und dürfen keine strings verwenden (was nichts macht, wir haben beides noch nicht in der Schule -.-).
    Ein Bekannter von mir hat jetzt versucht mir zu helfen, und es klappt auch halbwegs, allerdings benutzt es jetzt strings und manche Funktionen gehen noch nicht so wie sie sollen.
    Könnte vielleicht einer von euch Profis das mal anschauen und mir evtl Hilfestellung geben? 🙂 Ich bin sonst echt am Po 😞

    Ich poste einfach mal den Code:

    main.cpp

    #include <iostream>
    #include <iomanip>
    #include "tools.h"
    #include <string>
    
    using namespace std;
    
    void main()
    {
    	locale::global(locale("German_germany"));		
    
    	int Eingabe;
    
    	do
    	{
    		do
    			{	
    				system("cls");
    
    				Hauptmenue();
    
    				cin.clear();						//Flag wegmachen ("Fahne runter")	
    				cin.sync();							//Tastatureingabe löschen, um neue Eingabe machen zu können
    
    				cin >> Eingabe;
    
    				if (cin.fail())
    					{
    					cout << endl
    						 << setw(8) << setfill(' ') << " " << "Bitte eine Zahl eingeben!\n\n"
    						 << setw(8) << setfill(' ') << " ";
    					system("pause");
    					}
    
    			}
    			while (cin.fail());
    
    				switch ( Eingabe )
    				{
    					case 1 :
    						Spiel();
    							break;
    
    					case 2 :
    						Anleitung();
    							break;
    
    					case 0 :
    						return;
    							break;
    
    					default :
    						cout << endl 
    							 << setw(8) << setfill(' ') << " " <<"Falsche Eingabe!\n\n"
    							 << setw(8) << setfill(' ') << " ";
    							break;
    				}
    
    		system ("pause > nul");
    
    	}
    
    	while ( Eingabe != 0 );
    }
    

    tools.h

    void Hauptmenue();
    void Spiel();
    void Anleitung();
    

    tools.cpp

    #include <iostream>
    #include <iomanip>
    #include <wchar.h>
    #include <ctype.h>
    #include <string>
    
    using namespace std;
    
    void Hauptmenue()
    {
    	cout << endl << endl << endl << endl
    		 << setw(15) << setfill(' ') << "HANGMAN"
    		 << endl << endl
    		 << setw(26) << setfill(' ') << "1 .. Spiel starten" << endl
    		 << setw(22) << setfill(' ') << "2 .. Anleitung" << endl
    	 	 << setw(20) << setfill(' ') << "0 .. Beenden"<< endl << endl
    	     << setw(20) << setfill(' ') << "Deine Wahl: "; 
    }
    
    void Spiel()
    {
    	system("cls");
    
    	bool gewonnen = true;
    	char Suchwort[15+1];
    	char Ratewort[30+1];
    	char Buchstabe[15+1];
    	char fBuchstabe[30];
    	int Anzahl_Zeichen = 0;
    	int counter = 0;
    	int Leerzeichen = 0;
    	int counter2 = 0;
    	int Spielzug = 1;
    	int Falsch = 0;
    	int Fehlversuche = 10;
    	int Eingabe = 0;
    	int Unterstrich = 0;
    
    	cout << endl << endl << endl << endl
    		 << setw(15) << setfill(' ') << "HANGMAN" << endl << endl
    		 << setw(8) << setfill(' ') << " " << "Bitte einen Begriff (max. 15 Zeichen) eingeben:" << endl
    		 << setw(10) << setfill(' ') << "> ";
    
    	cin >> Suchwort;
    
    	for(counter = 0; counter <= 15; counter++)
    	{
    		Suchwort[counter] = toupper(Suchwort[counter]);				//Klein- in Großbuchstaben konvertieren
    
    		if (Suchwort[counter] == '\0')								//Liest wie lang das eingegebene Wort ist
    		{
    			Anzahl_Zeichen = counter;
    		}
    
    	}
    
    	for(counter2 = 0; counter2 <= ((Anzahl_Zeichen * 2)+1); counter2++)
    	{
    		Leerzeichen = counter2 - 1;
    		if(counter2 == 0)
    		{
    			Ratewort[counter2] = Suchwort[counter2];	
    			counter2++;
    		}
    		else if(counter2 == (Anzahl_Zeichen * 2))
    		{
    			Ratewort[Leerzeichen] = ' ';
    			Ratewort[counter2] = '\0';
    			counter2++;
    		}
    		else
    		{
    			Ratewort[counter2] = '_';
    			if (Leerzeichen > 0)
    			{
    				Ratewort[Leerzeichen] = ' ';
    			}
    			counter2++;
    		}
    
    	}
    
    	system("cls");
    
    	do
    	{
    		cout << "\t\t\t Spielzüge: "<< Spielzug << " - noch " << (Fehlversuche - Falsch) << " Fehlversuche erlaubt !";
    		cout << endl << endl << endl << endl << setw(15) << setfill(' ') << "HANGMAN" << endl << endl;
    		cout << "\t" << Ratewort  << "\t ("<< Anzahl_Zeichen << " Zeichen)" << endl<< endl;
    		cout << setw(8) << setfill(' ') << " " << "Bitte einen Buchstaben [A..Z, Ä, Ö, Ü] oder die Auflösung eingeben:" << endl <<endl;
    
    		cout << "\t" << "> ";
    		cin >> Buchstabe;
    
    		for(int j = 0; j <= 15; j++)
    		{
    			Buchstabe[j] = toupper(Buchstabe[j]);
    		}
    
    		for(int i = 0; i <= Anzahl_Zeichen; i++)
    		{
    			if(Buchstabe[0] == Suchwort[i])
    			{
    				Ratewort[i*2] = Buchstabe[0];
    				Eingabe = Eingabe + 1;
    			}
    			if(Ratewort[i*2] == '_')
    			{
    				Unterstrich++;
    			}
    		}
    
    		if(Unterstrich == 0)
    		{
    			system("cls");
    			cout << "\t\t\t Spielzüge: "<< Spielzug << " - noch " << (Fehlversuche - Falsch) << " Fehlversuche erlaubt !";
    			cout << endl << endl << endl << endl << setw(15) << setfill(' ') << "HANGMAN" << endl << endl;
    			cout << "\t" << Ratewort  << "\t ("<< Anzahl_Zeichen << " Zeichen)" << endl<< endl;
    			cout << setw(8) << setfill(' ') << " " << "Bitte einen Buchstaben [A..Z, Ä, Ö, Ü] oder die Auflösung eingeben:" << endl << endl;
    			cout << "\t"  << "> ";
    			gewonnen = false;
    		}
    
    		if(Buchstabe[1] != '\0')					//Eingabe des Lösungswortes
    		{
    			string Loesung, Richtig;
    			Loesung = Buchstabe;
    			Richtig = Suchwort;
    
    			if(Loesung == Richtig)
    			{
    				for(int i = 1; i <= Anzahl_Zeichen; i++)
    				{
    					Ratewort[i*2] = Buchstabe[i];
    				}
    				Eingabe = Eingabe + 1;
    
    				system("cls");
    				cout << "\t\t\t Spielzüge: "<< Spielzug << " - noch " << (Fehlversuche - Falsch) << " Fehlversuche erlaubt !";
    				cout << endl << endl << endl << endl << setw(15) << setfill(' ') << "HANGMAN" << endl << endl;
    				cout << "\t" << Ratewort  << "\t ("<< Anzahl_Zeichen << " Zeichen)" << endl<< endl;
    				cout << setw(8) << setfill(' ') << " " << "Bitte einen Buchstaben [A..Z, Ä, Ö, Ü] oder die Auflösung eingeben:" << endl <<endl;
    				cout << "\t" << "> ";
    				gewonnen = false;
    			}
    		}
    
    		if (Eingabe == 0)
    		{
    			Falsch = Falsch + 1;
    		}
    		else
    		{
    			Eingabe = 0;
    		}
    
    		Spielzug = Spielzug + 1;
    
    		if (gewonnen == true)
    		{
    			Unterstrich = 0;
    			system("cls");
    		}
    
    	}
    	while( gewonnen );
    
    	cout << endl << endl;
    	cout << "\tSUPER!!!" << endl;
    	cout << "\tDu hast den Begriff" << endl << endl;
    	cout << "\t" << Suchwort << endl << endl;
    	cout << "\tin " << Spielzug-1 << " Runden richtig erraten!" << endl;
    	cout << "\t(Bitte eine Taste drücken)";
    
    	if (Falsch > 10)
    	{
    		cout << "Verloren";
    	}
    }
    
    void Anleitung()
    {
    	system("cls");
    
    	cout << endl << endl << endl << endl
    		 << setw(15) << setfill(' ') << "HANGMAN" << endl << endl
    		 << setw(8) << setfill(' ') << " " << "Hangman ist ein Ratespiel für zwei Spieler." << endl
    		 << setw(8) << setfill(' ') << " " << "Spieler 1 gibt ein Wort mit bis zu 15 Buchstaben ein." << endl
    		 << setw(8) << setfill(' ') << " " << "Spieler 2 muss durch Eingabe einzelner Buchstaben oder" << endl 
    		 << setw(8) << setfill(' ') << " " << "eines Wortes erraten, welches Wort Spieler 1 eingegeben hat." << endl
    		 << setw(8) << setfill(' ') << " " << "Gibt er einen richtigen Buchstaben ein, erscheint dieser " << endl
    		 << setw(8) << setfill(' ') << " " << "an der richtigen Stelle im Lösungswort." << endl
    		 << setw(8) << setfill(' ') << " " << "Gibt Spieler 2 10mal einen falschen Buchstaben oder " << endl
    		 << setw(8) << setfill(' ') << " " << "Wort ein, so hat er verloren." << endl << endl
    		 << setw(8) << setfill(' ') << " ";	 
    }
    

    Ich muss irgenwie hingekommen, dass das ganze ohne String läuft.
    Außerdem darf das Wort, das erraten werden soll, keine Zahlen enthalten.
    Und wenn man ein komplettes Wort eingibt, dann erkennt das Programm nicht wenn es falsch war, sondern zählt nur die Spielrunde hoch.

    Ich wäre wirklich für jedes Fitzelchen an Hilfestellung überglücklich 🙂
    Danke schonmal im voraus,
    Nicci


  • Mod

    Wenn du dem Lehrer eins auswischen möchtest, dann programmierst du so etwas wie std::string nach. Muss ja keine effiziente Implementierung sein, bloß die angenehmen Seiten von std::string gegenüber char-Arrays sollten drin sein: Automatische Speicherverwaltung, keine Nullterminierung, Kopiersemantik.

    Traust du dir das zu? Stichworte, die du dazu schon einmal gehört haben solltest (oder spätestens jetzt nachschlägst): RAII, Regel der großen Drei.

    Falls dir das zu hoch ist, wirst du wohl leider der Aufgabenstellung folgen müssen und von Hand mit den char-Arrays arbeiten.


Anmelden zum Antworten