Diffstat (limited to 'noncore/games/kcheckers/rcheckers.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/games/kcheckers/rcheckers.cpp | 36 |
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 | ||
103 | bool RCheckers::checkCapture1() | 103 | bool 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 | ||
145 | bool RCheckers::manCapture1(int from,int direction,bool &capture) | 151 | bool 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 | ||
246 | void RCheckers::kingMove2(int from,int &resMax) | 252 | void 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 | ||
277 | bool RCheckers::checkCapture2() | 283 | bool 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 | ||
319 | bool RCheckers::manCapture2(int from,int &resMax) | 331 | bool 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; |