summaryrefslogtreecommitdiff
path: root/noncore/games/kcheckers/rcheckers.cpp
Unidiff
Diffstat (limited to 'noncore/games/kcheckers/rcheckers.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/kcheckers/rcheckers.cpp36
1 files changed, 24 insertions, 12 deletions
diff --git a/noncore/games/kcheckers/rcheckers.cpp b/noncore/games/kcheckers/rcheckers.cpp
index a1c7afa..d808780 100644
--- a/noncore/games/kcheckers/rcheckers.cpp
+++ b/noncore/games/kcheckers/rcheckers.cpp
@@ -67,117 +67,123 @@ bool RCheckers::go1(int from,int field)
67 board[from]=FREE; 67 board[from]=FREE;
68 board[to]=KING1; 68 board[to]=KING1;
69 return true; 69 return true;
70 } 70 }
71 else if(board[i]==FREE) continue; 71 else if(board[i]==FREE) continue;
72 else break; 72 else break;
73 } 73 }
74 for(int i=from+5;;i+=5) 74 for(int i=from+5;;i+=5)
75 { 75 {
76 if(i==to) 76 if(i==to)
77 { 77 {
78 board[from]=FREE; 78 board[from]=FREE;
79 board[to]=KING1; 79 board[to]=KING1;
80 return true; 80 return true;
81 } 81 }
82 else if(board[i]==FREE) continue; 82 else if(board[i]==FREE) continue;
83 else break; 83 else break;
84 } 84 }
85 for(int i=from+6;;i+=6) 85 for(int i=from+6;;i+=6)
86 { 86 {
87 if(i==to) 87 if(i==to)
88 { 88 {
89 board[from]=FREE; 89 board[from]=FREE;
90 board[to]=KING1; 90 board[to]=KING1;
91 return true; 91 return true;
92 } 92 }
93 else if(board[i]==FREE) continue; 93 else if(board[i]==FREE) continue;
94 else break; 94 else break;
95 } 95 }
96 return false; 96 return false;
97 } 97 }
98 } 98 }
99 return false; 99 return false;
100} 100}
101 101
102 102
103bool RCheckers::checkCapture1() 103bool RCheckers::checkCapture1()
104{ 104{
105 for(int i=6;i<48;i++) 105 for(int i=6;i<48;i++)
106 { 106 {
107 switch(board[i]) 107 switch(board[i])
108 { 108 {
109 case MAN1: 109 case MAN1:
110 if(board[i-6]==MAN2 || board[i-6]==KING2) 110 if(board[i-6]==MAN2 || board[i-6]==KING2)
111 if(board[i-12]==FREE) return true; 111 if(board[i-12]==FREE) return true;
112 if(board[i-5]==MAN2 || board[i-5]==KING2) 112 if(board[i-5]==MAN2 || board[i-5]==KING2)
113 if(board[i-10]==FREE) return true; 113 if(board[i-10]==FREE) return true;
114 if(board[i+5]==MAN2 || board[i+5]==KING2) 114 if(board[i+5]==MAN2 || board[i+5]==KING2)
115 if(board[i+10]==FREE) return true; 115 if(board[((i+10) < 54) ? i+10 : 53]==FREE) return true;
116 if(board[i+6]==MAN2 || board[i+6]==KING2) 116 if(board[i+6]==MAN2 || board[i+6]==KING2)
117 if(board[i+12]==FREE) return true; 117 if(board[((i+12) < 54) ? i+12 : 53]==FREE) return true;
118 break; 118 break;
119 case KING1: 119 case KING1:
120 int k; 120 int k;
121 for(k=i-6;board[k]==FREE;k-=6); 121 for(k=i-6;board[k]==FREE;k-=6);
122 if(board[k]==MAN2 || board[k]==KING2) 122 if(board[k]==MAN2 || board[k]==KING2)
123 if(board[k-6]==FREE) return true; 123 if(board[k-6]==FREE) return true;
124 124
125 for(k=i-5;board[k]==FREE;k-=5); 125 for(k=i-5;board[k]==FREE;k-=5);
126 if(board[k]==MAN2 || board[k]==KING2) 126 if(board[k]==MAN2 || board[k]==KING2)
127 if(board[k-5]==FREE) return true; 127 if(board[k-5]==FREE) return true;
128 128
129 for(k=i+5;board[k]==FREE;k+=5); 129 for(k=i+5;board[k]==FREE;k+=5) {
130 if (k >= 49)
131 break;
132 }
130 if(board[k]==MAN2 || board[k]==KING2) 133 if(board[k]==MAN2 || board[k]==KING2)
131 if(board[k+5]==FREE) return true; 134 if(board[((k+5) < 54) ? k+5 : 53]==FREE) return true;
132 135
133 for(k=i+6;board[k]==FREE;k+=6); 136 for(k=i+6;board[k]==FREE;k+=6) {
137 if (k >=48)
138 break;
139 }
134 if(board[k]==MAN2 || board[k]==KING2) 140 if(board[k]==MAN2 || board[k]==KING2)
135 if(board[k+6]==FREE) return true; 141 if(board[((k+6) < 54) ? k+6 : 53]==FREE) return true;
136 } 142 }
137 } 143 }
138 return false; 144 return false;
139} 145}
140 146
141 147
142// Return TRUE if a course of the user true 148// Return TRUE if a course of the user true
143// Return FALSE if a course of the user incorrect 149// Return FALSE if a course of the user incorrect
144 150
145bool RCheckers::manCapture1(int from,int direction,bool &capture) 151bool RCheckers::manCapture1(int from,int direction,bool &capture)
146{ 152{
147 int i=from+direction; 153 int i=from+direction;
148 if(board[i]==MAN2 || board[i]==KING2) 154 if(board[i]==MAN2 || board[i]==KING2)
149 { 155 {
150 int k=i+direction; 156 int k=i+direction;
151 if(board[k]==FREE) 157 if(board[k]==FREE)
152 { 158 {
153 bool next=false; 159 bool next=false;
154 int save=board[i]; 160 int save=board[i];
155 board[from]=FREE; 161 board[from]=FREE;
156 board[i]=NONE; 162 board[i]=NONE;
157 163
158 if(k<10) 164 if(k<10)
159 { 165 {
160 board[k]=KING1; 166 board[k]=KING1;
161 if(kingCapture1(k,direction+11,next)) {board[i]=FREE;return true;} 167 if(kingCapture1(k,direction+11,next)) {board[i]=FREE;return true;}
162 } 168 }
163 else 169 else
164 { 170 {
165 board[k]=MAN1; 171 board[k]=MAN1;
166 if(direction==UL || direction==DR) 172 if(direction==UL || direction==DR)
167 { 173 {
168 if(manCapture1(k,UR,next)) {board[i]=FREE;return true;} 174 if(manCapture1(k,UR,next)) {board[i]=FREE;return true;}
169 if(manCapture1(k,DL,next)) {board[i]=FREE;return true;} 175 if(manCapture1(k,DL,next)) {board[i]=FREE;return true;}
170 } 176 }
171 else 177 else
172 { 178 {
173 if(manCapture1(k,UL,next)) {board[i]=FREE;return true;} 179 if(manCapture1(k,UL,next)) {board[i]=FREE;return true;}
174 if(manCapture1(k,DR,next)) {board[i]=FREE;return true;} 180 if(manCapture1(k,DR,next)) {board[i]=FREE;return true;}
175 } 181 }
176 if(manCapture1(k,direction,next)) {board[i]=FREE;return true;} 182 if(manCapture1(k,direction,next)) {board[i]=FREE;return true;}
177 } 183 }
178 184
179 if((!next) && k==to) {board[i]=FREE;return true;} 185 if((!next) && k==to) {board[i]=FREE;return true;}
180 186
181 board[k]=FREE; 187 board[k]=FREE;
182 board[i]=save; 188 board[i]=save;
183 board[from]=MAN1; 189 board[from]=MAN1;
@@ -241,117 +247,123 @@ bool RCheckers::kingCapture1(int from,int direction,bool &capture)
241// Computer Functions 247// Computer Functions
242// 248//
243//////////////////////////////////////////////////// 249////////////////////////////////////////////////////
244 250
245 251
246void RCheckers::kingMove2(int from,int &resMax) 252void RCheckers::kingMove2(int from,int &resMax)
247{ 253{
248 board[from]=FREE; 254 board[from]=FREE;
249 for(int i=from-6;board[i]==FREE;i-=6) 255 for(int i=from-6;board[i]==FREE;i-=6)
250 { 256 {
251 board[i]=KING2; 257 board[i]=KING2;
252 turn(resMax); 258 turn(resMax);
253 board[i]=FREE; 259 board[i]=FREE;
254 } 260 }
255 for(int i=from-5;board[i]==FREE;i-=5) 261 for(int i=from-5;board[i]==FREE;i-=5)
256 { 262 {
257 board[i]=KING2; 263 board[i]=KING2;
258 turn(resMax); 264 turn(resMax);
259 board[i]=FREE; 265 board[i]=FREE;
260 } 266 }
261 for(int i=from+5;board[i]==FREE;i+=5) 267 for(int i=from+5;board[i]==FREE;i+=5)
262 { 268 {
263 board[i]=KING2; 269 board[i]=KING2;
264 turn(resMax); 270 turn(resMax);
265 board[i]=FREE; 271 board[i]=FREE;
266 } 272 }
267 for(int i=from+6;board[i]==FREE;i+=6) 273 for(int i=from+6;board[i]==FREE;i+=6)
268 { 274 {
269 board[i]=KING2; 275 board[i]=KING2;
270 turn(resMax); 276 turn(resMax);
271 board[i]=FREE; 277 board[i]=FREE;
272 } 278 }
273 board[from]=KING2; 279 board[from]=KING2;
274} 280}
275 281
276 282
277bool RCheckers::checkCapture2() 283bool RCheckers::checkCapture2()
278{ 284{
279 for(int i=6;i<48;i++) 285 for(int i=6;i<48;i++)
280 { 286 {
281 switch(board[i]) 287 switch(board[i])
282 { 288 {
283 case MAN2: 289 case MAN2:
284 if(board[i-6]==MAN1 || board[i-6]==KING1) 290 if(board[i-6]==MAN1 || board[i-6]==KING1)
285 if(board[i-12]==FREE) return true; 291 if(board[i-12]==FREE) return true;
286 if(board[i-5]==MAN1 || board[i-5]==KING1) 292 if(board[i-5]==MAN1 || board[i-5]==KING1)
287 if(board[i-10]==FREE) return true; 293 if(board[i-10]==FREE) return true;
288 if(board[i+5]==MAN1 || board[i+5]==KING1) 294 if(board[i+5]==MAN1 || board[i+5]==KING1)
289 if(board[i+10]==FREE) return true; 295 if(board[((i+10) < 54) ? i+10 : 53]==FREE) return true;
290 if(board[i+6]==MAN1 || board[i+6]==KING1) 296 if(board[i+6]==MAN1 || board[i+6]==KING1)
291 if(board[i+12]==FREE) return true; 297 if(board[((i+12) < 54) ? i+12 : 53]==FREE) return true;
292 break; 298 break;
293 case KING2: 299 case KING2:
294 int k; 300 int k;
295 for(k=i-6;board[k]==FREE;k-=6); 301 for(k=i-6;board[k]==FREE;k-=6);
296 if(board[k]==MAN1 || board[k]==KING1) 302 if(board[k]==MAN1 || board[k]==KING1)
297 if(board[k-6]==FREE) return true; 303 if(board[k-6]==FREE) return true;
298 304
299 for(k=i-5;board[k]==FREE;k-=5); 305 for(k=i-5;board[k]==FREE;k-=5);
300 if(board[k]==MAN1 || board[k]==KING1) 306 if(board[k]==MAN1 || board[k]==KING1)
301 if(board[k-5]==FREE) return true; 307 if(board[k-5]==FREE) return true;
302 308
303 for(k=i+5;board[k]==FREE;k+=5); 309 for(k=i+5;board[k]==FREE;k+=5) {
310 if (k>=49)
311 break;
312 }
304 if(board[k]==MAN1 || board[k]==KING1) 313 if(board[k]==MAN1 || board[k]==KING1)
305 if(board[k+5]==FREE) return true; 314 if(board[((k+5) < 54) ? k+5 : 53]==FREE) return true;
306 315
307 for(k=i+6;board[k]==FREE;k+=6); 316 for(k=i+6;board[k]==FREE;k+=6) {
317 if (k>=48)
318 break;
319 }
308 if(board[k]==MAN1 || board[k]==KING1) 320 if(board[k]==MAN1 || board[k]==KING1)
309 if(board[k+6]==FREE) return true; 321 if(board[((k+6) < 54) ? k+6 : 53]==FREE) return true;
310 } 322 }
311 } 323 }
312 return false; 324 return false;
313} 325}
314 326
315 327
316// Return TRUE if it is possible to capture 328// Return TRUE if it is possible to capture
317// Return FALSE if it is impossible to capture 329// Return FALSE if it is impossible to capture
318 330
319bool RCheckers::manCapture2(int from,int &resMax) 331bool RCheckers::manCapture2(int from,int &resMax)
320{ 332{
321 bool capture=false; 333 bool capture=false;
322 334
323 int i=from-6; 335 int i=from-6;
324 if(board[i]==MAN1 || board[i]==KING1) 336 if(board[i]==MAN1 || board[i]==KING1)
325 { 337 {
326 int k=from-12; 338 int k=from-12;
327 if(board[k]==FREE) 339 if(board[k]==FREE)
328 { 340 {
329 int save=board[i]; 341 int save=board[i];
330 board[from]=FREE; 342 board[from]=FREE;
331 board[i]=NONE; 343 board[i]=NONE;
332 board[k]=MAN2; 344 board[k]=MAN2;
333 resMax--; 345 resMax--;
334 if(!manCapture2(k,resMax)) turn(resMax,true); 346 if(!manCapture2(k,resMax)) turn(resMax,true);
335 resMax++; 347 resMax++;
336 board[k]=FREE; 348 board[k]=FREE;
337 board[i]=save; 349 board[i]=save;
338 board[from]=MAN2; 350 board[from]=MAN2;
339 capture=true; 351 capture=true;
340 } 352 }
341 } 353 }
342 354
343 i=from-5; 355 i=from-5;
344 if(board[i]==MAN1 || board[i]==KING1) 356 if(board[i]==MAN1 || board[i]==KING1)
345 { 357 {
346 int k=from-10; 358 int k=from-10;
347 if(board[k]==FREE) 359 if(board[k]==FREE)
348 { 360 {
349 int save=board[i]; 361 int save=board[i];
350 board[from]=FREE; 362 board[from]=FREE;
351 board[i]=NONE; 363 board[i]=NONE;
352 board[k]=MAN2; 364 board[k]=MAN2;
353 resMax--; 365 resMax--;
354 if(!manCapture2(k,resMax)) turn(resMax,true); 366 if(!manCapture2(k,resMax)) turn(resMax,true);
355 resMax++; 367 resMax++;
356 board[k]=FREE; 368 board[k]=FREE;
357 board[i]=save; 369 board[i]=save;