summaryrefslogtreecommitdiff
path: root/noncore/games/kcheckers/checkers.cpp
authorleseb <leseb>2002-03-14 10:31:39 (UTC)
committer leseb <leseb>2002-03-14 10:31:39 (UTC)
commit1003de6f3b0c508960e0e717333a64603fffb133 (patch) (unidiff)
treedbc1c56f0644f0348e35e6e5856ef07110f7fcb7 /noncore/games/kcheckers/checkers.cpp
parent13d8ac43bf8d4c6e492e57d2ab3c7353935a9365 (diff)
downloadopie-1003de6f3b0c508960e0e717333a64603fffb133.zip
opie-1003de6f3b0c508960e0e717333a64603fffb133.tar.gz
opie-1003de6f3b0c508960e0e717333a64603fffb133.tar.bz2
Initial commit
Diffstat (limited to 'noncore/games/kcheckers/checkers.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/kcheckers/checkers.cpp337
1 files changed, 337 insertions, 0 deletions
diff --git a/noncore/games/kcheckers/checkers.cpp b/noncore/games/kcheckers/checkers.cpp
new file mode 100644
index 0000000..1e4dd1f
--- a/dev/null
+++ b/noncore/games/kcheckers/checkers.cpp
@@ -0,0 +1,337 @@
1//
2// KCheckers Engine
3
4//
5// Board = 54 Fields:
6//
7// | 06 07 08 09| MAN2
8// |11 12 13 14 |
9// | 17 18 19 20|
10// |22 23 24 25 |
11// | 28 29 30 31|
12// |33 34 35 36 |
13// | 39 40 41 42|
14// |44 45 46 47 | MAN1
15
16#include <time.h>
17#include <stdlib.h>
18
19#include "checkers.h"
20
21
22Checkers::Checkers(int skill)
23{
24 for(int i=0;i<54;i++) board[i]=NONE;
25 board[6] =MAN2; board[7] =MAN2; board[8] =MAN2; board[9] =MAN2;
26 board[11]=MAN2; board[12]=MAN2; board[13]=MAN2; board[14]=MAN2;
27 board[17]=MAN2; board[18]=MAN2; board[19]=MAN2; board[20]=MAN2;
28 board[22]=FREE; board[23]=FREE; board[24]=FREE; board[25]=FREE;
29 board[28]=FREE; board[29]=FREE; board[30]=FREE; board[31]=FREE;
30 board[33]=MAN1; board[34]=MAN1; board[35]=MAN1; board[36]=MAN1;
31 board[39]=MAN1; board[40]=MAN1; board[41]=MAN1; board[42]=MAN1;
32 board[44]=MAN1; board[45]=MAN1; board[46]=MAN1; board[47]=MAN1;
33
34 levelmax=skill;
35
36 srand(time(0)); // Seed the random number generator
37}
38
39
40///////////////////////////////////////////////////
41//
42// User Functions
43//
44///////////////////////////////////////////////////
45
46
47bool Checkers::checkMove1()
48{
49 for(int i=6;i<48;i++)
50 {
51 switch(board[i])
52 {
53 case MAN1:
54 if(board[i-6]==FREE) return true;
55 if(board[i-5]==FREE) return true;
56 break;
57 case KING1:
58 if(board[i-6]==FREE) return true;
59 if(board[i-5]==FREE) return true;
60 if(board[i+5]==FREE) return true;
61 if(board[i+6]==FREE) return true;
62 }
63 }
64 return false;
65}
66
67
68////////////////////////////////////////////////////
69//
70// Computer Functions
71//
72////////////////////////////////////////////////////
73
74
75void Checkers::go2()
76{
77 level=0;
78 for(int i=6;i<48;i++) bestboard[i]=board[i];
79 turn();
80 for(int i=6;i<48;i++) board[i]=bestboard[i];
81 ;
82}
83
84
85void Checkers::turn(int &resMax,bool capture)
86{
87 if(level<levelmax)
88 {
89 bool f12,f13,f14,f17,f18,f19,f23,f24,f25,f28,f29,f30,f34,f35,f36,f39,f40,f41;
90 if(capture)
91 {
92 if(board[12]==NONE) {f12=true;board[12]=FREE;} else f12=false;
93 if(board[13]==NONE) {f13=true;board[13]=FREE;} else f13=false;
94 if(board[14]==NONE) {f14=true;board[14]=FREE;} else f14=false;
95 if(board[17]==NONE) {f17=true;board[17]=FREE;} else f17=false;
96 if(board[18]==NONE) {f18=true;board[18]=FREE;} else f18=false;
97 if(board[19]==NONE) {f19=true;board[19]=FREE;} else f19=false;
98 if(board[23]==NONE) {f23=true;board[23]=FREE;} else f23=false;
99 if(board[24]==NONE) {f24=true;board[24]=FREE;} else f24=false;
100 if(board[25]==NONE) {f25=true;board[25]=FREE;} else f25=false;
101 if(board[28]==NONE) {f28=true;board[28]=FREE;} else f28=false;
102 if(board[29]==NONE) {f29=true;board[29]=FREE;} else f29=false;
103 if(board[30]==NONE) {f30=true;board[30]=FREE;} else f30=false;
104 if(board[34]==NONE) {f34=true;board[34]=FREE;} else f34=false;
105 if(board[35]==NONE) {f35=true;board[35]=FREE;} else f35=false;
106 if(board[36]==NONE) {f36=true;board[36]=FREE;} else f36=false;
107 if(board[39]==NONE) {f39=true;board[39]=FREE;} else f39=false;
108 if(board[40]==NONE) {f40=true;board[40]=FREE;} else f40=false;
109 if(board[41]==NONE) {f41=true;board[41]=FREE;} else f41=false;
110 }
111
112 int b6=board[6];
113 int b7=board[7];
114 int b8=board[8];
115 int b9=board[9];
116 int b11=board[11];
117 int b12=board[12];
118 int b13=board[13];
119 int b14=board[14];
120 int b17=board[17];
121 int b18=board[18];
122 int b19=board[19];
123 int b20=board[20];
124 int b22=board[22];
125 int b23=board[23];
126 int b24=board[24];
127 int b25=board[25];
128 int b28=board[28];
129 int b29=board[29];
130 int b30=board[30];
131 int b31=board[31];
132 int b33=board[33];
133 int b34=board[34];
134 int b35=board[35];
135 int b36=board[36];
136 int b39=board[39];
137 int b40=board[40];
138 int b41=board[41];
139 int b42=board[42];
140 int b44=board[44];
141 int b45=board[45];
142 int b46=board[46];
143 int b47=board[47];
144
145 board[6]=FULL-b47;
146 board[7]=FULL-b46;
147 board[8]=FULL-b45;
148 board[9]=FULL-b44;
149 board[11]=FULL-b42;
150 board[12]=FULL-b41;
151 board[13]=FULL-b40;
152 board[14]=FULL-b39;
153 board[17]=FULL-b36;
154 board[18]=FULL-b35;
155 board[19]=FULL-b34;
156 board[20]=FULL-b33;
157 board[22]=FULL-b31;
158 board[23]=FULL-b30;
159 board[24]=FULL-b29;
160 board[25]=FULL-b28;
161 board[28]=FULL-b25;
162 board[29]=FULL-b24;
163 board[30]=FULL-b23;
164 board[31]=FULL-b22;
165 board[33]=FULL-b20;
166 board[34]=FULL-b19;
167 board[35]=FULL-b18;
168 board[36]=FULL-b17;
169 board[39]=FULL-b14;
170 board[40]=FULL-b13;
171 board[41]=FULL-b12;
172 board[42]=FULL-b11;
173 board[44]=FULL-b9;
174 board[45]=FULL-b8;
175 board[46]=FULL-b7;
176 board[47]=FULL-b6;
177
178 int res=-turn();
179
180 board[6]=b6;
181 board[7]=b7;
182 board[8]=b8;
183 board[9]=b9;
184 board[11]=b11;
185 board[12]=b12;
186 board[13]=b13;
187 board[14]=b14;
188 board[17]=b17;
189 board[18]=b18;
190 board[19]=b19;
191 board[20]=b20;
192 board[22]=b22;
193 board[23]=b23;
194 board[24]=b24;
195 board[25]=b25;
196 board[28]=b28;
197 board[29]=b29;
198 board[30]=b30;
199 board[31]=b31;
200 board[33]=b33;
201 board[34]=b34;
202 board[35]=b35;
203 board[36]=b36;
204 board[39]=b39;
205 board[40]=b40;
206 board[41]=b41;
207 board[42]=b42;
208 board[44]=b44;
209 board[45]=b45;
210 board[46]=b46;
211 board[47]=b47;
212
213 if(res>resMax)
214 {
215 resMax=res;
216 if(level==1)
217 {
218 for(int i=6;i<48;i++) bestboard[i]=board[i];
219 bestcounter=1;
220 }
221 }
222 else if(res==resMax && level==1)
223 {
224 bestcounter++;
225 if((rand()%bestcounter)==0)
226 {
227 for(int i=6;i<48;i++) bestboard[i]=board[i];
228 }
229 }
230
231 if(capture)
232 {
233 if(f12) board[12]=NONE;
234 if(f13) board[13]=NONE;
235 if(f14) board[14]=NONE;
236 if(f17) board[17]=NONE;
237 if(f18) board[18]=NONE;
238 if(f19) board[19]=NONE;
239 if(f23) board[23]=NONE;
240 if(f24) board[24]=NONE;
241 if(f25) board[25]=NONE;
242 if(f28) board[28]=NONE;
243 if(f29) board[29]=NONE;
244 if(f30) board[30]=NONE;
245 if(f34) board[34]=NONE;
246 if(f35) board[35]=NONE;
247 if(f36) board[36]=NONE;
248 if(f39) board[39]=NONE;
249 if(f40) board[40]=NONE;
250 if(f41) board[41]=NONE;
251 }
252 }
253 else if(resMax<0) resMax=0;
254}
255
256
257bool Checkers::checkMove2()
258{
259 for(int i=6;i<48;i++)
260 {
261 switch(board[i])
262 {
263 case MAN2:
264 if(board[i+5]==FREE) return true;
265 if(board[i+6]==FREE) return true;
266 break;
267 case KING2:
268 if(board[i-6]==FREE) return true;
269 if(board[i-5]==FREE) return true;
270 if(board[i+5]==FREE) return true;
271 if(board[i+6]==FREE) return true;
272 }
273 }
274 return false;
275}
276
277
278int Checkers::turn()
279{
280 int resMax=(level-levelmax)*10;
281 level++;
282 if(checkCapture2())
283 {
284 for(int i=6;i<48;i++)
285 {
286 switch(board[i])
287 {
288 case MAN2:
289 manCapture2(i,resMax);
290 break;
291 case KING2:
292 kingCapture2(i,UL,resMax);
293 kingCapture2(i,UR,resMax);
294 kingCapture2(i,DL,resMax);
295 kingCapture2(i,DR,resMax);
296 }
297 }
298 }
299 else if(checkMove2())
300 {
301 for(int i=6;i<48;i++)
302 {
303 switch(board[i])
304 {
305 case MAN2:
306 if(board[i+5]==FREE)
307 {
308 board[i]=FREE;
309 if(i>38) board[i+5]=KING2;
310 else board[i+5]=MAN2;
311 turn(resMax);
312 board[i+5]=FREE;
313 board[i]=MAN2;
314 }
315 if(board[i+6]==FREE)
316 {
317 board[i]=FREE;
318 if(i>38) board[i+6]=KING2;
319 else board[i+6]=MAN2;
320 turn(resMax);
321 board[i+6]=FREE;
322 board[i]=MAN2;
323 }
324 break;
325 case KING2:
326 kingMove2(i,resMax);
327 break;
328 }
329 }
330 }
331 else ;
332
333 level--;
334 return resMax;
335}
336
337