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

26.06.2015, 16:25

Listing 4.11 - Zahlenraten - srand (timeGetTime ());

Hallo Gemeinde

ich hab gerade das Zahlenratenprogramm abgetippt, leider will mein Compiler das nicht schlucken.

Als erstes wird "srand" (timeGetTime ()); rot unterstrichen.

ich poste hier mal den Code und hänge noch einen Screenshot an. Langsam komme ich mir immer beschränkter vor... zu blöd zum abtippen... :cursing:


(Link)


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
// C++ für Spieleprogrammierer
// Listing 4.11
// 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     // Akuteller Highscore

        // Zufallsgenerator initialisieren
        srand (timeGetTime ());

        // Verarbeitung des Menüs
        do
        {
            // Menü ausgeben
            //
            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\n\n";

            // Eingabe abfragen
            cout << "Asuwahl: ";
            cin >> Auswahl;

            // Je nach Eingabe verzweigen
            switch (Auswahl)
            {
                // Neues Spiel starten?
                case ('n'):
                case ('N'):
                {
                    // Spielen
                    int Punkte;
                    Punkte = Spielen(Level);

                    Highscore = TesteHighscore(Punkte, Highscore);

                }break;

                // Level wählen?
                case ('l'):
                case ('L'):
                {
                    Level = WaehleLevel(Level);

                }break;

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

                // Informationen anzeigen?
                case ('i'):
                case ('I'):
                {
                    ZeigenInfos();
                
                }break;

                // Spiel beenden?
                case ('b'):
                case ('B') :
                {
                    cout << "Spiel beendet." << endl;

                }break;

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

                }

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

        cout << "Bis zum naechsten Mal" << endl;

        return 0;
} // main

// ZeigeInfos
//
// Aufgabe: Informationen zum Spiel anzeigen
//
void ZeigeInfos()
{
    cout << "Zahlenraten V1.0" << endl;
    cout << "Beispiel aus \"C++ Spieleprogrammierer\"";
    cout << "\n\n";
} // ZeigeInfos

// WaehleLevel
//
// Aufgabe: Neuen Level auswählen
//
int WaehleLevel(int Level)
{
    int NeuerLevel;

    do
    {
        // Neuen Level wählen
        cout << "Akuteller Level: " << Level << endl;
        cout << "Neuer Level (1 - 10): ";
        cin >> NeuerLevel;

        // Ungültigen Level gewählt?
        if (NeuerLevel < 1 || NeuerLevel > 10)
        {
            // Fehlermeldung ausgeben
            cout << "Ungueltiger Level - Wert" << endl;
        }

    } while (NeuerLevel < 1 || NeuerLevel > 10);

    // Gewählten Level zurückgeben
    return NeuerLevel;
} // WaehleLevel

// Spielen
//
// Aufgabe: Das eigentliche Spiel spielen
//
int Spielen(int Level)
{
    int Zufallszahl;            // Zufallszahl, die erraten 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;             // Punktzahl

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

    // Bereich ausgeben, in dem 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 gesunde Zahl ist kleiner" << endl;
    }

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

    // Punkte berechnen
    // Desto weniger Versuche und desto höher das Level.
    // je mehr Punkte werden vergeben
    //
    Punkte = Bereich - Versuche + 1;
    Punkte *= Level;

    // Wenn mehr Versuche benötigt wurden, als es Zahlen gibt.
    // kann das Ergebnis negativ sein.
    //
    if (Punkte < 0)
        Punkte = 0;

    // Punkte ausgeben
    cout << "Punkte: " << Punkte << endl;

    // Punkte zurückgeben
    return Punkte;
} // Spielen

// TesteHighscore
//
// 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 << "Glückwunsch, Neuer Highscore !\n\n";
        Highscore = Punkte;
    }
    else
    {
        cout << "Leider kein neuer Highscore\n\n";
    }

    // Highscore zurückgeben
    return Highscore;
} // TesteHighscore



fehler gefunden... lol... erst muss ich das hier posten damit mir das selbst ins auge springt....
Ich habe zwar keinen Computer, aber was soll's.
Ich hab mir zum üben, eine Tastatur aus Papier gemacht.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Golden_Boy« (26.06.2015, 16:41)


2

26.06.2015, 16:44

Ohne den Compilerfehler kann man nur raten.

Ich tippe mal drauf das eventuell die richtige Header Datei für srand nicht includiert wird.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

3

26.06.2015, 16:45

Moin,

schreib doch noch dazu, was der Fehler war. Falls einer über die Suche auf den Thread stößt, kann er es nachlesen.

Grüße,

4

26.06.2015, 16:50

Fehler 1: (Zeile: 6)

Zitat

#include <Windows.h>



Fehler 2: (Zeile: 27)

Zitat

int Highscore = 100;



Fehler 3: (Zeile: 85)

Zitat

ZeigenInfos();
Ich habe zwar keinen Computer, aber was soll's.
Ich hab mir zum üben, eine Tastatur aus Papier gemacht.

5

26.06.2015, 17:31

Zusatzfrage noch wegen der Plattformunabhängigen Lösung.

Zitat

Natürlich gibt es dennoch eine Lösung, sogar eine recht einfache.
Wir inkludieren statt <windows.h> einfach <time.h>, verwerfen Zeile 10 und benutzen in
Zeile 30 die Funktion time().


Ich hab es so gemacht wie der Autor es beschreibt.
Leider wird mir time(); als Fehler angezeigt. Wie muss denn die korrekte Initialisierung von time aussehen in Zeile 30?
Ich habe zwar keinen Computer, aber was soll's.
Ich hab mir zum üben, eine Tastatur aus Papier gemacht.

6

26.06.2015, 18:40

Für time() brauchst du <ctime>, srand() und rand() brauchst du <cstdio>. Unter windows ist groß/kleinschreibung bei pfaden übrigens egal.

7

26.06.2015, 18:52

Für time() brauchst du <ctime>, srand() und rand() brauchst du <cstdio>. Unter windows ist groß/kleinschreibung bei pfaden übrigens egal.

Also sind die Angaben des Autors falsch...

also statt
#include <windows.h>

#include <ctime>
#include <cstdio>

und wie initialisert man den Zufallsgenerator nun Plattformunabhängig?
Ich habe zwar keinen Computer, aber was soll's.
Ich hab mir zum üben, eine Tastatur aus Papier gemacht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

26.06.2015, 19:00

Das dürfte ohne Windows.h schon ok sein. Ist jetzt nicht der moderne C++ Weg, aber es tut für Deine Zwecke wohl ausreichend gut.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

9

26.06.2015, 19:27

Statt time() aus ctime hat der autor eben timeGetTime() aus windows.h benutzt.

Hello_Kitty!

unregistriert

10

26.06.2015, 19:41

Also sind die Angaben des Autors falsch...

Nein, bei time.h und ctime handelt es sich um den gleichen Header, deshalb ist die Angabe des Autors schon richtig. C-Header folgen dem klassischen Schema "dateiname.h", C++-Header verwenden gar keine Dateiendung und stellen den aus C übernommenen Headern zusätzlich ein kleines "c" voran. Da es sich bei C++ vereinfacht um eine Übermenge von C handelt, werden beide Schema unterstützt. Da du mit der WinApi ja hauptsächlich C programmierst, spricht nichts gegen eine Verwendung von time.h.

Du solltest uns deinen Aufruf von time() mit dem zugehörigen Fehler zeigen. Hier kannst du dir ein Beispiel für einen korrekten Aufruf ansehen. Es gibt einen optionalen Parameter, um die Zeitinformation in einer Struktur zurückzuerhalten. Du brauchst das für deinen Zweck jedoch nicht und in diesem Fall soll man NULL übergeben.

Werbeanzeige