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

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

51

28.07.2014, 21:17

Hab auch einmal eine kleine Version des Beispiels geschrieben und es verändert wie ich einige Dinge handhaben würde. Hab mehr oder weniger auch bei diesem kleinen Programm auf konkrete Objektorientierung verzichtet.

Auch bin ich momentan eher dabei printf und Co. zu benutzen da ich in meinen Programmen oft den Bitshift Operator an sich einsetze und dies etwas optisch trennen mag. (Also eher etwas sehr persönliches.)
Gedanken über aufgebähtes Kompilat oder Microperformance mache ich mir bei C++ auch nicht so sehr, da ist mir die Ausdrucksstärke wichtiger. Für alles andere gibt es passendere Sprachen. (Erlang, Fortan, C, … bla)

Die using std::### kann man meist weglassen, gilt jedoch nicht immer, deswegen hab ich sie ausgeschrieben.

Eventuell ist es ja für den ein oder anderen Interessant.

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
#include <cstdio>
#include <functional>

namespace {
    enum class Players : unsigned int {
        First = 1,
        One = First, Two, Three, Four,
        Last = Four
    };

    enum class Mode : unsigned int {
        First = 0,
        Single = First, Match, Team,
        Last = Team
    };
    
    enum class Level : unsigned int {
        First = 1,
        One = First, Two, Three,
        Last = Three
    };
    
    typedef std::function<void(Mode, Players)> Game;
    
    auto Play(const Game &game, Mode mode, Players players) -> void;

    template<typename T> auto Select(const std::string &msg) -> T;
}

auto main(int argc, char** argv) -> int {
    using std::printf;
    
    printf("Willkommen im Spiel. (strg+c zum Beenden druecken.)\n\n");
    
    switch (Select<Level>("Level")) {
    case Level::One:
        Play([](Mode mode, Players players) {
            printf("\nSpiel Level 1, Modus %u mit %u Spieler(n)\n", mode, players);
        }, Select<Mode>("Modus"), Select<Players>("Spielerzahl"));
        break;
        
    case Level::Two:
        Play([](Mode mode, Players players) {
            printf("\nSpiel Level 2, Modus %u mit %u Spieler(n)\n", mode, players);
        }, Select<Mode>("Modus"), Select<Players>("Spielerzahl"));
        break;
        
    case Level::Three:
        Play([](Mode mode, Players players) {
            printf("\nSpiel Level 3, Modus %u mit %u Spieler(n)\n", mode, players);
        }, Select<Mode>("Modus"), Select<Players>("Spielerzahl"));
        break;
        
    default:
        printf("\nSollte nie zu sehen sein!\n");
    }
}

namespace {
    auto Play(const Game &game, Mode mode, Players players) -> void {
        using std::printf;
        
        game(mode, players);
        
        printf("\nBis bald :)\n");
    }
    
    template<typename T> auto Select(const std::string &msg) -> T {
        using std::printf;
        using std::scanf;
        using std::getchar;
        
        auto clear_buffer = []() {
            // Clearing the input buffer
            auto c = '\0';
            while ((c = getchar()) != '\n' && c != EOF) { }
        };
        
        while (true) {
            printf("Bitte %s waehlen [%u bis %u]: ", msg.c_str(), T::First, T::Last);
            
            T select = T::First;
            switch (scanf("%u", &select)) {
            case 1:
                break;
                
            default:
                clear_buffer();
                printf("Ungueltige Eingabe!\n");
                continue;
            }
            
            switch (select >= T::First && select <= T::Last) {
            case true:
                return select;
                
            default:
                clear_buffer();
                printf("Ungueltige Wahl!\n");
                continue;
            }
        }
    }
}
:love: := Go;

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

52

28.07.2014, 21:49

Zitat von »H5::«

Gedanken über aufgebähtes Kompilat oder Microperformance mache ich mir bei C++ auch nicht so sehr, da ist mir die Ausdrucksstärke wichtiger. Für alles andere gibt es passendere Sprachen. (Erlang, Fortan, C, … bla)

Naja, C++ wurde/wird mit dem Ziel entwickelt, eine effiziente maschinennahe Abstraktion zu sein mit so Grundsätzen wie "you don't pay for what you don't use". C++ ist definitiv im Gegensatz zu zum Beispiel Java oder C# mit dem Ziel hoher Effizienz entwickelt worden. Im Gegensatz zu C soll C++ aber auch Ausdrucksstärke ermöglichen ohne die Effizienz grundsätzlich einzuschränken.

Ich bin nur grundsätzlich dagegen, Dinge unnötig ineffizient zu machen. Das hat in der Regel nichts mit der Ausdrucksstärke zu tun. Wenn es mehre Wege gleicher "Ausdrucksstärke" gibt, das selbe zu erreichen, sollte man den geringsten Overheads wählen.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (28.07.2014, 21:57)


H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

53

28.07.2014, 22:04

Naja, das kann sicher jeder machen wie er mag. Ich denke mir nur, wenn es einen (*1) effizienten Unterschied macht ob

std::cout << "Hello World" << std::endl;
oder
std::cout << "Hello World\n";

liegt der Fehler bereits bei (*2) der Benutzung der Konsolenausgabe. Einheitlichkeit ist mir dann wichtiger. Weiter gehe ich da jetzt aber nicht drauf ein.

Edit: Hätte wohl besser schreiben sollen: (*1), (*2).
:love: := Go;

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »H5::« (28.07.2014, 23:28)


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

54

28.07.2014, 22:15

Der Unterschied ist halt vom Standard vorgegeben. Einheitlichkeit und Konsistenz halte ich auch für wichtig, ist allerdings im dem Fall weder ein Grund für das eine noch für das andere.

Werbeanzeige