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

05.11.2013, 17:11

Simulator -> Mehrere Probleme

Tag,

Ich habe mich mal an einem kleinen "Stadt" Simulator gewagt.
Main:

C#-Quelltext

1
2
#include "iostream"#include "SimuCore.cpp"
int main(){ int Money;std::cin >> Money;Game MainGame(Money); return 0;}



Die MainCore:

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
class Game {
    bool IsRunning;
    int People;
    int Days;
    int Houses;
    int Money;
    int PeopleCopy;
    int DeathCounter;
    int i;
  public: Game(int GetMoney = 10) {
    IsRunning = true;
    Money = GetMoney;
    People = 8;
    Days = 0;
    Houses = 2;
    DeathCounter = 0;   //Init the Games vars
    NewDay();
  } 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 (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
    getchar();
    NewDay();
    }
    void BuildNew()     //Try build a new house
    {
    if (Money >= 50) {
        Houses += 1;
        Money -= 50;
    }
    }
    int BuyFood() {
    if (Money >= 2) {
        Money -= 2;
        return 1;
    }
    return 0;
    }
};



Alles funktionierte, als ich einen festen Start Geld Wert hatte.
Dies war mir zu langweilig, und ich wollte ihn durch eine User eingabe festlegen.
Schon kommen die Probleme.

Nach der Eingabe des Wertes (gültiger int) ergebnis: Es werden direkt 2 Tage ausgegeben (Sollte normal nach einem Tag auf "ENTER" warten, um nächsten tag zu starten)
Nach Eingabe eines ungültigen wertes sollte eigentlich der standardwert im konstruktor automatisch 10 betragen. Ergebnis: Das Geld beträgt -858993449 - Es werden direkt 3 Tage angezeigt.

Am besten ihr c&p diesen code kurz in eigene dateien und testet es, falls ich es zu schwer erklärt habe.

Und: Gibt es verbesserungen in meinem Schreibstil? (C++ Schreibstil)

Edit: Die Codetags scheinen verbuggt zu sein, das wird alles in 2 zeilen gepresst?

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »BlueCobold« (05.11.2013, 18:02)


FSA

Community-Fossil

  • Private Nachricht senden

2

05.11.2013, 17:41

Formatiere bitte deinen Code richtig ;) So ist es zu viel Aufwand alles zu lesen.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

3

05.11.2013, 17:54

Ich habe ihn formatiert in die Tags kopiert -> Alles wird automatisch eingerückt?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

05.11.2013, 17:57

Der "Standardwert" im Konstruktor gilt aber auch nur dann, wenn Du nichts übergibst. Wenn Du Mist übergibst, wird auch Mist übernommen.
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]

5

05.11.2013, 18:02

Habe mal die code tags entfernt.
@Blue, und die anderen fehler?

CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

6

05.11.2013, 18:02

Um das Problem mit dem (ersten) übersprungenen getchar() zu beheben kannst du einfach "::std::cin.seekg(::std::ios::end, ::std::ios::beg);" nach "cin >> Money;" setzen.

Abgesehen davon würde ich dir raten, deinen Schreibstil insofern zu ändern, so dass du deine Hauptschleife ungefähr so aufbaust:

C-/C++-Quelltext

1
2
3
4
while( game.IsRunning() )
{
    game.DoSimulation();
}


und keine rekursive "Endlosschleife" verwendest.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »CentuCore« (05.11.2013, 18:09)


7

05.11.2013, 18:10

War auch meine erste Idee, aber dann wird die Core Klasse ja dauernd neu aufgerufen.

Das Überspringen ist gelöst, danke Centu!

CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

8

05.11.2013, 18:13

Wie meinst du neuaufgerufen?
Falls du damit meinst, dass du jedes Mal einen Methoden-Aufrufst machst, ist das doch genau was du möchtest. ?(

9

05.11.2013, 18:15

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

CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

10

05.11.2013, 18:17

Das war ja nur als grobes Konzept gedacht, du kannst immer noch getchar() oder ähnliches danach setzen um die Schleife zu pausieren.

Werbeanzeige