File: POSSIBLE.C | Size: 8,139 bytes | Download file | Back to directory listing | BWPOW's homepage
// 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;
}