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

GMoney597

Frischling

  • »GMoney597« ist der Autor dieses Themas

Beiträge: 48

Wohnort: Roth

Beruf: Verwaltungsfachangesteller (Stadtverwaltung), Fitness-Trainer und Muay-Thai-Trainer

  • Private Nachricht senden

1

16.09.2014, 10:42

Spielerreihenfolge - geht das nicht einfacher

Hallo Leute,

mich plagt ein optisches Problem - kurz: sieht doch scheisse aus

Ich möchte ein Spielermenü haben, in welchem die Spieler solange ihre Aktionen ausführen, bis sie an den
nächsten Spieler weitergeben, oder das Spiel beenden.

In der Folge kommt noch, wenn beendet werden soll, dass gespeichert wird, aber das ist hier nicht das Problem.

Das Problem ist, dass ich zwei IF-Schachteln drin habe, nur um sauber aus dem Menü auszusteigen, dass muss es
doch schöner geben, oder?

Hinweis: ich arbeite mit Pocket CPP, Visual Studio Express 2013 und noch nicht mit C++11 - Standard

Danke Euch

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
int main()
{
    vector <Spieler> Teilnehmer;
    
    Initialize(Teilnehmer);
    Information(Teilnehmer);
    
    bool Ende = false;
    int size = Teilnehmer.size();

    do
    {
        if (Ende == false)
        {
            for (int i = 0; i < size; i++)
            {
                if (Ende == false)
                {
                    Ende = Teilnehmer.at(i).Turn();
                }
            }
        }
    }while (Ende == false);
    
    cin.get();
    return 0;
}


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
//die funktion dazu

bool Spieler::Turn()
{
    int Auswahl;

    do
    {
        cout << "\n" << Name << ", was moechtest Du tun: " << endl;
        cout << "1 - Kaufen" << endl;
        cout << "2 - Verkaufen" << endl;
        cout << "3 - Bauen" << endl;
        cout << "4 - Naechster Spieler" << endl;
        cout << "5 - Beenden" << endl;
        cout << "Deine Wahl: ";
        cin >> Auswahl;
    
        switch(Auswahl)
        {   
            case 1:
                cout << "Es wird gekauft" << endl;
                break;
            case 2:
                cout << "Es wird verkauft" << endl;
                break;
            case 3:
                cout << "Es wird gebaut" << endl;
                break;
            case 4:
                cout << "Naechster Spieler ist dran" << endl;
                break;
            case 5:
                return true;
                break;
            default:
                cout << "Nur Werte von 1 - 4 eingeben." << endl;
                break;
        }
    }while (Auswahl != 4);
}

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

16.09.2014, 10:54

Ja puh... Gibt jetzt halt 100 und 1 Ansätze wie du es anders machen kannst.
Dein Weg mag jetzt nicht unbedingt der schönste sein(wobei es auch wesentlich schlimmeres gibt), aber wenn er funktioniert ist das für dich zum Lernen doch voll ok.

Aber hier mal ein simpler Weg für zumindest 2 Spieler:

C-/C++-Quelltext

1
2
3
4
5
6
bool playerTurn = false; // false = 1. spieler, true = 2. spieler

void doTurn(..., &playerTurn) {
    playerTurn = !playerTurn;

}


Für mehrere Spieler ist dein Weg halt vor allem eines: Einfach. Und darauf kommts doch an. Du könntest jetzt mit irgendwelchen großen Designpatterns ankommen oder so aber das ist glaube ich noch am Ziel vorbeigeschossen.
WIP Website: kevinheese.de

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »KeksX« (16.09.2014, 11:05)


Tobiking

1x Rätselkönig

  • Private Nachricht senden

3

16.09.2014, 11:46

Für welchen Fall brauchst du denn das äußere IF?

GMoney597

Frischling

  • »GMoney597« ist der Autor dieses Themas

Beiträge: 48

Wohnort: Roth

Beruf: Verwaltungsfachangesteller (Stadtverwaltung), Fitness-Trainer und Muay-Thai-Trainer

  • Private Nachricht senden

4

16.09.2014, 11:59

Für welchen Fall brauchst du denn das äußere IF?


@Tobiking nach deinem Beitrag habe ich es nochmal probiert und auf einmal klappt es, bislang wäre ich nahezu verrückt geworden - aber das ist schon mal eine Schale weniger, danke
@KeksX Dein Ansatz gefällt mir auch gut, aber für mein restliches Programm kann ich es leider nicht verwenden, danke

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

16.09.2014, 11:59

Anstatt if (x == false) kannst du auch einfach if (!x) schreiben.
Weiterhin verstehe ich nicht, wieso du eine do ... while-Schleife benutzt, da doch eigentlich eine normale while-Schleife angebrachter wäre. Damit würdest du dir auch ein if sparen.
Generell finde ich deinen Code aber sehr unverständlich. Wenn ich das so ansehe, habe ich erstmal keine Ahnung, was das alles soll.

GMoney597

Frischling

  • »GMoney597« ist der Autor dieses Themas

Beiträge: 48

Wohnort: Roth

Beruf: Verwaltungsfachangesteller (Stadtverwaltung), Fitness-Trainer und Muay-Thai-Trainer

  • Private Nachricht senden

6

16.09.2014, 12:08

Oh, jetzt kommt ein ganz großer *respektierend verneig

Hey David,

ich setze ein Brettspiel um, dass ich es mobil auch unterwegs spielen kann.

Jetzt hat jeder Spieler in seinem Zug ja verschiedene Möglichkeiten des Handelns, ist der Spieler fertig, gibt er logischerweise an den nächsten Spieler weiter.

Sollte jetzt irgendwann ein mal der Gedanke aufkommen, das Spiel mal eben beenden zu müssen (mit/ohne speichern), dann muss ich aus der Spieler-Schleife ja
aussteigen, ohne dass die anderen Spieler nochmal gefragt werden, was sie tun wollen.

Ich habe die Do-While-Schleife schon so oft ein-/ausgebaut auf den Kopf gedreht und alles versucht, ständig ist er den restlichen Vektor (die anderen Spieler) durchlaufen
und wenn er auch nur anschneidet um festzustellen, das geht ja nicht, weil "Ende == true".

Von verschieden Foren, Büchern, Meinungen usw. habe ich mitgenommen, optimiere den Code erst, wenn es läuft.

Der gepostete Code ist nur ein 20tel (5%) meines anderen Projektcodes, es ging bei diesem Code nur für mich darum, die Spielerreihenfolge voll auszuloten, dass
mir da kein Fehler unterläuft. Zumindest keiner, der offensichtlich für einen Anfänger ist.

Natürlich haben die Eingaben im "vollen" Code auch ihre Wirkung als nur anzusagen, was passieren würde.

Außer, ich habe Dich jetzt missverstanden, wenn Du schreibst "dein Code ist sehr unverständlich"

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

16.09.2014, 12:13

Ich würde allgemein mehr Code zusammen fassen und in Funktionen und Klassen verpacken. Mach dir aus deinem Mainloop doch vielleicht mal eine Methode die das ganze kapselt. Dann lege ich dir das State-Pattern nage. Damit kannst du recht schön deine Gamestates umsetzen. Jetzt könntest du überlegen möglicherweise die Züge eines Spielers zu kapseln. Hier muss man natürlich ein wenig auf die Anforderung achten. Einfach mehr Struktur in das ganze bringen, dann sollte es auch leichter fallen solche Features einzubauen.

edit: Für die Züge der einzelnen Spieler würde sich das State-Pattern übrigens genau so anbieten. So könnten die Züge der einzelnen Spieler als Zustand modelliert werden.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

GMoney597

Frischling

  • »GMoney597« ist der Autor dieses Themas

Beiträge: 48

Wohnort: Roth

Beruf: Verwaltungsfachangesteller (Stadtverwaltung), Fitness-Trainer und Muay-Thai-Trainer

  • Private Nachricht senden

8

16.09.2014, 12:20

Dann lege ich dir das State-Pattern nage.


Wow, ich habe das mal angeklickt - ziemlich wild, da muss ich mich dann noch weiter einlesen.

Aber wie gesagt Schorsch, dieser Code ist nur ein 5% meines gesamten Codes und der andere Code, ist meiner Meinung nach, schon recht
kompakt und auf Funktionen und Klassen gegliedert.

Danke für den Tipp mit State-Pattern, ansehen werde ich es mir auf jeden Fall mal

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

9

16.09.2014, 14:14

Dann lege ich dir das State-Pattern nage.


Das wollte ich ihm zuerst auch empfehlen. Aber genau das meinte ich mit über dem Ziel hinausgeschossen. Da dürfte er länger an der FSM sitzen als am Spiel.
WIP Website: kevinheese.de

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

10

16.09.2014, 15:40

Variablen schreiben die meisten klein um sie von Klassen und Strukturen unterscheiden zu können.
Die kürzeste Variante wäre wohl:

C-/C++-Quelltext

1
for (int i = 0; i < size &&  !(Ende = Teilnehmer.at(i).Turn()); i++);

Das ist aber recht unübersichtlich. So würde ich es schreiben:

C-/C++-Quelltext

1
2
3
4
for (int i = 0; i < size && !ende; ++i)
{
    ende = Teilnehmer.at(i).Turn();
}
"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?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »NachoMan« (17.09.2014, 15:05)


Werbeanzeige