Hilfe beim Zahlenraten

  • C++

  • Underkane
  • 2601 Aufrufe 13 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hilfe beim Zahlenraten

    Hallo,
    ich habe mich mal an C++ gewagt habe mich an ein erstes Spiel gecodet.
    Es klappt auch fast alles, aber mir fällt folgendes auf.

    7 soll die Zahl sein, bei der die Meldung "Richtig" erscheinen soll.
    NUR (!) bei der 7.
    Wenn ich allerdings eine Zahl > 7 eingebe und darauffolgend eine Zahl < 7 eingebe, kommt trotzdem die "Richtig" Meldung, was nicht sein sollte/dürfte.

    C-Quellcode

    1. #include <cstdlib>
    2. #include <iostream>
    3. using namespace std;
    4. int main(int argc, char *argv[])
    5. {
    6. cout << "Hallo! "; //Begrüßung Anfang
    7. cout << "Ich will mit dir ein Spiel spielen." << endl;
    8. cout << "Ich denke mir eine Zahl zwischen 1 und 10. " << endl;
    9. cout << "Du musst herauszufinden, welche Zahl ich mir gedacht habe." << endl;
    10. cout << "Los geht's! Du hast 11 Versuche! *grins*" << endl; //Begrüßung Ende
    11. cout << "" << endl; //Leere Zeile
    12. cout << "(c) by Andreas Schmidt" << endl;
    13. cout << "" << endl; //Leere Zeile
    14. int zahl = 7;
    15. cout << "Welche Zahl habe ich mir gedacht? ";
    16. cin >> zahl;
    17. while(zahl < 7) //zahl ungleich 7
    18. {
    19. cout << "" << endl; //leere zeile
    20. cout << "Das ist leider nicht richtig. Meine Zahl ist gr\224\341er. " << endl; //meldung
    21. cout << "Versuch' es nochmal. Gib eine Zahl ein: ";
    22. cin >> zahl; //neue zahl
    23. }
    24. while(zahl > 7) //zahl ungleich 7
    25. {
    26. cout << "" << endl; //leere zeile
    27. cout << "Das ist leider nicht richtig. Meine Zahl ist kleiner. " << endl; //meldung
    28. cout << "Versuch' es nochmal. Gib eine Zahl ein: ";
    29. cin >> zahl; //neue zahl
    30. }
    31. if(zahl == 7); //zahl gleich 7
    32. {
    33. cout << "" << endl; //leere zeile
    34. cout << "Richtig! " << endl; //lob
    35. cout << "" << endl; //leere zeile
    36. system("PAUSE"); //schließen
    37. return EXIT_SUCCESS;
    38. }
    39. }
    Alles anzeigen


    Bei diesem Code hält es sich bisschen länger.
    Ich gebe eine Zahl < 7 ein, dann eine Zahl > 7 und dann nochmal eine Zahl < 7.
    Dann erscheint trotzdem die "Richtig" Meldung.

    C-Quellcode

    1. #include <cstdlib>
    2. #include <iostream>
    3. using namespace std;
    4. int main(int argc, char *argv[])
    5. {
    6. cout << "Hallo! "; //Begrüßung Anfang
    7. cout << "Ich will mit dir ein Spiel spielen." << endl;
    8. cout << "Ich denke mir eine Zahl zwischen 1 und 10. " << endl;
    9. cout << "Du musst herauszufinden, welche Zahl ich mir gedacht habe." << endl;
    10. cout << "Los geht's! Du hast 11 Versuche! *grins*" << endl; //Begrüßung Ende
    11. cout << "" << endl; //Leere Zeile
    12. cout << "(c) by Andreas Schmidt" << endl;
    13. cout << "" << endl; //Leere Zeile
    14. int zahl = 7;
    15. cout << "Welche Zahl habe ich mir gedacht? ";
    16. cin >> zahl;
    17. do //zahl ungleich 7
    18. {
    19. cout << "" << endl; //leere zeile
    20. cout << "Das ist leider nicht richtig. Meine Zahl ist gr\224\341er. " << endl; //meldung
    21. cout << "Versuch' es nochmal. Gib eine Zahl ein: ";
    22. cin >> zahl; //neue zahl
    23. } while(zahl < 7);
    24. do //zahl ungleich 7
    25. {
    26. cout << "" << endl; //leere zeile
    27. cout << "Das ist leider nicht richtig. Meine Zahl ist kleiner. " << endl; //meldung
    28. cout << "Versuch' es nochmal. Gib eine Zahl ein: ";
    29. cin >> zahl; //neue zahl
    30. } while(zahl > 7);
    31. if(zahl == 7); //zahl gleich 7
    32. {
    33. cout << "" << endl; //leere zeile
    34. cout << "Richtig! " << endl; //lob
    35. cout << "" << endl; //leere zeile
    36. system("PAUSE"); //schließen
    37. return EXIT_SUCCESS;
    38. }
    39. }
    Alles anzeigen


    Weiß jemand was ich falsch mache und wie ich es ausbessern kann?

    mfg
    Underkane

    //Edit:
    Wenn ich 7 gleich am Anfang eingebe, bekomme ich trotzdem eine "Falsch" Meldung.
    Und ich wüsste gerne, wie ich eine Zahl zwischen 1 und 10 automatisch (zufällig) generieren lasse, damit sie sich jedes mal ändert.
  • warum setzt du deine zahl am anfang auf:
    int zahl = 7; ?

    es sollte reichen wenn du lediglich int zahl; schreibst.. denke da liegt dein fehler, schliesslich wird durch cin >> zahl der zahl sowieso ein wert zugewiesen

    das mit zufallszahl sollte mit rand() funzen ;)

    edit:

    achso und es sollte if (zahl==7) heissen.. das semikolon am ende solltest du weg machen :)
  • Hi,
    daran liegt es leider nicht.

    int zahl = 7;
    Damit wird zahl mit dem Wert 7 integriert.
    mit cin >> zahl; wird ihr ein NEUER Wert zugewiesen.

    und if (zahl==7) //ohne semikolon
    funktioniert zwar, aber gewirkt das selbe wie if (zahl == 7);

    C-Quellcode

    1. #include <cstdlib>
    2. #include <iostream>
    3. using namespace std;
    4. int main(int argc, char *argv[])
    5. {
    6. cout << "Hallo! "; //Begrüßung Anfang
    7. cout << "Ich will mit dir ein Spiel spielen." << endl;
    8. cout << "Ich denke mir eine Zahl zwischen 1 und 10. " << endl;
    9. cout << "Du musst herauszufinden, welche Zahl ich mir gedacht habe." << endl;
    10. cout << "Los geht's! Du hast 11 Versuche! *grins*" << endl; //Begrüßung Ende
    11. cout << "" << endl; //Leere Zeile
    12. cout << "(c) by Andreas Schmidt" << endl;
    13. cout << "" << endl; //Leere Zeile
    14. int zahl;
    15. cout << "Welche Zahl habe ich mir gedacht? ";
    16. cin >> zahl;
    17. do //zahl ungleich 7
    18. {
    19. cout << "" << endl; //leere zeile
    20. cout << "Das ist leider nicht richtig. Meine Zahl ist gr\224\341er. " << endl; //meldung
    21. cout << "Versuch' es nochmal. Gib eine Zahl ein: ";
    22. cin >> zahl; //neue zahl
    23. } while(zahl < 7);
    24. do //zahl ungleich 7
    25. {
    26. cout << "" << endl; //leere zeile
    27. cout << "Das ist leider nicht richtig. Meine Zahl ist kleiner. " << endl; //meldung
    28. cout << "Versuch' es nochmal. Gib eine Zahl ein: ";
    29. cin >> zahl; //neue zahl
    30. } while(zahl > 7);
    31. if(zahl==7) //zahl gleich 7
    32. {
    33. cout << "" << endl; //leere zeile
    34. cout << "Richtig! " << endl; //lob
    35. cout << "" << endl; //leere zeile
    36. system("PAUSE"); //schließen
    37. return EXIT_SUCCESS;
    38. }
    39. }
    Alles anzeigen


    mfg
    Underkane
  • Du weisst schon, dass eine Do-Schleife immer (min.) einen Durchlauf hat?
    Ansonsten funzt das auch nicht nacheinander.

    PHP-Quellcode

    1. #include <cstdlib>
    2. #include <iostream>
    3. #include <time.h>
    4. using namespace std;
    5. int main(int argc, char *argv[])
    6. {
    7. int range = 10;
    8. int tmp = range-1;
    9. int n = 1;
    10. while ((tmp = tmp >> 1) > 0) {
    11. n++;
    12. }
    13. cout << "Hallo!";
    14. cout << "Ich will mit dir ein Spiel spielen." << endl;
    15. cout << "Ich denke mir eine Zahl zwischen 1 und " << range << ". " << endl;
    16. cout << "Du musst herauszufinden, welche Zahl ich mir gedacht habe." << endl;
    17. cout << "Los geht's! Du hast " << n << " Versuche!" << endl;
    18. cout << "\n(c) by Andreas Schmidt\n" << endl;
    19. int zahl;
    20. srand ( time(NULL) ); //initialize random seed
    21. unsigned int loesung = (rand() % range) + 1;
    22. cout << "Welche Zahl habe ich mir gedacht? ";
    23. cin >> zahl;
    24. int i = 0;
    25. while (zahl != loesung && i++ < n-1)
    26. {
    27. if (zahl > loesung) cout << "\nDas ist leider nicht richtig. Meine Zahl ist kleiner. " << endl;
    28. else cout << "\nDas ist leider nicht richtig. Meine Zahl ist groesser. " << endl;
    29. cout << "Noch " << n-i << " Versuche" << endl;
    30. cout << "Versuch' es nochmal. Gib eine Zahl ein: ";
    31. cin >> zahl;
    32. }
    33. if (zahl == loesung) cout << "\nRichtig!\n" << endl;
    34. else cout << "\nLeider nicht erraten, es war " << loesung << ".\n" << endl;
    35. return 0;
    36. }
    Alles anzeigen


    Edit: Habs jetzt so gemacht, dass die minimale Versuchsanzahl selbst berechnet wird.
    Wo ist der Discord Server

    Dieser Beitrag wurde bereits 20 mal editiert, zuletzt von Skyte ()

  • @skyte das war dem TO bestimmt klar, siehe dem *grins* am ende

    @underkane
    najo, hab nie c++ gelernt.. bin nur drübergeflogen und das is mir halt sofort aufgefallen.. haette ja sein können das die fehler daran schon liegen ;)
    (es waren aufjedenfall schönheitsfehler)
  • Underkane schrieb:

    bekomme ich entweder eine oder garkeine Zahl, die aber trotzdem Zufällig ist.

    Hab den Satz nicht so ganz verstanden. Wie "gar keine Zahl"?

    Kannst es vllt mal in die Form bringen, wie du es am Anfang hattest, und zwar return 0 gegen das hier ersetzen:

    Quellcode

    1. system("PAUSE"); //schließen
    2. return EXIT_SUCCESS;


    Ansonsten vllt mal

    Quellcode

    1. srand(time(NULL));

    auskommentieren.
    Wo ist der Discord Server
  • Ich habe nur "fetzen" also nur einen Teil von dir übernommen.
    Dann stand bei mir nur als cout (Ausgabe) eine Zahl zwischen 1 und 10, oder garnichts und es kam direkt: drücken sie eine beliebige taste zum fortsetzen. . . oder so ähnlich und dann ging das programm aus.

    Jetzt habe ich alles von dir übernommen. Es funktioniert auch die größer/kleiner Ausgabe, aber wenn ich die richtige Zahl errate schließt sich das Programm einfach.

    EDIT:
    Ich hab jetzt return 0; durch system("PAUSE"); return EXIT_SUCCESS; ersetzt und jetzt geht alles perfekt. =)
    Vielen Dank für deine Hilfe.

    Edit²:
    Vielen Dank. Ich habe jetzt alles so, wie ich es haben will.

    PHP-Quellcode

    1. #include <cstdlib>
    2. #include <iostream>
    3. #include <time.h>
    4. using namespace std;
    5. int main(int argc, char *argv[])
    6. {
    7. int range = 10;
    8. int tmp = range-1;
    9. int n = 1;
    10. while ((tmp = tmp >> 1) > 0) {
    11. n++;
    12. }
    13. cout << "Ratespiel v1.2\n\n\n";
    14. cout << "Hallo! ";
    15. cout << "Ich will mit dir ein Spiel spielen." << endl;
    16. cout << "Ich denke mir eine Zahl zwischen 1 und " << range << ". " << endl;
    17. cout << "Du musst herauszufinden, welche Zahl ich mir gedacht habe." << endl;
    18. cout << "Los geht's! Du hast " << n << " Versuche!" << endl;
    19. cout << "\n(c) by Andreas Schmidt\n" << endl;
    20. int zahl;
    21. srand(time(NULL)); //initialize random seed
    22. unsigned int loesung = (rand() % range) + 1;
    23. cout << "Welche Zahl habe ich mir gedacht? ";
    24. cin >> zahl;
    25. int i = 0;
    26. while (zahl != loesung && i++ < n-1)
    27. {
    28. if (zahl > loesung) cout << "\nDas ist leider nicht richtig. Meine Zahl ist kleiner. " << endl;
    29. else cout << "\nDas ist leider nicht richtig. Meine Zahl ist gr\224\341er. " << endl;
    30. cout << "Du hast noch " << n-i << " Versuche. " << endl;
    31. cout << "Versuch' es nochmal. Gib eine Zahl ein: ";
    32. cin >> zahl;
    33. }
    34. if (zahl == loesung) cout << "\nRichtig! Es war " << loesung << ".\n" << endl;
    35. else cout << "\nLeider nicht erraten, es war " << loesung << ".\n" << endl;
    36. system("PAUSE"); //schließen
    37. return EXIT_SUCCESS;
    38. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Underkane ()

  • Underkane schrieb:

    aber wenn ich die richtige Zahl errate schließt sich das Programm einfach.


    Es schiesst sich nicht ab. Es gibt "Richtig" aus und beendet ganz normal, nur wohl zu schnell um es zu sehen.
    Du kannst es von der Console (CMD) aus starten um alles zu sehen.
    Dein "PAUSE" wartet halt noch auf ne Benutzereingabe, bevor es beendet.
    Wo ist der Discord Server
  • Sorry, wenn das schon geklärt, aber da ich gerade Zeit habe, hier eine kleiner Tipp für Anfänger ;)

    Benutze noch besser ein getch aus der Bibliothek ich glaub "conio", das Programm gibt dann nicht diese nervige "Bitte drücken sie eine beliebige Taste"-Mitteilung aus und du kannst davor auch noch, falls man das möchte, einen selbsterfunden Text, z.B. mit -> cout << "Druecke eine Taste"; <- ausgeben lassen ;)

    cout << "Bitte drücken sie eine Taste ihrer Wahl zum Schließen des Programmes...";
    getch();
    return 0;
  • getchar() war doch des oder
    bei virtual studio brauchst du aber noch davor cin.get


    und falls es dich interressiert ich habe auch mal aus langeweile n zahlenraten mit zufallszahlen gemacht


    hier der c++ code

    PHP-Quellcode

    1. // Zahlenraten.cpp : Zahlenraten-Spiel mit Zufallsgenerator
    2. //
    3. #include "stdafx.h"
    4. #include "iostream"
    5. #include "time.h"
    6. #include "windows.h"
    7. #include "conio.h"
    8. using namespace std;
    9. int zufall(const int, const int);
    10. void kleiner(int zahl);
    11. void groesser(int zahl);
    12. void gleich();
    13. int menue();
    14. int _tmain(int argc, _TCHAR* argv[])
    15. {
    16. //int i_wert2=0;
    17. int i_wert2=menue();
    18. bool weiter(true);
    19. int i_eingabe;
    20. cout << "!!!Zahlenraten!!!" << endl;
    21. cout << "Geben Sie eine Zahl zwischen 1 und " << i_wert2 << " ein.\n\n";
    22. int i_fall=zufall(1, i_wert2);
    23. do {
    24. cin >> i_eingabe;
    25. if (i_eingabe<i_fall)
    26. {
    27. kleiner(i_eingabe);
    28. }
    29. else if (i_eingabe>i_fall)
    30. {
    31. groesser(i_eingabe);
    32. }
    33. else
    34. {
    35. gleich();
    36. weiter=false;
    37. }
    38. } while(weiter);
    39. Sleep(10000);
    40. return 0;
    41. }
    42. int menue()
    43. {
    44. int i_wert=99;
    45. cout << "!!!ZAHLENRATEN!!!";
    46. cout << "\n\n\nBitte geben Sie einen Wertebereich ein (Standart: 99)\t";
    47. cin >> i_wert;
    48. return i_wert;
    49. }
    50. int zufall(const int a, const int b)
    51. {
    52. srand ((unsigned int)time(NULL));
    53. // zielbereich
    54. int c = b-a;
    55. /* c muß größer als 0 sein
    56. c muß kleiner als RAND_MAX sein
    57. obergrenze, über der rand verworfen wird */
    58. int d = RAND_MAX - (RAND_MAX % c);
    59. int e;
    60. do
    61. {
    62. e = rand();
    63. } while (e < d);
    64. return (e % c) + a;
    65. }
    66. void kleiner(int zahl)
    67. {
    68. cout << "Die eingegebene Zahl: " << zahl << " ist zu klein!" << endl;
    69. }
    70. void groesser(int zahl)
    71. {
    72. cout << "Die eingegebene Zahl: " << zahl << " ist zu gross!" << endl;
    73. }
    74. void gleich()
    75. {
    76. cout << "\t Super die Zahlen stimmen Ueberein!!!";
    77. }
    Alles anzeigen