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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
/* tictactoe.c in 4 Gewinnt umwandeln */
#include <stdio.h>
#include <stdlib.h>
#ifdef __unix__
#define clrscr() printf("\x1B[2J")
#elif __BORLANDC__ && __MSDOS__
#include <conio.h>
#elif __WIN32__ || _MSC_VER
#define clrscr() system("cls")
#else
#define clrscr() printf("clrscr() – Fehler!!\n")
#endif
#define X 'X'
#define O 'O'
#define LEER ' '
#define GAME_OVER 0
#define A_WINNER 1
#define CONTINUE 2
/* Inhalt des 7 x 6 grossen Felds */
char TicTacToe[7][6] = { {' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' '} };
/* Spieler1 hat das Zeichen 'X' */
char Spieler1 = X;
/* Spieler2 hat das Zeichen 'O' */
char Spieler2 = O;
/* Anzahl der Felder, die besetzt werden können */
unsigned int felder = 42;
/* Funktionsprototypen */
void print_spielfeld(void);
char neuer_zug(char);
int if_win(void);
/* Gibt den aktuellen Zustand des Spielfelds aus */
void print_spielfeld(void) {
int i;
clrscr();
printf("\n\n\n\t\tVIER GEWINNT\n\n\n");
printf(" 1 2 3 4 5 6 7 \n +---+---+---+---+---+---+---+\n");
for(i = 0; i < 6; i++) {
printf(" %d | ",i+1);
printf("%c",TicTacToe[i][0]);
printf(" | ");
printf("%c",TicTacToe[i][1]);
printf(" | ");
printf("%c",TicTacToe[i][2]);
printf(" | ");
printf("%c",TicTacToe[i][3]);
printf(" | ");
printf("%c",TicTacToe[i][4]);
printf(" | ");
printf("%c",TicTacToe[i][5]);
printf(" | ");
printf("%c",TicTacToe[i][6]);
printf(" | ");
printf("%c",TicTacToe[i][7]);
printf(" \n");
if(i != 2) {
printf(" +---+---+---+---+---+---+---+\n");
}
else {
printf(" +---+---+---+---+---+---+---+\n");
}
}
}
/* Führt einen neuen Zug aus.
* char ch: Zeichen des Spielers, der an der Reihe ist, 'X'
* oder 'O'
* Rückgabewert: Zeichen des Spielers, der eben an der Reihe war
* falls ein Feld besetzt ist, wird der Rückgabewert vertauscht,
* damit der aktuelle Spieler nochmals seinen Zug machen kann.
* Hat ein Spieler gewonnen, gibt die Funktion die
* symb. Konstante GAME_OVER zurück
*/
char neuer_zug(char ch) {
unsigned int row, colum;
printf("\n\n\tSpieler \"%c\" ist an der Reihe\n\n",ch);
printf("\n\tZeile (1–7): ");
scanf("%d",&row);
printf("\n\tSpalte (1-6): ");
scanf("%d",&colum);
if(TicTacToe[row-1][colum-1] == LEER) {
/* Zeichen in das mehrdim. Array */
TicTacToe[row-1][colum-1] = ch;
print_spielfeld();
/* Haben wir schon einen Gewinner? */
if(if_win() == A_WINNER)
return GAME_OVER;
}
else { /* Ein bereits besetztes Feld */
print_spielfeld();
printf("\n!!! Feld ist bereits gesetzt !!!\n");
return (ch == X) ?O :X;
}
/* Sind bereits alle Felder besetzt? */
if(--felder > 0)
return ch;
else {
printf("\nAlle Felder sind besetzt – Unentschieden\n");
return GAME_OVER;
}
}
/* Auswertung aller Möglichkeiten, um einen Gewinner zu ermitteln
* Rückgabewert: symb. Konstante A_WINNER falls ein Gewinner
* ermittelt wurde oder die symb. Konstante CONTINUE zum
* Weiterspielen.
*/
int if_win(void) {
/* Zuerst Spieler1 'X' */
if(TicTacToe[0][0] == Spieler1 &&
TicTacToe[0][1] == Spieler1 &&
TicTacToe[0][2] == Spieler1 ||
TicTacToe[1][0] == Spieler1 &&
TicTacToe[1][1] == Spieler1 &&
TicTacToe[1][2] == Spieler1 ||
TicTacToe[2][0] == Spieler1 &&
TicTacToe[2][1] == Spieler1 &&
TicTacToe[2][2] == Spieler1 ||
TicTacToe[0][0] == Spieler1 &&
TicTacToe[1][0] == Spieler1 &&
TicTacToe[2][0] == Spieler1 ||
TicTacToe[0][1] == Spieler1 &&
TicTacToe[1][1] == Spieler1 &&
TicTacToe[2][1] == Spieler1 ||
TicTacToe[0][2] == Spieler1 &&
TicTacToe[1][2] == Spieler1 &&
TicTacToe[2][2] == Spieler1 ||
TicTacToe[0][0] == Spieler1 &&
TicTacToe[1][1] == Spieler1 &&
TicTacToe[2][2] == Spieler1 ||
TicTacToe[0][2] == Spieler1 &&
TicTacToe[1][1] == Spieler1 &&
TicTacToe[2][0] == Spieler1) {
printf("Spieler1 hat gewonnen\n");
return A_WINNER;
}
/* Jetzt Spieler2 'O' */
else if( TicTacToe[0][0] == Spieler2 &&
TicTacToe[0][1] == Spieler2 &&
TicTacToe[0][2] == Spieler2 ||
TicTacToe[1][0] == Spieler2 &&
TicTacToe[1][1] == Spieler2 &&
TicTacToe[1][2] == Spieler2 ||
TicTacToe[2][0] == Spieler2 &&
TicTacToe[2][1] == Spieler2 &&
TicTacToe[2][2] == Spieler2 ||
TicTacToe[0][0] == Spieler2 &&
TicTacToe[1][0] == Spieler2 &&
TicTacToe[2][0] == Spieler2 ||
TicTacToe[0][1] == Spieler2 &&
TicTacToe[1][1] == Spieler2 &&
TicTacToe[2][1] == Spieler2 ||
TicTacToe[0][2] == Spieler2 &&
TicTacToe[1][2] == Spieler2 &&
TicTacToe[2][2] == Spieler2 ||
TicTacToe[0][0] == Spieler2 &&
TicTacToe[1][1] == Spieler2 &&
TicTacToe[2][2] == Spieler2 ||
TicTacToe[0][2] == Spieler2 &&
TicTacToe[1][1] == Spieler2 &&
TicTacToe[2][0] == Spieler2) {
printf("Spieler2 hat gewonnen\n");
return A_WINNER;
}
return CONTINUE;
}
int main(void) {
char check = X;
/* Leeres Spielfeld ausgeben */
print_spielfeld();
do { /* War Spieler mit dem Zeichen 'X' gerade dran ... */
/* ... dann ist jetzt Spieler mit dem Zeichen 'O' dran */
if(check==X) {
check=neuer_zug(O);
}
else { /* ... ansonsten der Spieler mit dem Zeichen 'X' */
check=neuer_zug(X);
}
} while( check != GAME_OVER );
return EXIT_SUCCESS;
}
|