Problem beim Spiel Zahlenraten



  • Hallo Zusammen, ich bin neu hier in diesem Forum und auch ein totaler Frischling in Sache C++.
    Ich habe im I net etwas nach C++ gesucht und ein Spiel namens Zahlenraten entdeckt.

    Da überall stand das es ziemlich einfach sei das zu Programmieren wollte ich dies einfach mal versuchen. Doch leider komme ich nicht weiter!

    Ein kurzer überblick, es gibt bei dem Spiel ein Menü, man kann auf die Spielanleitung zugreifen das Spiel Beenden oder natürlich Starten^^
    Bei Starten kann man aber noch auswählen was für eine Schwirigkeit. Also ich hab mir gedacht ich hab 3 Stufen einmal Leicht für eine Zufallszahl zwischen 1 und 99. Bei Mittel zwischen 1 und 250 und Schwer eine Zahl Zwischen 1 und 999.

    Soweit so gut. Jetzt soll wenn ich mich für eine stufe entschienden habe das spiel starten und wenn ich die Zahl nach 14 versuchen oder auch 12 ganz egal nicht erraten habe auf der Konsol erscheinen das man leider verloren hat. Wenn man es schafft natürlich das man Gewonnen hat. Als kleine Hilfe steht immer dabei ob man höher oder niedriger tippen soll.

    Es wäre echt nett wenn mir jemand helfen könnt. Es ist eig nicht wichtig das ich das Spiel programmiere aber jetzt habe ich doch längere Zeit damit verbracht und möchte schon gerne wissen wie es geht^^

    Gruß und danke im Voraus.

    Anbei mein Quellcode.

    #include<conio>
    #include<iostream>
    #include<iomanip>
    using namespace std;
    
    float menue,stufe;
    int l,m,s;
    
    void menu()
    {
    gotoxy(25,7);
    textcolor (4);
    cprintf("***Zahlenraten***");
    cout<<endl;
    
    gotoxy(25,9);
    textcolor(6);
    cprintf("1. Spieregeln");
    cout<<endl;
    
    gotoxy(25,10);
    textcolor(6);
    cprintf("2. Spiel Starten");
    cout<<endl;
    
    gotoxy(25,11);
    textcolor(6);
    cprintf("3. Beenden");
    cout<<endl<<endl;
    
    gotoxy(25,14);
    cout<<"Was moechten Sie tun?"<<endl;
    gotoxy(25,15);
    cin>>menue;
    cout<<endl;
    }
    
    void regeln()
    {
    clrscr();
    gotoxy(30,5);
    textcolor(RED);
    cprintf("**Spielregeln**");
    cout<<endl<<endl;
    
    cout<<"1.Bevor man das Spiel beginnen kann,"<<endl;
    cout<<"muss man einen Schwierigkeit Grad auswaehlen."<<endl;
    cout<<"Es gibt 3 Verschieden Stufen:"<<endl<<endl;
    cout<<"Leicht		=	Eine Zahl Zwischen 1 und 99"<<endl;
    cout<<"Mittel		=	Eine Zahl Zwischen 1 und 250"<<endl;
    cout<<"Schwer	        =	Eine Zahl Zwischen 1 und 999"<<endl<<endl;
    cout<<"2.Nachdem man sich fuer eine Stufe entschieden hat,"<<endl;
    cout<<"kann man das Spiel mit Enter beginnen."<<endl;
    cout<<"3.Die Aufgabe ist es nun, innerhalb von 12 Versuche die Zahl,"<<endl;
    cout<<"die der Computer sich Gemerkt hat zu finden."<<endl;
    cout<<"Als Tipp bekommt man gesagt ob man hoeher oder tiefer raten muss."<<endl;
    cout<<"4.Das Ziel von dem Spiel ist es,"<<endl;
    cout<<"die Richtige Zahl mit so wenig wir moeglich Versuchen zu finden."<<endl;
    cout<<"Schafft man dies nicht, hat man verloren und muss von neuem beginnen."<<endl<<endl;
    
    cout<<"Druecken sie eine beliebige Taste um zum Hauptmenue zurueckzukehren."<<endl;
    getchar();
    getchar();
    clrscr();
    menu();
     }
    
     void schwirigkeit()
    
    {
    clrscr();
    
    int stufe;
    
    gotoxy(25,7);
    cout<<"Mit welcher Schwirigkeitsstufe moechten Sie spielen?"<<endl;
    cout<<endl;
    
    gotoxy(25,9);
    cout<<"Druecken Sie L fuer Leicht."<<endl;
    gotoxy(25,10);
    cout<<"Druecken Sie M fuer Mittel."<<endl;
    gotoxy(25,11);
    cout<<"Druecken Sie S fuer Schwer."<<endl;
    gotoxy(25,14);
    cin>>stufe;
    cout<<endl;
    
    }
    
     void leicht()
    {
    clrscr();
    randomize();
    int x=random(100);
    int i;
    
    do {
    gotoxy(30,5);
    textcolor(10);
    cprintf("Gebe deine Zahl ein");
    gotoxy(30,7);
    cin>>i;
    clrscr();
    
    if(i==x)
    cout<<"Herzlichen Glueckwunsch, du hast gewonnen"<<endl;
    
    if(i>x)
    cout<<"Zu hoch!"<<endl;
    
    if(i<x)
    cout<<"zu nieder!"<<endl;
    
    if(i>99)
    cout<<"Falsche eingabe"<<endl;
    
    getchar();
    }
    
    while (x!=i);
    
    getchar();
    clrscr();
    menu();
    
     }
    
     void mittel()
    
    {
    clrscr();
    randomize();
    int x=random(251);
    int i;
    
    do {
    gotoxy(30,5);
    textcolor(10);
    cprintf("Gebe deine Zahl ein");
    gotoxy(30,7);
    cin>>i;
    clrscr();
    
    if(i==x)
    cout<<"Herzlichen Glueckwunsch, du hast gewonnen"<<endl;
    
    if(i>x)
    cout<<"Zu hoch!"<<endl;
    
    if(i<x)
    cout<<"zu nieder!"<<endl;
    
    if(i>251)
    cout<<"Falsche eingabe"<<endl;
    
    getchar();
    }
    
    while (x!=i);
    
    getchar();
    clrscr();
    menu();
    
     }
    
     void schwer()
    
    {
    clrscr();
    randomize();
    int x=random(1000);
    int i;
    
    do {
    gotoxy(30,5);
    textcolor(10);
    cprintf("Gebe deine Zahl ein");
    gotoxy(30,7);
    cin>>i;
    clrscr();
    
    if(i==x)
    cout<<"Herzlichen Glueckwunsch, du hast gewonnen"<<endl;
    
    if(i>x)
    cout<<"Zu hoch!"<<endl;
    
    if(i<x)
    cout<<"zu nieder!"<<endl;
    
    if(i>1000)
    cout<<"Falsche eingabe"<<endl;
    
    getchar();
    }
    
    while (x!=i);
    
    getchar();
    clrscr();
    menu();
    
     }
    
    int main()
    {
    menu();
    
    if (menue==1)
    regeln();
    
    if (menue==2)
    schwirigkeit();
    
     if(stufe==l)
           leicht();
    
     if(stufe==m)
           mittel();
    
    if(stufe==s)
           schwer();
    
    if (menue==3)
    return 0;
    
    }
    //---------------------------------------------------------------------------
    


  • Was geht denn konkret nicht, wo kommst du nicht weiter?

    Ich würde dir auch raten, den Quellcode besser einzurücken. Im Übrigen ist vieles hier nicht übliches C++, beispielsweise gotoxy() , cprintf() , <conio> überhaupt.



  • Es ist so. wenn ich im Menü das Spiel starten möchte kann ich mir die Stufe auswählen aber das spiel startet sich komischerweiße nicht.

    Wie kann ich den Code einrücken?



  • Sching schrieb:

    Es ist so. wenn ich im Menü das Spiel starten möchte kann ich mir die Stufe auswählen aber das spiel startet sich komischerweiße nicht.

    Naja, ich werd mir jetzt nicht die Stelle suchen, wo das Spiel starten sollte... Aber versuch es doch mal mit einem Debugger, indem du Haltepunkte setzt und lokale Variablen auf ihren Wert überprüfst.

    Sching schrieb:

    Wie kann ich den Code einrücken?

    Normalerweise in deiner IDE mit der Tabulator-Taste... 🙄



  • Ich hab dir mal 2 Funktionen bissl verändert:

    Ich versuchs mal kurz zu erklären:
    Funktionen können Werte zurückgeben - und das sollte man auch nutzen - globale Variablen sind eben schlechter Stil und machen das ganze nicht gerade übersichtlicher...

    Für Ausgaben auf der Konsole kannst du auch ruhig wide-strings nehmen - dann hast du den vollen Zeichensatz (also auch ä/ö/ü/ß/.../Umlaute bzw. Sonderzeichen aus anderen Ländern/... zur Verfügung).
    Ohne dich beleidigen zu wollen: Lies dir besser mal die Texte durch, die dein Programm später ausgeben sollte... Ich fand sie mehr als schrecklich - vor allem von der Rechtschreibung her ><

    Ein Beispiel für wide-Strings (im Vergleich zu richtigen Strings):

    #include <string>
    
    std::string  normaler_string =  "asd";
    std::wstring wide_string     = L"asd";
    
    #include <iostream>
    
    std::cout  << normaler_string << std::endl;
    std::wcout << wide_string     << std::endl;
    
    int menu()
    {
    	gotoxy(25,7);
    	textcolor (4);
    	std::wcout << L"***Zahlenraten***" << std::endl;
    
    	gotoxy(25,9);
    	textcolor(6);
    	std::wcout << L"1. Spielregeln" << std::endl;
    
    	gotoxy(25,10);
    	textcolor(6);
    	std::wcout << L"2. Spiel starten" << std::endl;
    
    	gotoxy(25,11);
    	textcolor(6);
    	std::wcout << L"3. Beenden" << std::endl << std::endl;
    
    	gotoxy(25,14);
    	std::wcout << L"Was möchten Sie tun?" << std::endl;
    	gotoxy(25,15);
    
    	int auswahl(3);
    	cin >> auswahl;
    	return auswahl;
    }
    
    void regeln()
    {
    	clrscr();
    	gotoxy(30,5);
    	textcolor(RED);
    	std::wcout << L"**Spielregeln**" << std::endl << std::endl;
    
    	std::wcout << L"1. Bevor man das Spiel beginnen kann," << std::endl
    		<< L"muss man einen Schwierigkeitsgrad auswählen." << std::endl
    		<< L"Es gibt 3 verschiedene Stufen:" << std::endl << std::endl
    		<< L"Leicht\t=  Eine Zahl zwischen 1 und 99" << std::endl
    		<< L"Mittel\t=  Eine Zahl zwischen 1 und 250" << std::endl
    		<< L"Schwer\t=  Eine Zahl zwischen 1 und 999" << std::endl << std::endl
    /*
    usw. hab nicht mehr so die lust, das jz alles zu korrigieren
    << L"2.Nachdem man sich fuer eine Stufe entschieden hat,"<<endl; 
    	cout<<"kann man das Spiel mit Enter beginnen."<<endl; 
    	cout<<"3.Die Aufgabe ist es nun, innerhalb von 12 Versuche die Zahl,"<<endl; 
    	cout<<"die der Computer sich Gemerkt hat zu finden."<<endl; 
    	cout<<"Als Tipp bekommt man gesagt ob man hoeher oder tiefer raten muss."<<endl; 
    	cout<<"4.Das Ziel von dem Spiel ist es,"<<endl; 
    	cout<<"die Richtige Zahl mit so wenig wir moeglich Versuchen zu finden."<<endl; 
    */
    		<< L"Schafft man dies nicht, hat man verloren. Und muss von Neuem beginnen." << std::endl << std::endl; 
    
    	std::wcout<< L"Drücken sie eine beliebige Taste um zum Hauptmenü zurückzukehren." << std::endl; 
    	getchar();
    	getchar();
    	clrscr();
    }
    

    damit sieht deine main-fkt dann so in etwa aus:

    int main()
    {
     bool again = true;
     do
     {
       int menu_auswahl = menu();
       switch (menu_auswahl)
       {
        case 1:
         regeln();
         break;
        case 2:
        {//hier brauchen wir einen extra scope und das mit der schwierigkeit gebacken zu bekommen ^^ (wenn du das nicht verstehst musste eben noch mal genau nachfragen)
         char auswahl_schwierigkeit = schwierigkeit();
         int zufallszahl;
         /*je nach 'auswahl_schwierigkeit' den zufallswert initialisieren*/
         run_game(); //hier das eigentliche spiel
        }
        break;
        case 3:
         again = false;
         break;
        default:
         //falsche eingabe abfangen
       }
     }while(again);
    }
    

    ach so:
    die main.cpp sieht eigtl meist so aus:

    //includes
    #include <iostream>
    
    //prototypen aller funktionen
    int menu();
    
    //main-fkt-definition
    int main()
    {
     std::cout << menu();
    }
    
    //definitionen der restlichen fkt
    int menu()
    {
     return 1;
    }
    

    dann sieht man nämlich auch noch durch ^^

    ich hoffe, ich konnte dir ein wenig helfen und du versuchst jz den rest so in etwa zu machen und zeigst dann mal, was du nun gemacht hast ^^

    bb



  • Hey danke dir schonmal für deine Tipps. ich bearbeitet mein Code nochmal und auch meine Schreibfehler^^ uhh peinlich.

    Aber ich hätte noch eine frage, wie kann ich sagen, dass man um die Zahl zu erraten nur 12 versuche hat?



  • da gibts ca. 1000 wege ^^

    for (int i = 0; i != 12; ++i)
    {
    //eingeben
      if (eingebene_zahl != gesuchte_zahl)
       continue;
    
      std::cout << "richtig" << std::endl;
      break;
    }
    
    //oder
    
    int i = 0;
    do
    {
    //eingeben
     ++i;
     if (i == 12)
     {
      std::cout << "max. erreicht" << std::endl;
      break;
     }
    }while (eingegebene_zahl != gesuchte_zahl);
    
    //oder
    
    int gesuchte_zahl = 234;
    int eingegebene_zahl;
    std::cin >> eingegebene_zahl;
    for (int i = 1; eingegebene_zahl != gesuchte_zahl; ++i)
    {
     if (eingegebene_zahl < gesuchte_zahl)
     {
      ;
     }
     else //eingegebene_zahl > gesuchte_zahl
     {
      ;
     }
    
     if (i == 12)
     {
      //max erreicht - abbruch etc
     }
    }
    

    am besten, du guckst dir mal die schleifen bissl an und dann wirst du vll auch noch nen tolleren weg finden ^^

    bb


Anmelden zum Antworten