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

17.08.2014, 14:26

Membervariable wird nicht korrekt gespeichert/übernommen

Tach

Ich komme mit einem Fehler in meinem Programm nicht weiter und hoffe Ihr könnt mir weiterhelfen. Erst mal der Code:

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
        // player shoots at enemy
        //
        if (start == 1)
        {

            // choose weapon
            //
            do
            {
                cout << "\nZur Verfuegung stehende Energie: " << pshipPlayer->m_energy << endl;
                cout << "Waehle Waffe" << endl;
                cout << "1. Laser / Energiebedarf: " << pshipPlayer->m_Lenergy << endl;
                cout << "2. Projektilwaffen / Energiebedarf: " << pshipPlayer->m_Penergy << endl;
                cout << "3. Rakete / Energiebedarf: " << pshipPlayer->m_Renergy << endl;
                cout << "\nAuswahl: ";
                cin >> pshipPlayer->m_weapon;

                // check if valid weapon has been chosen
                //
                if (pshipPlayer->m_weapon < 1 || pshipPlayer->m_weapon > 3)
                    cout << "\nUngueltige Eingabe" << endl;

                // check if enough energy is available
                //
                if (pshipPlayer->m_weapon >= 1 || pshipPlayer->m_weapon <= 3)
                {
                    if (pshipPlayer->m_weapon = 1)
                        weapon = pshipPlayer->m_Lenergy;
                    else if (pshipPlayer->m_weapon = 2)
                        weapon = pshipPlayer->m_Penergy;
                    else if (pshipPlayer->m_weapon = 3)
                        weapon = pshipPlayer->m_Renergy;

                    if (weapon > pshipPlayer->m_energy)
                    {
                        cout << "\nZu wenig Energie!" << endl;
                        pshipPlayer->m_weapon = 0;
                    }
                }

            } while (pshipPlayer->m_weapon < 1 || pshipPlayer->m_weapon > 3);

            // shoot weapon
            //
            cout << "Waffe " << pshipPlayer->m_weapon << " abgefeuert!" << endl;

            // AI defends
            //
            hit = AI(start, pshipPlayer, pshipEnemy);

            // check if AI ship was hit
            //
            if (hit == true)
                cout << "Feindliches Schiff getroffen! Seine Huelle ist runter auf " << pshipEnemy->m_hull << " Punkte." << endl;
            else if (hit == false)
                cout << "Feindliches Schiff leider nicht getroffen" << endl;

        } // player shoots at enemy


So, wie man sieht kann der Spieler eine Waffe auswählen mit der er auf den Feind schiesst. Das Spiel prüft dann noch ob er eine gültige Auswahl getroffen hat und ob er genügend Energie hat.

Nun das Problem das ich nicht verstehe:

Wenn ich eine Auswahl ausserhalb von 1-3 treffe kommt wie beabsichtigt die Fehlermeldung dass dies nicht geht und ich kann eine neue Auswahl treffen. Allerdings schiesst das Spiel trotzdem auf den Gegner, und zwar immer mit Waffe 1. Wenn ich eine Zahl zwischen 1-3 eingebe, egal welche, rechnet das Programm auch immer mit Waffe 1. Woran zum Teufel liegt das? Es schnallt ja wenn ich einen ungültigen Wert eingebe, d.h. er speichert den Wert den ich eingebe in der Variablen. Trotzdem setzt er die Variable immer automatisch auf 1, egal was ich eingebe?! ?(

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »theoneandonlyboiler« (17.08.2014, 14:31)


2

17.08.2014, 14:44

Hallo!

C-/C++-Quelltext

1
 if (pshipPlayer->m_weapon = 1)

Schau dir das mal genauer an und überlege, was an dieser Stelle passiert.

3

17.08.2014, 15:16

Jo, 27, 29 und 31. Wie Endgegner schon gesagt hat.

4

17.08.2014, 15:49

Ah nein, so ein bekloppter Anfängerfehler!!! :dash:

Aber eben, die offensichtlichsten sind ja bekanntlich die die am schwersten zu finden sind ;)

Danke!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »theoneandonlyboiler« (17.08.2014, 16:01)


Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

5

17.08.2014, 16:30

Also mit einem Debugger mal durchgehen und die Variableninhalte angucken hilft eigentlich bei solchen Fehlern extrem schnell 8|

6

18.08.2014, 12:13

Ich programmiere noch nicht lange und hab' mich bisher mit dem Debugging noch nicht wirklich auseinandergesetzt. Die paar Progrämmchen waren bisher noch nicht so umfangreich und Fehler eigentlich problemlos zu finden, ausser natürlich man ist blind wie ich :dead:

Ich hab den geposteten Codeblock bestimmt 'ne Stunde hypnotisiert ohne das Problem zu sehen. Als dann Endgegner geschrieben hat ich soll mir die Zeile nochmal genau anschauen war's mir sofort klar. :thumbsup:

Finde es allerdings interessant dass der Compiler da nicht meckert bei so was. Mit if mache ich ja 'ne Prüfung, und wenn dann bei den Kriterien anstelle einer Prüfung eine Zuweisung steht sollte er doch in der Lage sein zumindest eine Warnung auszugeben das da was nicht stimmen kann. ?(

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

18.08.2014, 12:40

Das ist gültiges C++. Er macht die Zuweisung und testet danach die Variable auf einen Wert != 0. In anderen Sprachen wäre das ein Compilefehler.
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]

8

18.08.2014, 13:13

Falls du in Visual Studio programmierst, kannst du für den Compiler eine höhere Warnstufe einstellen. Bei Warnstufe 4 werden auch für Zuweisungen in Conditionals Warnungen ausgegeben. Warnstufe 4 kannst du mit der Option /W4 wie hier beschrieben in den Projekteigenschaften einstellen.

Bei GCC gibt es dafür auch eine Option namens -Wparentheses.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

9

18.08.2014, 13:17

Ich programmiere noch nicht lange und hab' mich bisher mit dem Debugging noch nicht wirklich auseinandergesetzt. Die paar Progrämmchen waren bisher noch nicht so umfangreich und Fehler eigentlich problemlos zu finden, ausser natürlich man ist blind wie ich :dead: (


Man kann nicht früh genug damit anfangen zu lernen, wie man den Debugger benutzt.

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

10

18.08.2014, 14:44

Das ist gültiges C++. Er macht die Zuweisung und testet danach die Variable auf einen Wert != 0. In anderen Sprachen wäre das ein Compilefehler.


Wieso eigentlich? Ist das ein Relikt aus C, in dem es noch keine Booleans gab, um Abwärtskompatibilität zu garantieren?
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Werbeanzeige