summaryrefslogtreecommitdiff
path: root/noncore/games/kcheckers/echeckers.cpp
Unidiff
Diffstat (limited to 'noncore/games/kcheckers/echeckers.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/kcheckers/echeckers.cpp349
1 files changed, 349 insertions, 0 deletions
diff --git a/noncore/games/kcheckers/echeckers.cpp b/noncore/games/kcheckers/echeckers.cpp
new file mode 100644
index 0000000..1146059
--- a/dev/null
+++ b/noncore/games/kcheckers/echeckers.cpp
@@ -0,0 +1,349 @@
1//
2// English Checkers
3
4
5#include "echeckers.h"
6
7
8///////////////////////////////////////////////////
9//
10// User Functions
11//
12///////////////////////////////////////////////////
13
14
15bool ECheckers::go1(int from,int field)
16{
17 to=field;
18
19 if(checkCapture1())
20 {
21 bool capture=false;
22 switch(board[from])
23 {
24 case MAN1:
25 if(manCapture1(from,UL,capture)) return true;
26 if(manCapture1(from,UR,capture)) return true;
27 return false;
28 case KING1:
29 if(kingCapture1(from,UL,capture)) return true;
30 if(kingCapture1(from,UR,capture)) return true;
31 if(kingCapture1(from,DL,capture)) return true;
32 if(kingCapture1(from,DR,capture)) return true;
33 return false;
34 }
35 }
36 else
37 {
38 switch(board[from])
39 {
40 case MAN1:
41 if((to==(from-6))||(to==(from-5)))
42 {
43 board[from]=FREE;
44 if(to<10) board[to]=KING1;
45 else board[to]=MAN1;
46 return true;
47 }
48 return false;
49 case KING1:
50 if((to==(from-6))||(to==(from-5))||
51 (to==(from+5))||(to==(from+6)) )
52 {
53 board[from]=FREE;
54 board[to]=KING1;
55 return true;
56 }
57 return false;
58 }
59 }
60 return false;
61}
62
63
64bool ECheckers::checkCapture1()
65{
66 for(int i=6;i<48;i++)
67 {
68 switch(board[i])
69 {
70 case MAN1:
71 if(board[i-6]==MAN2 || board[i-6]==KING2)
72 if(board[i-12]==FREE) return true;
73 if(board[i-5]==MAN2 || board[i-5]==KING2)
74 if(board[i-10]==FREE) return true;
75 break;
76 case KING1:
77 if(board[i-6]==MAN2 || board[i-6]==KING2)
78 if(board[i-12]==FREE) return true;
79 if(board[i-5]==MAN2 || board[i-5]==KING2)
80 if(board[i-10]==FREE) return true;
81 if(board[i+5]==MAN2 || board[i+5]==KING2)
82 if(board[i+10]==FREE) return true;
83 if(board[i+6]==MAN2 || board[i+6]==KING2)
84 if(board[i+12]==FREE) return true;
85 }
86 }
87 return false;
88}
89
90
91// Return TRUE if a course of the user true
92// Return FALSE if a course of the user incorrect
93
94bool ECheckers::manCapture1(int from,int direction,bool &capture)
95{
96 int i=from+direction;
97 if(board[i]==MAN2 || board[i]==KING2)
98 {
99 int k=i+direction;
100 if(board[k]==FREE)
101 {
102 bool next=false;
103 int save=board[i];
104 board[from]=FREE;
105 board[i]=NONE;
106
107 if(k<10)
108 {
109 board[k]=KING1;
110 if(kingCapture1(k,direction+11,next)) {board[i]=FREE;return true;}
111 }
112 else
113 {
114 board[k]=MAN1;
115 if(manCapture1(k,UL,next)) {board[i]=FREE;return true;}
116 if(manCapture1(k,UR,next)) {board[i]=FREE;return true;}
117 }
118
119 if((!next) && k==to) {board[i]=FREE;return true;}
120
121 board[k]=FREE;
122 board[i]=save;
123 board[from]=MAN1;
124 capture=true;
125 }
126 }
127 return false;
128}
129
130
131bool ECheckers::kingCapture1(int from,int direction,bool &capture)
132{
133 int i=from+direction;
134 if(board[i]==MAN2 || board[i]==KING2)
135 {
136 int k=i+direction;
137 if(board[k]==FREE)
138 {
139 bool next=false;
140 int save=board[i];
141 board[from]=FREE;
142 board[i]=NONE;
143 board[k]=KING1;
144
145 if(direction==UL || direction==DR)
146 {
147 if(kingCapture1(k,UR,next)) {board[i]=FREE;return true;}
148 if(kingCapture1(k,DL,next)) {board[i]=FREE;return true;}
149 }
150 else
151 {
152 if(kingCapture1(k,UL,next)) {board[i]=FREE;return true;}
153 if(kingCapture1(k,DR,next)) {board[i]=FREE;return true;}
154 }
155 if(kingCapture1(k,direction,next)) {board[i]=FREE;return true;}
156
157 if((!next) && k==to) {board[i]=FREE;return true;}
158
159 board[k]=FREE;
160 board[i]=save;
161 board[from]=KING1;
162 capture=true;
163 }
164 }
165 return false;
166}
167
168
169////////////////////////////////////////////////////
170//
171// Computer Functions
172//
173////////////////////////////////////////////////////
174
175
176void ECheckers::kingMove2(int from,int &resMax)
177{
178 board[from]=FREE;
179
180 int i=from-6;
181 if(board[i]==FREE)
182 {
183 board[i]=KING2;
184 turn(resMax);
185 board[i]=FREE;
186 }
187
188 i=from-5;
189 if(board[i]==FREE)
190 {
191 board[i]=KING2;
192 turn(resMax);
193 board[i]=FREE;
194 }
195
196 i=from+5;
197 if(board[i]==FREE)
198 {
199 board[i]=KING2;
200 turn(resMax);
201 board[i]=FREE;
202 }
203
204 i=from+6;
205 if(board[i]==FREE)
206 {
207 board[i]=KING2;
208 turn(resMax);
209 board[i]=FREE;
210 }
211
212 board[from]=KING2;
213}
214
215
216bool ECheckers::checkCapture2()
217{
218 for(int i=6;i<48;i++)
219 {
220 switch(board[i])
221 {
222 case MAN2:
223 if(board[i+5]==MAN1 || board[i+5]==KING1)
224 if(board[i+10]==FREE) return true;
225 if(board[i+6]==MAN1 || board[i+6]==KING1)
226 if(board[i+12]==FREE) return true;
227 break;
228 case KING2:
229 if(board[i-6]==MAN1 || board[i-6]==KING1)
230 if(board[i-12]==FREE) return true;
231 if(board[i-5]==MAN1 || board[i-5]==KING1)
232 if(board[i-10]==FREE) return true;
233 if(board[i+5]==MAN1 || board[i+5]==KING1)
234 if(board[i+10]==FREE) return true;
235 if(board[i+6]==MAN1 || board[i+6]==KING1)
236 if(board[i+12]==FREE) return true;
237 }
238 }
239 return false;
240}
241
242
243// Return TRUE if it is possible to capture
244// Return FALSE if it is impossible to capture
245
246bool ECheckers::manCapture2(int from,int &resMax)
247{
248 bool capture=false;
249
250 int i=from+5;
251 if(board[i]==MAN1 || board[i]==KING1)
252 {
253 int k=from+10;
254 if(board[k]==FREE)
255 {
256 int save=board[i];
257 board[from]=FREE;
258 board[i]=NONE;
259 resMax--;
260 if(from>32)
261 {
262 board[k]=KING2;
263 if(!kingCapture2(k,UL,resMax)) turn(resMax,true);
264 }
265 else
266 {
267 board[k]=MAN2;
268 if(!manCapture2(k,resMax)) turn(resMax,true);
269 }
270 resMax++;
271 board[k]=FREE;
272 board[i]=save;
273 board[from]=MAN2;
274 capture=true;
275 }
276 }
277
278 i=from+6;
279 if(board[i]==MAN1 || board[i]==KING1)
280 {
281 int k=from+12;
282 if(board[k]==FREE)
283 {
284 int save=board[i];
285 board[from]=FREE;
286 board[i]=NONE;
287 resMax--;
288 if(from>32)
289 {
290 board[k]=KING2;
291 if(!kingCapture2(k,UR,resMax)) turn(resMax,true);
292 }
293 else
294 {
295 board[k]=MAN2;
296 if(!manCapture2(k,resMax)) turn(resMax,true);
297 }
298 resMax++;
299 board[k]=FREE;
300 board[i]=save;
301 board[from]=MAN2;
302 capture=true;
303 }
304 }
305
306 if(capture) return true;
307 return false;
308}
309
310
311bool ECheckers::kingCapture2(int from,int direction,int &resMax)
312{
313 int i=from+direction;
314 if(board[i]==MAN1 || board[i]==KING1)
315 {
316 int k=i+direction;
317 if(board[k]==FREE)
318 {
319 bool capture=false;
320 int save=board[i];
321 board[from]=FREE;
322 board[i]=NONE;
323 resMax--;
324
325 board[k]=KING2;
326 if(direction==UL || direction==DR)
327 {
328 if(kingCapture2(k,UR,resMax)) capture=true;
329 if(kingCapture2(k,DL,resMax)) capture=true;
330 }
331 else
332 {
333 if(kingCapture2(k,UL,resMax)) capture=true;
334 if(kingCapture2(k,DR,resMax)) capture=true;
335 }
336 if(kingCapture2(k,direction,resMax)) capture=true;
337
338 if(!capture) turn(resMax,true);
339 board[k]=FREE;
340
341 resMax++;
342 board[i]=save;
343 board[from]=KING2;
344 return true;
345 }
346 }
347 return false;
348}
349