Skip to content

Commit ee3f40a

Browse files
authored
Tictactoe (#144)
1 parent 955e9c7 commit ee3f40a

10 files changed

Lines changed: 300 additions & 176 deletions

File tree

Makefile

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,8 @@ dir: files/*
5353
@cp files/vector.cpp vorkurs/lektion15/. > /dev/null
5454
@cp files/warnings.cpp vorkurs/lektion16/. > /dev/null
5555
@cp files/warnprim.cpp vorkurs/lektion16/. > /dev/null
56-
@cp files/tictactoe.cpp vorkurs/lektion17/. > /dev/null
56+
@cp files/tictactoe.cpp vorkurs/lektion14/. > /dev/null
5757
@cp files/assemble.cpp vorkurs/lektion18/. > /dev/null
58-
@echo "TTT-Dateien kompilieren…"
59-
@g++ -c -o vorkurs/lektion17/tictactoe.o files/ttt_closed/tictactoe.cpp > /dev/null
60-
@g++ -c -o vorkurs/lektion19/frage_feld_nummer.o files/ttt_closed/frage_feld_nummer.cpp > /dev/null
61-
@g++ -c -o vorkurs/lektion19/gewinnerin.o files/ttt_closed/gewinnerin.cpp > /dev/null
62-
@g++ -c -o vorkurs/lektion19/gebe_feld_aus.o files/ttt_closed/gebe_feld_aus.cpp > /dev/null
6358
@echo "Vorkurs-Verzeichnis erstellt."
6459
@echo "Wenn du das Verzeichnis überall hin kopiert hast, nutze "make nodir", um sicherzustellen, dass das Skript nächstes Jahr wieder funktioniert"
6560

files/solutions/tictactoe.cpp

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
#include <iostream>
2+
#include <array>
3+
4+
static std::string fts(int feld) {
5+
switch (feld) {
6+
case 0:
7+
return " ";
8+
case 1:
9+
return "X";
10+
case 2:
11+
return "O";
12+
default:
13+
return "?";
14+
}
15+
}
16+
17+
int frage_feld_nummer(std::array<int, 9> feld){
18+
int in = -1;
19+
while (true) {
20+
std::cout << "Gib ein Feld ein (0-8): ";
21+
std::cin >> in;
22+
if (in < 0 || in > 8) {
23+
std::cout << "Ungültige Feldnummer!" << std::endl;
24+
continue;
25+
}
26+
if (feld[in] != 0) {
27+
std::cout << "Feld ist besetzt!" << std::endl;
28+
continue;
29+
}
30+
break;
31+
}
32+
return in;
33+
}
34+
35+
void gebe_feld_aus(std::array<int, 9> feld){
36+
std::cout << " | | " << std::endl;
37+
std::cout << " " << fts(feld[0]) << " | " << fts(feld[1]) << " | " << fts(feld[2]) << " " << std::endl;
38+
std::cout << " | | " << std::endl;
39+
std::cout << "---+---+---" << std::endl;
40+
std::cout << " | | " << std::endl;
41+
std::cout << " " << fts(feld[3]) << " | " << fts(feld[4]) << " | " << fts(feld[5]) << " " << std::endl;
42+
std::cout << " | | " << std::endl;
43+
std::cout << "---+---+---" << std::endl;
44+
std::cout << " | | " << std::endl;
45+
std::cout << " " << fts(feld[6]) << " | " << fts(feld[7]) << " | " << fts(feld[8]) << " " << std::endl;
46+
std::cout << " | | " << std::endl;
47+
}
48+
49+
int gewinnerin(std::array<int, 9> feld){
50+
// Prüfe Reihen und Spalten
51+
for (int i = 0; i < 3; i++) {
52+
int a = feld[3*i] & feld[3*i+1] & feld[3*i+2];
53+
int b = feld[3*i] | feld[3*i+1] | feld[3*i+2];
54+
if (a == b && a != 0) {
55+
return feld[3*i];
56+
}
57+
a = feld[i] & feld[i+3] & feld[i+6];
58+
b = feld[i] | feld[i+3] | feld[i+6];
59+
if (a == b && a != 0) {
60+
return feld[i];
61+
}
62+
}
63+
// Prüfe Diagonale 1
64+
int a = feld[0] & feld[4] & feld[8];
65+
int b = feld[0] | feld[4] | feld[8];
66+
if (a == b && a != 0) {
67+
return feld[0];
68+
}
69+
70+
// Prüfe Diagonale 2
71+
a = feld[2] & feld[4] & feld[6];
72+
b = feld[2] | feld[4] | feld[6];
73+
if (a == b && a != 0) {
74+
return feld[2];
75+
}
76+
77+
for (int i = 0; i < 9; i++) {
78+
if (feld[i] == 0) {
79+
return 0;
80+
}
81+
}
82+
return 3;
83+
}
84+
85+
86+
87+
int main() {
88+
// Setup
89+
restart:
90+
std::array<int, 9> spielfeld{0};
91+
int current_player = 1;
92+
int input_player;
93+
94+
while (true) {
95+
// Input
96+
input_player = frage_feld_nummer(spielfeld);
97+
98+
// Update
99+
spielfeld[input_player] = current_player;
100+
int gewinner = gewinnerin(spielfeld);
101+
switch (gewinner) {
102+
case 1:
103+
std::cout << "Spieler 1 ist der Gewinner." << std::endl;
104+
goto restart;
105+
106+
case 2:
107+
std::cout << "Spieler 2 ist der Gewinner." << std::endl;
108+
goto restart;
109+
110+
case 3:
111+
std::cout << "Das Spiel endet unentschieden." << std::endl;
112+
goto restart;
113+
114+
default:
115+
current_player = (current_player == 2) ? 1 : 2;
116+
break;
117+
}
118+
119+
120+
// Display
121+
gebe_feld_aus(spielfeld);
122+
}
123+
return 0;
124+
}

files/solutions/tictactoe_easy.cpp

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
#include <iostream>
2+
#include <array>
3+
4+
std::string fts(int feld) {
5+
6+
if (feld == 0) {
7+
return " ";
8+
} else if (feld == 1) {
9+
return "X";
10+
} else if (feld == 2) {
11+
return "O";
12+
} else {
13+
return "?";
14+
}
15+
}
16+
17+
int frage_feld_nummer(std::array<int, 9> feld){
18+
int in = -1;
19+
bool valid = false;
20+
while (!valid) {
21+
std::cout << "Gib ein Feld ein (0-8): ";
22+
std::cin >> in;
23+
if (in < 0 || in > 8) {
24+
std::cout << "Ungültige Feldnummer!" << std::endl;
25+
}
26+
if (feld[in] != 0) {
27+
std::cout << "Feld ist besetzt!" << std::endl;
28+
}
29+
else {
30+
valid = true; // Markiert die Eingabe als gültig wenn keine Fehler aufgetauch sind
31+
}
32+
}
33+
return in;
34+
}
35+
36+
void gebe_feld_aus(std::array<int, 9> feld){
37+
std::cout << " | | " << std::endl;
38+
std::cout << " " << fts(feld[0]) << " | " << fts(feld[1]) << " | " << fts(feld[2]) << " " << std::endl;
39+
std::cout << " | | " << std::endl;
40+
std::cout << "---+---+---" << std::endl;
41+
std::cout << " | | " << std::endl;
42+
std::cout << " " << fts(feld[3]) << " | " << fts(feld[4]) << " | " << fts(feld[5]) << " " << std::endl;
43+
std::cout << " | | " << std::endl;
44+
std::cout << "---+---+---" << std::endl;
45+
std::cout << " | | " << std::endl;
46+
std::cout << " " << fts(feld[6]) << " | " << fts(feld[7]) << " | " << fts(feld[8]) << " " << std::endl;
47+
std::cout << " | | " << std::endl;
48+
}
49+
50+
int gewinnerin(std::array<int, 9> feld){
51+
// Prüfe Reihen und Spalten
52+
for (int i = 0; i < 3; i++) {
53+
int a = feld[3*i] & feld[3*i+1] & feld[3*i+2];
54+
int b = feld[3*i] | feld[3*i+1] | feld[3*i+2];
55+
if (a == b && a != 0) {
56+
return feld[3*i];
57+
}
58+
a = feld[i] & feld[i+3] & feld[i+6];
59+
b = feld[i] | feld[i+3] | feld[i+6];
60+
if (a == b && a != 0) {
61+
return feld[i];
62+
}
63+
}
64+
// Prüfe Diagonale 1
65+
int a = feld[0] & feld[4] & feld[8];
66+
int b = feld[0] | feld[4] | feld[8];
67+
if (a == b && a != 0) {
68+
return feld[0];
69+
}
70+
71+
// Prüfe Diagonale 2
72+
a = feld[2] & feld[4] & feld[6];
73+
b = feld[2] | feld[4] | feld[6];
74+
if (a == b && a != 0) {
75+
return feld[2];
76+
}
77+
78+
for (int i = 0; i < 9; i++) {
79+
if (feld[i] == 0) {
80+
return 0;
81+
}
82+
}
83+
return 3;
84+
}
85+
86+
87+
88+
int main() {
89+
// Setup
90+
std::array<int, 9> spielfeld{0};
91+
int current_player = 1;
92+
int input_player;
93+
94+
while (true) {
95+
// Input
96+
input_player = frage_feld_nummer(spielfeld);
97+
98+
// Update
99+
spielfeld[input_player] = current_player;
100+
int gewinner = gewinnerin(spielfeld);
101+
bool reset = false;
102+
103+
if (gewinner == 1 || gewinner == 2 || gewinner == 3) { // Prüft ob das Spiel beendet ist
104+
reset = true;
105+
if (gewinner == 1) {
106+
std::cout << "Spieler 1 ist der Gewinner." << std::endl;
107+
} else if (gewinner == 2) {
108+
std::cout << "Spieler 2 ist der Gewinner." << std::endl;
109+
} else {
110+
std::cout << "Das Spiel endet unentschieden." << std::endl;
111+
}
112+
}
113+
114+
if (current_player == 1) { // Wechselt den Spieler
115+
current_player = 2;
116+
} else {
117+
current_player = 1;
118+
}
119+
120+
// Display
121+
gebe_feld_aus(spielfeld);
122+
123+
if (reset) // Setzt das Spiel zurück falls es geendet hat
124+
{
125+
current_player = 1;
126+
for (int i = 0; i < 9; i++) {
127+
spielfeld[i] = 0;
128+
}
129+
reset = false;
130+
}
131+
}
132+
return 0;
133+
}

files/tictactoe.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
#include <iostream>
2-
#include <vector>
2+
#include <array>
3+
4+
int frage_feld_nummer(std::array<int ,9> feld){
5+
// Implementiere hier die Abfrage nach dem gespielten Feld //
6+
}
7+
8+
void gebe_feld_aus(std::array<int ,9>){
9+
// Hier wird die Funktion implementiert
10+
}
11+
12+
int gewinnerin(std::array<int ,9>){
13+
//Hier wird die Funktion implementiert
14+
}
315

4-
extern int frage_feld_nummer(std::vector<int> feld);
5-
// Fügt hier die anderen Funktionen ein
616

717
int main() {
818
// Setup

files/ttt_closed/frage_feld_nummer.cpp

Lines changed: 0 additions & 20 deletions
This file was deleted.

files/ttt_closed/gebe_feld_aus.cpp

Lines changed: 0 additions & 30 deletions
This file was deleted.

files/ttt_closed/gewinnerin.cpp

Lines changed: 0 additions & 36 deletions
This file was deleted.

files/ttt_closed/tictactoe.cpp

Lines changed: 0 additions & 5 deletions
This file was deleted.

0 commit comments

Comments
 (0)