Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

09.12.2007, 14:50

Sicherung vor zeicheneingabe

Hallo...
hab gerade das Spiel Zahlenraten vom Buch C++ für Spieleprogrammierer zuende gemacht und bin jetzt dabei es zu modifizieren.

Mein Problem:
Wenn man bei dem Tippen einer Zahl ausversehen ein Buchstaben eingibt rattert die ganze schleife unaufhaltsam nach unten...
wie kann ich dieses Problem beheben?

ich wollte es schon mit einer if, else Bedingung lösen, habs aber nicht geschafft! Ich glaub das stand bis jetzt auch gar nicht im Buch...

Nur mit einer Switch, case und default Bedingung könnte ich das mit meinem bisherigen Wissen lösen. Ich hab aber keine Ahnung wie ich das dort hineinsetzen soll.

Kann mir jemand helfen?
lg

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

09.12.2007, 15:37

Klar, wenn du uns auch noch den Code zeigst um den es geht. Und wo ist das Problem die if else bedingungen durch switch case default zu lösen?. Übrigens

C-/C++-Quelltext

1
2
3
4
if(...)
else if(...)
else if(...)
else


ist das gleiche wie

C-/C++-Quelltext

1
2
3
4
5
6
7
8
switch(...)
{
case ...:
break;
case ...:
break;
default:
}
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

09.12.2007, 15:52

Hmm ok du nutzt std::cin und gibst meinetwegen einen Buchstaben ein? Hmm ...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <limits>

std::istream& clear_stream(std::istream& in) { in.clear(); in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); return in; }

template<typename _Result>
void type(std::string const& prompt, _Result& dest)
{
    do { std::cout << promp << std::flush; } while (!(clear_stream(std::cin) >> dest));
}
template<typename _Result>
_Result type(std::string const& prompt)
{
    _Result tmp;
    return type<_Result>(prompt, tmp), tmp;
}

int main()
{
    int my_var(type<int>("Alter: "));
}
... ^^ naja wenn de Erklärung brauchst ... sag bescheid!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

4

09.12.2007, 16:38

Die Spielenfunktion sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
int Spielen (int Level)
{
    int Zufallszahl;            // Zufallszahl, die eraten werden muss

    int GerateneZahl = 0;       // Zahl, die der Spieler eingibt

    int Bereich = Level * 10;   // Bereich der Zufallszahl

    int Versuche = 0;           // Anzahl der bisherigen Versuche

    int Punkte = 0;             // Punktezahl


    // Zufallszahl ermitteln

    Zufallszahl = (rand()%Bereich)+1;

    // Bereich ausgeben indem geraten wird

    cout << "\nDie gesuchte Zahl liegt zwischen 1 und ";
    cout << Bereich << endl;

    // So lange raten, bis die Zahl gefunden wurde

    while (GerateneZahl != Zufallszahl)
    {
        cout << "Dein Tipp: ";
        cin >> GerateneZahl;
    
        Versuche++;
    
        // Zahl hat nicht gestimmt, also Hinweis ausgeben

        if (GerateneZahl < Zufallszahl)
            cout << "Die gesuchte Zahl ist groesser" << endl;
        if (GerateneZahl > Zufallszahl)
            cout << "Die gesuchte Zahl ist kleiner" << endl;
    
    }
    

    // Die Zahl wurde erraten

    cout << "\nGeschafft ! " << endl;
    cout << "Du hast die Zahl nach " << Versuche;
    cout << " Versuchen erraten!\n\n" << endl;

    // Punkte berechnen

    // Desto weniger Versuche und desto höher das Level, desto mehr Punkte


    Punkte = Bereich - Versuche + 1;
    Punkte *= Level;

    // Wenn mehr Versuche benötigt werden, als es Zahlen gibt, kann das Ergebniss negativ sein


    if (Punkte < 0)
        Punkte = 0;

    // Punkte ausgeben

    cout << "Punkte: " << Punkte << endl;

    // Punkte zurückgeben

    return Punkte;
}   // Spielen


Es geht um buchstaben...
wenn ich nicht wöllte, dass man keine zahlen ab 100 oder so eingeben kann wäre das ja kein Problem!
lg[/cpp]

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

09.12.2007, 17:41

Sach mal, in dem anderen Thread zu deinem Rechenprogramm haben wir die selbe Thematik doch schon durchgekaut!
Warum fängst du hier wieder damit an??

6

09.12.2007, 19:40

Weil diese "Thematik", die du mir dort gezeigt hast nicht funktioniert,
deshalb!

7

09.12.2007, 20:03

Ehm naja wer hat euch beigebracht, Variablen am Anfang des Scopes zu definieren?
Und warum liest hier keiner, was man schreibt?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <limits>

std::istream& clear_stream(std::istream& in) { in.clear(); in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); return in; }

template<typename _Result>
void type(std::string const& prompt, _Result& dest)
{
    do { std::cout << promp << std::flush; } while (!(clear_stream(std::cin) >> dest));
}
template<typename _Result>
_Result type(std::string const& prompt)
{
    _Result tmp;
    return type<_Result>(prompt, tmp), tmp;
}

int play(unsigned char level)
{
    const unsigned short range(level * 10);
    std::cout << "\nDie gesuchte Zahl liegt zwischen 1 und " << range << std::endl;
    unsigned int rand_number((std::rand() % range) + 1);

    unsigned int user_number(0);
    unsigned int trys(0);

    while (user_number != rand_number)
    {
        type<unsigned int>("Dein Tipp: ", user_number);
        ++trys;
        if (user_number != rand_number) std::cout << "Die gesuchte Zahl ist " << (user_number > rand_number ? "kleiner" : "groesser") << "!" << std::endl;
    }
   
    std::cout   << "\nGeschafft!\nDu hast die Zahl nach " << trys << " Versuch(en) erraten!\n\n" << std::endl;

    bool zero((range - trys) < 0);
    unsigned int points(zero ? 0 : (range - trys + 1) * level);

    std::cout << "Punkte: " << points << std::endl;
    return points;
}
und fertig ist.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

8

10.12.2007, 18:48

das soll doch nur die eine Funktion sein...
plz nicht so umschreiben, sonst blick ich gar nicht mehr durch...
was benötig ich denn jetzt genau für die Sicherung...

9

10.12.2007, 19:08

Der wichtige Teil ist die Funktion type und clear_stream ...

type gibt den bei prompt übergebenen String aus und säubert dann als erstes den std::istream, std::cin. Daraufhin wird versucht eine Eingabe für den gewünschten Type (_Result) einzulesen. Das wird so lange gemacht, bis das einlesen erfolgreich ist.

clear_stream löscht alle Fehlerbits und leert den Eingabe-Buffer(Eingabe-Streams sind gepuffert ...).
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

10

10.12.2007, 19:15

ich glaube wir reden anneinander vorbei...

ich zeig dir mal den gesamten quellcode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/*
C++ für Spieleprogrammierer
Listing 4_12
Zahlenraten
*/

#include <iostream>
#include <windows.h>

using namespace std;

#pragma comment (lib, "winmm.lib")

// Funktionsprototypen

int Spielen (int Level);
int WaehleLevel (int Level);
int TesteHighscore (int Punkte, int Highscore);
void ZeigeInfos ();

// Hauptprogramm

int main()
{
    //Variablen

    char Auswahl;       // Gewählter Menüpunkt

    int Level = 5;      // Aktueller Level

    int Highscore = 100;// Aktueller Highscore


    // Zufallsgenerator initialisieren

    srand (timeGetTime ());

    // Verarbeitung des Moduls

    

    do 
    {
        // Menü ausgeben

        cout << " ......................." << endl;
        cout << " . Zahlenraten - Menue ." << endl;
        cout << " ......................." << endl;
        cout << " .(N)eues Spiel starten." << endl;
        cout << " .(L)evel waehlen      ." << endl;
        cout << " .(H)ighscore anzeigen ." << endl;
        cout << " .(I)nfo               ." << endl;
        cout << " .(B)eenden            ." << endl;
        cout << " ......................." << endl;

        // Eingabe abfragen

        cout << "\n        Auswahl: ";
        cin >> Auswahl;
        cout << "\n";
        // Je nach Eingabe verzweigen

        switch (Auswahl)
        {
            // Neues Spiel starten ?

            case ('n'):
            case ('N'):
            case ('1'):
            {
                // Spielen

                int Punkte;
                Punkte = Spielen (Level);

                Highscore = TesteHighscore (Punkte, Highscore);
            } break;

            // Level wählen ?

            case ('l'):
            case ('L'):
            case ('2'):
            {
                Level = WaehleLevel (Level);
            } break;

            // Highscore anzeigen ?

            case ('h'):
            case ('H'):
            case ('3'):
            {
                cout << "Der aktuelle Highscore liegt bei ";
                cout << Highscore << " Punkten\n\n";
            } break;

            // Infos anzeigen ?

            case ('i'):
            case ('I'):
            case ('4'):
            {
                ZeigeInfos ();
            } break;

            // Spiel beenden ?

            case ('b'):
            case ('B'):
            case ('5'):
            {
                cout << "Spiel beenden..." << endl;
                Sleep (2000);
            } break;

            // Falesche Eingabe?

            default:
            {
                cout << "Falsche Eingabe!\n\n";
            }

        }

    }   while (Auswahl != 'b' && Auswahl != 'B');   // Spiel beenden?


    cout << "Bis zum naechsten Mal!" << endl;
    Sleep (1000);
    cout << "\a";
    return 0;
}   // main


// Zeige Infos 

// Aufgabe: Informationen zum Spiel anzeigen


void ZeigeInfos ()
{
    cout << "Zahlenraten - THE GAME - Version 0.5" << endl;
    cout << "Published by RAX Software\n";
    cout << "(c) by Uwe Collmer\nhttp://uwe-collmer.de\nhttp://game-community.org\n\nThanks for downloading and using\n(Il)legal copys are allowed\n\nPlease send bugreports or questions to uwe@collmer.net\n";
    cout << "\n";
}   // Zeige Infos


// Wähle Level

// Aufgabe: Neuen Level auswählen

int WaehleLevel (int Level)
{
    int NeuerLevel;

    do
    {
        // Neuen Level auswählen

        cout << "Aktueller Level: " << Level << endl;
        cout << "Neuer Level (1-10): ";
        cin >> NeuerLevel;

        // Ungültiger Level?

        if (NeuerLevel < 1 || NeuerLevel > 10)
        {
            cout << "Unguetliges Level gewaehlt!" << endl;
        }
    }   while (NeuerLevel < 1 || NeuerLevel > 10);

    // Gewählten Level zurückgeben

    return NeuerLevel;
}   // Wähle Level


// SPIELEN

// AUFGABE: DAS EIGENTLICHE SPIEL SPIELEN

int Spielen (int Level)
{
    int Zufallszahl;            // Zufallszahl, die eraten werden muss

    int GerateneZahl = 0;       // Zahl, die der Spieler eingibt

    int Bereich = Level * 10;   // Bereich der Zufallszahl

    int Versuche = 0;           // Anzahl der bisherigen Versuche

    int Punkte = 0;             // Punktezahl


    // Zufallszahl ermitteln

    Zufallszahl = (rand()%Bereich)+1;

    // Bereich ausgeben indem geraten wird

    cout << "\nDie gesuchte Zahl liegt zwischen 1 und ";
    cout << Bereich << endl;

    // So lange raten, bis die Zahl gefunden wurde

    while (GerateneZahl != Zufallszahl)
    {
        cout << "Dein Tipp: ";
        cin >> GerateneZahl;
    if (GerateneZahl <= 100)
    {
        Versuche++;
    
        // Zahl hat nicht gestimmt, also Hinweis ausgeben

        if (GerateneZahl < Zufallszahl)
            cout << "Die gesuchte Zahl ist groesser" << endl;
        if (GerateneZahl > Zufallszahl)
            cout << "Die gesuchte Zahl ist kleiner" << endl;
    }
    else 
    {
        cout << "Falsche Eingabe!" << endl;
    }
    }
    

    // Die Zahl wurde erraten

    cout << "\nGeschafft ! " << endl;
    cout << "Du hast die Zahl nach " << Versuche;
    cout << " Versuchen erraten!\n\n" << endl;

    // Punkte berechnen

    // Desto weniger Versuche und desto höher das Level, desto mehr Punkte


    Punkte = Bereich - Versuche + 1;
    Punkte *= Level;

    // Wenn mehr Versuche benötigt werden, als es Zahlen gibt, kann das Ergebniss negativ sein


    if (Punkte < 0)
        Punkte = 0;

    // Punkte ausgeben

    cout << "Punkte: " << Punkte << endl;

    // Punkte zurückgeben

    return Punkte;
}   // Spielen


// Teste Highscore

// Aufgabe: Prüfen, ob der Highscore geknackt wurde


int TesteHighscore (int Punkte, int Highscore)
{
    // Prüfen ob der Highscore geknackt wurde

    if (Punkte > Highscore)
    {
        cout << "Glueckwunsch! Neuer Highscore!\n\n";
        Highscore = Punkte;
    }
    else 
    {
        cout << "Leider kein neuer Highscore :-(\n\n";
    }

    // Highscore zurückgeben

    return Highscore;
}   // Teste Highscore


Und bei der Funktion "Spielen" eine Sicherung rein...^^

lg

Werbeanzeige