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;
}
}
}
}
|