/
main.c
250 lines (206 loc) · 7.1 KB
/
main.c
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
//Anton Gärdälv 930930-8030
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#define GameHeigth 5 //Ändra för att ändra planens storlek
#define GameWidth 5 //Ändra för att ändra planens storlek
char PrintBoard(char GameBoard[GameHeigth][GameWidth]);
char PlayerMove(char GameBoard[GameHeigth][GameWidth]);
char ComputerMove(char GameBoard[GameHeigth][GameWidth]);
void CheckWin(char GameBoard[GameHeigth][GameWidth]);
int main()
{
char GameBoard[GameHeigth][GameWidth] = {" "}; //Skapar plan-arrayen
int NumberOfTurns = 0,Starter; //Antal rundor, vem som startar
int MaxRounds = GameHeigth*GameWidth; //Antal maxrundor=bredd*höjd
unsigned seed;
seed = (unsigned)time(NULL); //Seed för random
srand(seed);
Starter = 1+(rand()%2);
if(Starter==1) //Om spelaren ska börja
{
printf("You start!\n");
for(; ; ) //Manuellt exitad loop
{
PrintBoard(GameBoard); //Skriv ut planen
PlayerMove(GameBoard); //Be spelaren lägga ut en markör
CheckWin(GameBoard); //Kolla om någon vunnit
NumberOfTurns++;
if(NumberOfTurns == MaxRounds) //Om antalet rundor = maxrundor avsluta spelet
{
printf("Draw!");
break;
}
ComputerMove(GameBoard); //Slumpa en position åt datorn
CheckWin(GameBoard); //Kolla om någon vunnit
NumberOfTurns++;
}
}
else if(Starter==2) //Om datorn ska börja
{
printf("Ai starts!\n");
for(; ; )
{
ComputerMove(GameBoard);
CheckWin(GameBoard);
NumberOfTurns++;
if(NumberOfTurns == MaxRounds)
{
printf("Draw");
break;
}
PrintBoard(GameBoard);
PlayerMove(GameBoard);
CheckWin(GameBoard);
NumberOfTurns++;
}
}
return 0;
}
char PrintBoard(char GameBoard[GameHeigth][GameWidth]) //Funktion för att skriva ut planen
{
int i,j,x = 0;
printf("\nx");
for(x=0; x!=GameWidth;x++){ //Skriver ut spelplanens bredd
if(x == GameWidth-1) //Om det är det sista talet som ska skrivas ut
{
printf("| %d |",x+1);
}
else
{
printf("| %d ",x+1);
}
}
for (i = 0; i != GameHeigth; i++)
{
printf("\n%d", i + 1); //Skriv ut radnummer
for(j = 0; j != GameWidth; j++)
{
if(j == GameWidth-1) //Om det är den sista rutan som ska skrivas ut, skriv ut rutans innehåll + stäng rutan
{
printf("| %c |",GameBoard[i][j]);
}
else //Annars skriv ut rutans innehåll
{
printf("| %c ", GameBoard[i][j]);
}
}
}
return GameBoard; //Returnera planen
}
char PlayerMove(char GameBoard[GameHeigth][GameWidth]) //Funktion för att placera ut användarens val
{
int x, y;
printf("\nEnter X,Y coordinates for your move(EX: 1 1): ");
fflush(stdin);
scanf("%d", &x); //Scannar in x + y koordinater
scanf("%d", &y);
x-- ,y--; //Tar bort 1 från båda talen så de kommer in på rätt plats i arrayen
if(GameBoard[x][y]=='X'||GameBoard[x][y]=='O') //Om positionen spelaren angett är upptagen
{
printf("Invalid move, try again.\n");
PlayerMove(GameBoard);
}
else //Om positionen inte är upptagen placera ut spelarens markör
GameBoard[x][y] = 'X';
return GameBoard;
}
char ComputerMove(char GameBoard[GameHeigth][GameWidth]) //Funktion för att placera ut datorns markör
{
int ComputerX,ComputerY,Selected = 0;
unsigned seed;
seed = (unsigned)time(NULL); //Seed för random
srand(seed);
while(Selected == 0)
{
ComputerX = 1+(rand()%GameHeigth);//Slumpar ett tal mellan 1 och gameheigth
ComputerY = 1+(rand()%GameWidth); //Slumpar ett tal mellan 1 och gamewidth
ComputerX--,ComputerY--; //Tar bort 1 från båda talen så de kommer in på rätt plats i arrayen
if(GameBoard[ComputerX][ComputerY]!='X'||GameBoard[ComputerX][ComputerY]!='O') //Om platsen är upptagen
{
GameBoard[ComputerX][ComputerY] = 'O';
Selected = 1;
}
}
return;
}
void CheckWin(char GameBoard[GameHeigth][GameWidth]) //Funktion för att kolla om någon vunnit
{
int i = 0,j = 0;
for(i = 0;i<GameHeigth;i++) //Upprepa för höjden
{
for(j = 0;j<GameWidth;j++) //Upprepa för bredden
{
if(GameBoard[i][j]==GameBoard[i+1][j]&&GameBoard[i+1][j]==GameBoard[i+2][j]) //Om någon får 3 i rad vertikalt
{
if(GameBoard[i][j]=='X') //Om användaren vinner
{
PrintBoard(GameBoard); //Skriv ut planen
printf("\nYou beat the computer, congratulations!\n");
system("PAUSE");
exit(0);
}
else if(GameBoard[i][j]=='O') //Om datorn vinner
{
PrintBoard(GameBoard);
printf("\nThe computer beat you.");
system("PAUSE");
exit(0);
}
}
else if(GameBoard[i][j]==GameBoard[i][j+1]&&GameBoard[i][j+1]==GameBoard[i][j+2]) //Om någon får 3 i rad horisontellt
{
if(GameBoard[i][j]=='X')
{
PrintBoard(GameBoard);
printf("\nYou beat the computer, congratulations!\n");
system("PAUSE");
exit(0);
}
else if(GameBoard[i][j]=='O')
{
PrintBoard(GameBoard);
printf("\nThe computer beat you.");
system("PAUSE");
exit(0);
}
}
else if(GameBoard[i][j]==GameBoard[i+1][j+1]&&GameBoard[i+1][j+1]==GameBoard[i+2][j+2]) //Om någon får 3 i rad diagonellt neråt
{
if(GameBoard[i][j]=='X')
{
PrintBoard(GameBoard);
printf("\nYou beat the computer, congratulations!\n");
system("PAUSE");
exit(0);
}
else if(GameBoard[i][j]=='O')
{
PrintBoard(GameBoard);
printf("\nThe computer beat you.");
system("PAUSE");
exit(0);
}
}
else if(j>1&&GameBoard[i][j]==GameBoard[i+1][j-1]&&GameBoard[i+1][j-1]==GameBoard[i+2][j-2]) //Om någon får 3 i rad diagonellt uppåt, kan ge felaktigt utslag om i är mindre än 1
{
if(GameBoard[i][j]=='X')
{
PrintBoard(GameBoard);
printf("\nYou beat the computer, congratulations!\n");
system("PAUSE");
exit(0);
}
else if(GameBoard[i][j]=='O')
{
PrintBoard(GameBoard);
printf("\nThe computer beat you.\n");
system("PAUSE");
exit(0);
}
}
}
}
return;
}