// This file is by Marian Dvorsky #include "sachy.h" char flags[5]; MOVE prev_move; int s; int ep; int pos; int add_to_possible(MOVE possible[108],int x1, int y1,int x2,int y2) { int oldfig,oldfar,a,z; if (x2<0 || y2<0 || x2>7 || y2>7) return 0; oldfig = sachovnica[x2][y2].figurka; oldfar = sachovnica[x2][y2].farba; sachovnica[x2][y2].figurka = sachovnica[x1][y1].figurka; sachovnica[x2][y2].farba = sachovnica[x1][y1].farba; sachovnica[x1][y1].figurka = 0; sachovnica[x1][y1].farba = 0; a = check_for_chess(s); sachovnica[x1][y1].figurka = sachovnica[x2][y2].figurka; sachovnica[x1][y1].farba = sachovnica[x2][y2].farba; sachovnica[x2][y2].figurka = oldfig; sachovnica[x2][y2].farba = oldfar; if (a == 1) return 0; possible[pos].x1 = x1; possible[pos].y1 = y1; possible[pos].x2 = x2; possible[pos++].y2 = y2; return 1; } int generate_possible_moves(MOVE possible[108],int side) { int x,y,i,j,e,f1,f2,c; POLICKO a; char bo; f1 = 0; f2 = 0; s = side; pos = 0; ep = -1; for (y=0;y<=7;y++) for (x=0;x<=7;x++) { if (sachovnica[x][y].farba == side && sachovnica[x][y].figurka > 0) { a = sachovnica[x][y]; if (a.figurka == pesiak) { // pohyb zo zakladnej ciary o dve policka if (y == ((side==0)?6:1) && sachovnica[x][y-((side==0)?2:-2)].figurka == 0 && sachovnica[x][y-((side==0)?1:-1)].figurka == 0) add_to_possible(possible,x,y,x,y-((side==0)?2:-2)); // pohyb o 1 policko if (sachovnica[x][y-((side==0)?1:-1)].figurka == 0) add_to_possible(possible,x,y,x,y-((side==0)?1:-1)); // branie if (x>0 && sachovnica[x-1][y-((side==0)?1:-1)].farba != side && sachovnica[x-1][y-((side==0)?1:-1)].figurka > 0) add_to_possible(possible,x,y,x-1,y-((side==0)?1:-1)); if (x<7 && sachovnica[x+1][y-((side==0)?1:-1)].farba != side && sachovnica[x+1][y-((side==0)?1:-1)].figurka > 0) add_to_possible(possible,x,y,x+1,y-((side==0)?1:-1)); // en-passant if (sachovnica[x-1][y].figurka == pesiak && sachovnica[x-1][y].farba != side) if (side == 0) { if (prev_move.x1 == x-1 && prev_move.x2 == x-1 && prev_move.y1 == 1 && prev_move.y2 == 3) if (add_to_possible(possible,x,y,x-1,y-1) == 1) ep = poss-1; } else if (prev_move.x1 == x-1 && prev_move.x2 == x-1 && prev_move.y1 == 6 && prev_move.y2 == 4) if (add_to_possible(possible,x,y,x-1,y+1) == 1) ep = poss-1; if (sachovnica[x+1][y].figurka == pesiak && sachovnica[x+1][y].farba != side) if (side == 0) { if (prev_move.x1 == x+1 && prev_move.x2 == x+1 && prev_move.y1 == 1 && prev_move.y2 == 3) if (add_to_possible(possible,x,y,x+1,y-1) == 1) ep = poss-1; } else if (prev_move.x1 == x+1 && prev_move.x2 == x+1 && prev_move.y1 == 6 && prev_move.y2 == 4) if (add_to_possible(possible,x,y,x+1,y+1) == 1) ep = poss-1; } if (a.figurka == veza || a.figurka == dama) { // na pravo i = x+1; j = y; while (i<=7) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) add_to_possible(possible,x,y,i,j); if (sachovnica[i][j].figurka > 0) i = 7; i++; } // na lavo i = x-1; j = y; while (i>=0) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) add_to_possible(possible,x,y,i,j); if (sachovnica[i][j].figurka > 0) i = 0; i--; } // hore i = x; j = y-1; while (j>=0) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) add_to_possible(possible,x,y,i,j); if (sachovnica[i][j].figurka > 0) j = 0; j--; } // dole i = x; j = y+1; while (j<=7) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) add_to_possible(possible,x,y,i,j); if (sachovnica[i][j].figurka > 0) j = 7; j++; } } if (a.figurka == jazdec) { int x1[8]={-1,-2,-2,-1,1, 2, 2,1}; int y1[8]={-2,-1,1, 2, -2,-1,1,2}; for (e=0;e<=7;e++) { i = x+x1[e]; j = y+y1[e]; if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) add_to_possible(possible,x,y,i,j); } } if (a.figurka == strelec || a.figurka == dama) { // pravo-dole i = x+1; j = y+1; while (i<=7 && j<=7) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) add_to_possible(possible,x,y,i,j); if (sachovnica[i][j].figurka > 0) i = 7; i++; j++; } // pravo hore i = x+1; j = y-1; while (i<=7 && j>=0) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) add_to_possible(possible,x,y,i,j); if (sachovnica[i][j].figurka > 0) i = 7; i++; j--; } // vlavo hore i = x-1; j = y-1; while (j>=0 && i>=0) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) add_to_possible(possible,x,y,i,j); if (sachovnica[i][j].figurka > 0) j = 0; j--; i--; } // vlavo dole i = x-1; j = y+1; while (j<=7 && i >=0) { if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) add_to_possible(possible,x,y,i,j); if (sachovnica[i][j].figurka > 0) j = 7; j++; i--; } } if (a.figurka == kral) { int x1[8]={1,1,1,-1,-1,-1,0,0}; int y1[8]={1,0,-1,1, 0, -1,1,-1}; for (e=0;e<=7;e++) { i = x+x1[e]; j = y+y1[e]; if (sachovnica[i][j].figurka == 0 || (sachovnica[i][j].figurka > 0 && sachovnica[i][j].farba != side)) { c = add_to_possible(possible,x,y,i,j); if (e == 1 && c == 1) f1 = 1; if (e == 4 && c == 1) f2 = 1; } } // rosada if (flags[0+(side==0)?0:3] == 0) { // mala rosada (s vezou h) e = (side==0)?7:0; bo = check_for_chess(side); if (flags[2+(side==0)?0:3] == 0 && sachovnica[6][e].figurka == 0 && sachovnica[5][e].figurka == 0 && sachovnica[7][e].figurka == veza && sachovnica[7][e].farba == side && f1 == 1 && bo == 0) add_to_possible(possible,x,y,6,e); // velka rosada (s vezou a) if (flags[1+(side==0)?0:3] == 0 && sachovnica[1][e].figurka == 0 && sachovnica[2][e].figurka == 0 && sachovnica[3][e].figurka == 0 && sachovnica[0][e].figurka == veza && sachovnica[0][e].farba == side && f2 == 1 && bo == 0) add_to_possible(possible,x,y,2,e); } } } } return pos; }