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

11

05.11.2013, 18:20

Schon geändert^^
Main:

C-/C++-Quelltext

1
while (MainGame.IsRunning){MainGame.DoSimulation();}



Core:

C-/C++-Quelltext

1
void DoSimulation() {       NewDay();       getchar();  }

12

05.11.2013, 19:28

Gerne würde ich noch wissen, wie mein c++ schreibstil so ist. (In der GameCore.cpp)
Kann ich irgendetwas verbessern?

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

13

05.11.2013, 20:04

Quellcode

1
2
3
4
5
6
7
if( foo )
{
}
else
{
   bar
}


einfach als

Quellcode

1
2
3
4
if( !foo )
{
   bar
}


schreiben. Und return 1/0 einfach als return true/false (und die methode dann nicht int sondern bool zurückgeben lassen)

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

14

05.11.2013, 20:23

Was ich empfehlen würde, anders zu machen:
  1. Nutze im Konstruktor die Initlialiserliste für Memberinitialisierungen
  2. Du deklarierst die Variable "i" als Klassenmember obwohl du sie als lokale Iterationsvariable verwendest. Da würde ich drigend empfehlen zu ändern. Als Faustregel: Deklariere Variablen immer so spät wie Möglich.
  3. Schleifen die bei 1 beginnen und dann das Maximum noch mit einschließen sind absolut unüblich und sorgen für Verwirrung. Außerdem sind sie in Verbindung mit Arrays oder allgemein Containern auch gefährlich bzw. komplizierter zu Verwenden.
  4. Die Klammerung und Einrückung ist purer Horror, hier solltest du konsistent bleiben. Möglicherweise liegt das aber auch an deinen Forenproblem.
  5. In "BuildNew" gibst du einen Integer zurück, meinst aber ganz offentlich eigentlich einen Bool.
  6. Ich würde in C(++) grundsätzlich abraten, die eingebauten Typen zu verwenden, weil ihre Größe nicht definiert ist. Auf anderen Compilern, anderen Einstellungen oder Platformen kann es potenziell Probleme geben. Zwar ist "int" heutzutage meistens 32 Bit groß, aber niemand garantiert dir das. Um das Problem gleich von vorn herein zu vermeiden, gibt es in den Header "cstddef" und "cstdint" die Type Aliases "std::int*_t" und Konsorten sowie auch "std::size_t".
Gerade beim Schreibstil gibt es zum Teil noch weitere Punkte die ich anders empfehlen würde, jedoch gibt es da teilweise auch kontroverse Ansichten.

Um noch etwas Positives zu sagen: Dein Code sieht objektorientiert aus. :)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Spiele Programmierer« (05.11.2013, 21:26)


15

05.11.2013, 21:19

Vielen Dank für die Hilfe.
Ich habe den Code etwas überarbeitet.


Main:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "iostream"
#include "SimuCore.cpp"

int main()
{
int Money;
std::cout << "Please insert the start money: ";
std::cin >> Money;
std::cin.seekg(::std::ios::end, ::std::ios::beg);
Game MainGame(Money);
while (MainGame.IsRunning)
{
MainGame.DoSimulation();
}
    return 0;
}


Core:

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
#include "iostream"

class Game
{
public:
    bool IsRunning;
private:
    int People;
    int Days;
    int Houses;
    int Money;
    int PeopleCopy;
    int DeathCounter;
    public:
    Game(int GetMoney = 10)
    {
    IsRunning = true;
    Money = GetMoney;
    People = 8; Days = 0; Houses = 2; DeathCounter = 0; //Init the Games vars
    }
    void DoSimulation()
    {
        NewDay();
        getchar();
    }
private:
    void NewDay() //New Day Beginns, update all Vars
    {
        Days += 1;
        std::cout << "New Day: " << Days << std::endl;
        std::cout << "##########################" << std::endl;
        Money += People; //People pay tax
        PeopleCopy = People;
        for (int i = 1; i <= PeopleCopy; ++i) //Try to buy food for every People
        {
        if (BuyFood()){}
        else {--People; ++DeathCounter; } //If not enough food -> People Die
        }
        BuildNew();
        if (People != Houses * 4){++People;} //If enough space in a house, a new person go into it
        std::cout << "People: " << People << " #### Houses: " << Houses <<" #### Money: " << Money  << " #### This Day People Died: " << DeathCounter << std::endl; //give out game informations
        std::cout << "##########################" << std::endl;
        DeathCounter = 0; //reset DeathCount
    }
    void BuildNew() //Try build a new house
    {
        if (Money >= 50)
        {
            Houses+=1;
            Money -= 50;
        }
    }

    bool BuyFood()
    {
        if (Money >= 2)
        {
            Money -= 2;
            return true;
        }
        return false;
    }
};


Wenn ich Daten Container durchlaufe, beginne ich natürlich schleifen mit 0.
Die Klammer struktur bzw. die komplette struktur wurde von einem Mod im ersten Beitrag perfekt eingefügt, danke dafür.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Luk.« (06.11.2013, 15:57)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

16

06.11.2013, 04:15

Nein, in deinem Beispiel wird ja
game.DoSimulation();
Immer aufgerufen (im milisekunden takt).

Das stimmt nicht ganz. Je nach Rechnergeschwindigkeit und Inhalt wird diese Methode beliebig oft aufgerufen. Er rechnet einfach mit 100% weiter wenn du keine Pause einbaust.

Als Programmierer oder Spieleentwickler musst du in der Lage sein Probleme zu lösen. Hättest du ein bisschen herumprobiert hättest du gemerkt, dass du den Code im Tab "Quellcode" posten musst damit er richtig formatiert wird.
Header der Standardbibliothek bindet man übrigens immer mit den Spitzen klammern < und > ein. .cpp Dateien werden NIEMALS per include eingebunden! In den ersten zwei Zeilen elementare Fehler. Besorg dir mal nen Buch :D
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

17

06.11.2013, 15:55

Nein, in deinem Beispiel wird ja
game.DoSimulation();
Immer aufgerufen (im milisekunden takt).

Das stimmt nicht ganz. Je nach Rechnergeschwindigkeit und Inhalt wird diese Methode beliebig oft aufgerufen. Er rechnet einfach mit 100% weiter wenn du keine Pause einbaust.

Als Programmierer oder Spieleentwickler musst du in der Lage sein Probleme zu lösen. Hättest du ein bisschen herumprobiert hättest du gemerkt, dass du den Code im Tab "Quellcode" posten musst damit er richtig formatiert wird.
Header der Standardbibliothek bindet man übrigens immer mit den Spitzen klammern < und > ein. .cpp Dateien werden NIEMALS per include eingebunden! In den ersten zwei Zeilen elementare Fehler. Besorg dir mal nen Buch :D
Das Problem ohne die Pause habe ich direkt danach schon überdacht.
Den code habe ich formatiert.

Bücher Kaufen?
Welches C++ Buch [Anfänger]

habe ich genug. Dazu habe ich mir auch noch the c++ programming language geholt, um direkt mit bjarnes büchern weiterzumachen.

Werbeanzeige