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

13.07.2014, 17:02

Listing 4.11 Zahlenraten

Hallo zusammen.
Ich habe grade das Zahlenratespiel aus Listing 4.11 programmiert bzw. es versucht...
Es läuft auch genau so wie es soll bis zu dem Moment, wo der vorherige Highscore NICHT übertroffen wird. Ist dies der Fall, so liegt der Highscore plötzlich bei enormen Werten wie 156.312 ..
Wird der Highscore übertroffen, so wird der neue Wert wie beabsichtigt richtig gespeichert und dient als Referenz für die nächste Runde..

Ich hab mich jetzt dusselig gesucht und finde den Fehler einfach nicht. Könnt ihr mal drüberschauen? Wäre super!

P.S. Mein Code wird sicher von demjenigen aus dem Buch abweichen, da ich es einfach mal blind selbst versucht habe...


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
#include <iostream>
#include <Windows.h>
#pragma comment (lib, "winmm.lib")
using namespace std;

int waehleLevel (int Level);
int Ratespiel (int Level, int Multiplikator, int Higscore);

int main ()
{
    char chStop;
    char chAuswahl;
    int Level = 1;
    int LevelMultiplikator = 10;
    int Highscore = 10;
    
    // Zufallsgenerator initialisieren 
    srand (timeGetTime());

    do 
    {
    cout << "Menue! \n (N)eues Spiel? \n (S)chwierigkeitsgrad einstellen? \n (H)ighscore anzeigen? \n Programm (b)eenden? \n Deine Wahl: ";
    cin >> chAuswahl;
    cout << endl << endl;

    switch (chAuswahl)
    {
    case ('N'):
    case ('n'):
        {       
            Highscore = Ratespiel (Level, LevelMultiplikator, Highscore);
        } break;

    case ('S'):
    case ('s'):
        {   
            Level = waehleLevel (Level);
        } break;

    case ('H'):
    case ('h'):
        {
            cout << "Highscore: " << Highscore << endl << endl;
        } break;

    case ('B'):
    case ('b'):
        {
            cout << "Bis zum naechsten Mal! " << endl;
        } break;

    default:
        {
            cout << "Falsche Eingabe! " << endl << endl;
        }


    } // Ende des Switch

    } while (chAuswahl != ('b'));
    
    cin >> chStop;
    return 0;
}

int waehleLevel (int Level)
{
    int temp;
    do
    {
            cout << "Aktueller Level: " << Level << endl;
            cout << "Neuer Level (1-10): " ;
            cin >> Level;
            if ((Level <= 0) || (Level >= 11))
            {
                cout << "Falsche Eingabe!" << endl;
            }
            cout << endl << endl;
    
    } while (( Level <= 0) || (Level >= 11));
            
            temp = Level;
            return temp;
}

int Ratespiel (int Level, int LevelMultiplikator, int Highscore)
{
    int Tipp;
            int Levelbereich; 
            int Zufallszahl;
            int Punkte;
            int Versuche = 0;
            Levelbereich = Level * LevelMultiplikator;
            Zufallszahl = (rand()%Levelbereich)+1;
            cout << "Die gesuchte Zahl liegt zwischen 1 und " << Levelbereich << " !" << endl;

        
            do
            {
                cout << "Dein Tipp: ";
                cin >> Tipp;
                cout << endl;

                if(Tipp < Zufallszahl)
                {
                    cout << "Die gesuchte Zahl ist groeßer! " << endl;
                }
                else if (Tipp > Zufallszahl)
                {
                    cout << "Die gesuchte Zahl ist kleiner! " << endl;
                }
                else
                {
                    cout << "Super, Zahl erraten! " << endl << endl;
                }

                Versuche ++;

            } while (Zufallszahl != Tipp);

            if ((Level * ((Level+3) - Versuche) > 0) == true)
            {
                Punkte = Level * ((Level+3) - Versuche);
                cout << "Deine Punkte: " << Punkte << endl;

                if (Punkte <= Highscore)
                {
                    cout << "Leider kein neuer Highscore!" << endl;
                }
                else
                {
                    cout << "Neuer Highscore!! " << endl;
                    Highscore = Punkte;
                    return Highscore;
                }
            }
            else
            {
                cout << "Leider keine Punkte!" << endl;
                return Highscore;
            }


}

2

13.07.2014, 18:32

Deine Funktion Ratespiel gibt im Falle von (Punkte <= Highscore) nichts zurück (Siehe Zeile 126).
Allerdings bist du auf den Rückgabewert dieser Funktion angewiesen: Highscore = Ratespiel (Level, LevelMultiplikator, Highscore);
Demnach: undefined beheaviour.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

3

13.07.2014, 19:02

Müsste da nicht eigentlich der Compiler anschlagen, weil du Funktion auf dem Weg nichts zurückgibt?
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

4

13.07.2014, 19:03

Super, danke dir!

5

13.07.2014, 19:04

Müsste da nicht eigentlich der Compiler anschlagen, weil du Funktion auf dem Weg nichts zurückgibt?


Der blieb stumm....

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

6

13.07.2014, 19:32

Welchen Compiler verwendest du?
Du solltest unbedingt alle üblichen Warnungen anschalten, falls das bei diesem nicht üblich ist.
Der MSVC gibt zum bei deinem Code standardmäßig aus: ".cpp(144) warning C4715: "Ratespiel": Nicht alle Steuerelementpfade geben einen Wert zurück."

7

14.07.2014, 16:54

Visual Studio Express 2012, nur hat er eben nix gesagt ^^

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

8

14.07.2014, 17:31

Ja, dann muss es eine Warnung geben...
Schau mal ob du in den Projekteinstellungen bei C++/Allgemein die Warnstufe auf mindestens Level 3 hast und nichts ignorierst. Wenn da nichts eingestellt ist, muss es Warnungen geben. Einfach nächstes mal genau in die Compilerausgabe schauen. ;)

Werbeanzeige