home *** CD-ROM | disk | FTP | other *** search
- #include "old.h"
-
- mate(n, f)
- {
- int a, b;
-
- mantom = !mantom;
- if(f == 0) {
- b = mater(n);
- mantom = !mantom;
- return(b);
- }
- b = 0;
- if(matflg) {
- a = 1;
- while(!mater(a)) {
- if(a >= n) {
- matflg = 0;
- return(0);
- }
- a++;
- }
- b = abmove;
- goto out;
- }
- a = n;
- while(mater(a)) {
- if(a == mdepth) {
- printf("Forced mate\n");
- matflg++;
- }
- b = abmove;
- if(a == 0)
- break;
- a--;
- }
- out:
- mantom = !mantom;
- if(b) {
- abmove = b;
- return(1);
- }
- return(0);
- }
-
- mater(ns)
- {
- int *p1, *p2, *p3, f;
-
- if(intrp || --ns < 0)
- return(0);
- p1 = lmp;
- p2 = p1;
- p3 = p1;
- mantom? wgen(): bgen();
- while(p2 != lmp) {
- p2++;
- mantom? wmove(*p2): bmove(*p2);
- if((!mantom && !battack(wkpos) && wattack(bkpos)) ||
- (mantom && !wattack(bkpos) && battack(wkpos))) {
- *p3 = *p2;
- p3++;
- }
- mantom? wremove(): bremove();
- p2++;
- }
- lmp = p3;
- p2 = p1;
- while(p2 != lmp) {
- mantom? wmove(*p2): bmove(*p2);
- f = xmater(ns);
- mantom? wremove(): bremove();
- if(f) {
- abmove = *p2;
- lmp = p1;
- return(1);
- }
- p2++;
- }
- lmp = p1;
- return(0);
- }
-
- xmater(ns)
- {
- int *p1, *p2, f;
-
- p1 = lmp;
- p2 = p1;
- mantom? bagen(): wagen();
- if(p2+2 == lmp && rept() == 0)
- ns++;
- while(p2 != lmp) {
- p2++;
- mantom? bmove(*p2): wmove(*p2);
- f = mater(ns);
- mantom? bremove(): wremove();
- if(!f) {
- lmp = p1;
- return(0);
- }
- p2++;
- }
- lmp = p1;
- return(1);
- }
-