File: MAIN.C | Size: 16,015 bytes | Download file | Back to directory listing | BWPOW's homepage
// This file is by Marian Dvorsky & Sam Kupka
 
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
#include "allegro.h"
#include "sachy.h"
// sleduj poznamky TODO
 
// status remizy !!
// hash table
 
char castled[2]={0,0};
 
//RLE_SPRITE *figurky_cierne[6];
//RLE_SPRITE *figurky_biele[6];
//extern POLICKO sachovnica[8][8];
extern float maxskore;
int picked_x,picked_y;
int whose_turn,jesach,konec=0;
POLICKO_XY *saved;
int poc_saved;
MOVE possible[108];
int poss;
int computer;
int xxx;
int a,oa=-1;
int aa=1,oaa=-1;
char convx(int a)
{
  return ('a'+a);
}
 
int convy(int a)
{
  return 8-a;
}
 
void draw_interface(void)
{
  int x,y,c;
  float sc;
  PALETTE zpal;
/*
  clear(buffer);
  for (y=0;y<=7;y++)
    for (x=0;x<=7;x++)
    {
      c = ((x+y)%2 == 0)?makecol(255,255,255):makecol(0,0,128);
      rectfill(buffer,x*34,y*32,x*34+33,y*32+31,c);
      if (sachovnica[x][y].figurka>0)
        if (sachovnica[x][y].farba == 0)
          draw_rle_sprite(buffer,figurky_biele[sachovnica[x][y].figurka-1],x*34,y*32+4);
        else
          draw_rle_sprite(buffer,figurky_cierne[sachovnica[x][y].figurka-1],x*34,y*32+4);
      if (picked_x==x && picked_y==y)
      {
        c = makecol(0,128,0);
        rect(buffer,x*34,y*32,x*34+33,y*32+31,c);
        rect(buffer,x*34+1,y*32+1,x*34+32,y*32+30,c);
        rect(buffer,x*34+2,y*32+2,x*34+31,y*32+29,c);
      }
    }
 
  for (x=0;x<poss;x++)
  {
    textprintf(buffer,font,300,x*8, 2, "%c%d-%c%d",convx(possible[x].x1),convy(possible[x].y1),convx(possible[x].x2),convy(possible[x].y2));
  }
  sc = score(whose_turn);
  textprintf(buffer,font,0,300, 2, "%f",sc);
  textprintf(buffer,font,0,310, 2, "Da skore of this turn is going to be: %f",maxskore);
 
  show_mouse(NULL);
  blit(buffer,screen,0,0,0,0,640,480);
  show_mouse(screen);
  */
 
 
  clear(buffer);
  SMKpanaky();
  SMKdraw(buffer,a,aa);
  if((oa!=a)||(oaa!=aa)){
    SMKmguess();
    oa=a;
    oaa=aa;
  }
 
  tdbox(buffer,585,0,50,poss*8+10,6);
  for (x=0;x<poss;x++)
  {
    textprintf(buffer,font,590,x*8+5,0,"%c%d-%c%d",convx(possible[x].x1),convy(possible[x].y1),convx(possible[x].x2),convy(possible[x].y2));
  }
 
  tdbox(buffer,535,425,105,55,6);
  textprintf(buffer,font,540,430,0,"SCORE");
  textprintf(buffer,font,550,440,50,"White");
  textprintf(buffer,font,550,450,50,"%2f",score(0));
  textprintf(buffer,font,550,460,254,"Black");
  textprintf(buffer,font,550,470,254,"%2f",score(1));
 
  //  blit(moves_bmp,buffer,0,0,600,0,40,450);
 
  show_mouse(NULL);
  blit(buffer,screen,0,0,0,0,640,480);
  show_mouse(screen);
/*
    if(key[KEY_F12]){
      get_palette(zpal);
      save_pcx("chess.pcx",buffer,zpal);
    }
*/
}
 
 
// Skontroluje ci ma strana SIDE sach
char check_for_chess(int side)
{
  int x,y,i,j,e;
  POLICKO a;
  int kralx,kraly;
  for (y=0;y<=7;y++)
    for (x=0;x<=7;x++)
    {
      if (sachovnica[x][y].figurka == kral && sachovnica[x][y].farba == side)
      {
        kralx=x;
        kraly=y;
        x=7;y=7;
      }
    }
  side = !side;
  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)
        {
          // branie
          if (x>0 && sachovnica[x-1][y-((side==0)?1:-1)].farba != side && sachovnica[x-1][y-((side==0)?1:-1)].figurka > 0)
            if (x-1 == kralx && y-((side==0)?1:-1) == kraly)
              return 1;
          if (x<7 && sachovnica[x+1][y-((side==0)?1:-1)].farba != side && sachovnica[x+1][y-((side==0)?1:-1)].figurka > 0)
            if (x+1 == kralx && y-((side==0)?1:-1) == kraly)
              return 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))
              if (i == kralx && j == kraly)
                return 1;
            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))
              if (i == kralx && j == kraly)
                return 1;
            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))
              if (i == kralx && j == kraly)
                return 1;
            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))
              if (i == kralx && j == kraly)
                return 1;
            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))
              if (i == kralx && j == kraly)
                return 1;
         }
        }
        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))
              if (i == kralx && j == kraly)
                return 1;
         }
        }
        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))
              if (i == kralx && j == kraly)
                return 1;
            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))
              if (i == kralx && j == kraly)
                return 1;
            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))
              if (i == kralx && j == kraly)
                return 1;
            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))
              if (i == kralx && j == kraly)
                return 1;
            if (sachovnica[i][j].figurka > 0)
              j = 7;
            j++;
            i--;
          }
        }
      }
    }
 
  return 0;
}
 
void save_pos(int x, int y)
{
  saved[poc_saved].x = x;
  saved[poc_saved].y = y;
  saved[poc_saved].figurka = sachovnica[x][y].figurka;
  saved[poc_saved].farba = sachovnica[x][y].farba;
  poc_saved++;
}
 
void load_pos(POLICKO_XY svd[8])
{
  int x;
  for (x=0;x<poc_saved;x++)
  {
    sachovnica[svd[x].x][svd[x].y].figurka = svd[x].figurka;
    sachovnica[svd[x].x][svd[x].y].farba = svd[x].farba;
  }
  poc_saved = 0;
}
 
void check_move(int x1, int y1, int x2, int y2, int save, POLICKO_XY svd[8])
{
  int x,e;
  if (save==1)
  {
    saved = svd;
  }
  if (sachovnica[x1][y1].figurka == kral && x1 == 4 && (y1 == 0 || y1 == 7))
  {
    e = (whose_turn==0)?7:0;
    if (x2 == 6)
    {
      castled[whose_turn] = 1;
      flags[1+(whose_turn*3)]=0;
      flags[2+(whose_turn*3)]=0;
      if (save==1) save_pos(5,e);
      sachovnica[5][e].farba = whose_turn;
      sachovnica[5][e].figurka = sachovnica[7][e].figurka;
      if (save==1) save_pos(7,e);
      sachovnica[7][e].figurka=0;
      sachovnica[7][e].farba=0;
    }
    if (x2 == 2)
    {
      castled[whose_turn] = 1;
      flags[1+(whose_turn*3)]=0;
      flags[2+(whose_turn*3)]=0;
      if (save==1) save_pos(3,e);
      sachovnica[3][e].farba = whose_turn;
      sachovnica[3][e].figurka = sachovnica[0][e].figurka;
      if (save==1) save_pos(0,e);
      sachovnica[0][e].figurka=0;
      sachovnica[0][e].farba=0;
    }
  }
 
  if (sachovnica[x1][y1].figurka == kral)
  {
    if (whose_turn == 0)
      flags[0] = 1;
    else
      flags[3] = 1;
  }
  if (sachovnica[x1][y1].figurka == veza)
  {
    if (x1 == 0)
      if (whose_turn == 0)
        flags[1] = 1;
      else
        flags[4] = 1;
    else
      if (whose_turn == 0)
        flags[2] = 1;
      else
        flags[5] = 1;
  }
  if (sachovnica[x1][y1].figurka == pesiak && x1-x2!=0 && sachovnica[x2][y2].figurka == 0)
  {
    if (whose_turn == 0)
    {
      if (save==1) save_pos(x2,y2+1);
      sachovnica[x2][y2+1].figurka=0;
    }
    if (whose_turn == 1)
    {
      if (save==1) save_pos(x2,y2-1);
      sachovnica[x2][y2-1].figurka=0;
    }
  }
  if (save==1) save_pos(x2,y2);
  sachovnica[x2][y2].farba = whose_turn;
  sachovnica[x2][y2].figurka = sachovnica[x1][y1].figurka;
  if (save==1) save_pos(x1,y1);
  sachovnica[x1][y1].figurka=0;
  sachovnica[x1][y1].farba=0;
 
  if (sachovnica[x2][y2].figurka == pesiak && (y2 == 0 || y2 == 7))
  {
    // TODO: dovolit vybrat
    sachovnica[x2][y2].figurka = dama;
  }
  prev_move.x1 = x1;
  prev_move.y1 = y1;
  prev_move.x2 = x2;
  prev_move.y2 = y2;
  whose_turn = (whose_turn==0)?1:0;
  picked_x=-1;
  picked_y=-1;
}
 
void initial_positions()
{
  int x,y,z;
  for(x=0;x<8;x++)
    for(y=0;y<8;y++){
      sachovnica[x][y].figurka=0;
      sachovnica[x][y].farba=0;
    }
 
  for (x=0;x<=1;x++)
  {
    y = (x==0)?7:0;
    sachovnica[0][y].figurka = 2;
    sachovnica[0][y].farba = x;
    sachovnica[1][y].figurka = 3;
    sachovnica[1][y].farba = x;
    sachovnica[2][y].figurka = 4;
    sachovnica[2][y].farba = x;
    sachovnica[3][y].figurka = 5;
    sachovnica[3][y].farba = x;
    sachovnica[4][y].figurka = 6;
    sachovnica[4][y].farba = x;
    sachovnica[5][y].figurka = 4;
    sachovnica[5][y].farba = x;
    sachovnica[6][y].figurka = 3;
    sachovnica[6][y].farba = x;
    sachovnica[7][y].figurka = 2;
    sachovnica[7][y].farba = x;
    y = (x==0)?6:1;
    for (z=0;z<=7;z++){
      sachovnica[z][y].figurka = 1;
      sachovnica[z][y].farba = x;}
  }
}
 
char cco=0;
 
void marian_main(int farba,int co,int obt)
{
  int x,x1,y1;
  char c=0,k=0;
  struct time cas;
  oa=-1;
  gettime(&cas);
  srandom(cas.ti_sec*cas.ti_hour*cas.ti_min);
  picked_x=-1;
  picked_y=-1;
  if((co==0)||(cco==0)){
    if(farba>=0) computer=!farba;
    else computer=-1;
    whose_turn=0;
    xxx=0;
    flags[0]=0; flags[1]=0; flags[2]=0;   flags[3]=0;   flags[4]=0;
    cco=1;
    initial_positions();
    max_depth=obt+2;
    konec=0;
  }
 
  if (computer == whose_turn)
    go();
  poss = generate_possible_moves(possible,whose_turn);
  set_mouse_sprite(0);
  draw_interface();
  do{
    c=0;
    if (key[KEY_SPACE])
      xxx=1;
    if(key[KEY_LEFT]){
      a+=2;
      c=1;
    }
    if(key[KEY_RIGHT]){
      a-=2;
      c=1;
    }
    if(key[KEY_UP]){
      aa-=2;
      if(aa<1) aa=1;
      c=1;
    }
    if(key[KEY_DOWN]){
      aa+=2;
      if(aa>50) aa=50;
      c=1;
    }
 
    if(key[KEY_R]){
      a=0;aa=14;
      c=1;
    }
    if(key[KEY_H]){
      a=0;
      c=1;
    }
    if(key[KEY_F]){
      a+=a>128?-128:128;
      c=1;
      clear_keybuf();
    }
    if(key[KEY_V]){
      aa=14;
      c=1;
    }
 
 
    if(key[KEY_ESC])
      k=1;
 
    if (mouse_b & 1)
    {
      if (SMKget(mouse_x,mouse_y)!=-1)
      {
        if (picked_x==-1)
        {
          y1=SMKget(mouse_x,mouse_y);
          x1=y1%8;
          y1/=8;
          if (sachovnica[x1][y1].figurka > 0)
          {
            if (sachovnica[x1][y1].farba == whose_turn || whose_turn == computer)
            {picked_x = x1;picked_y=y1;
             show_mouse(0);
             if (sachovnica[x1][y1].farba == 0)
               set_mouse_sprite(figurky_biele[sachovnica[x1][y1].figurka-1]);
             else
               set_mouse_sprite(figurky_cierne[sachovnica[x1][y1].figurka-1]);
             set_mouse_sprite_focus(17,12);
             show_mouse(screen);
            }
            else
            {
              if (whose_turn == computer)
                billalert("PinChess message","Na tahu je pocitac!",NULL,"OK",NULL,'O',NULL);
              else
              {
                if (whose_turn == 0)
                  billalert("PinChess message","Na tahu je biely!",NULL,"OK",NULL,'O',NULL);
                else
                  billalert("PinChess message","Na tahu je cierny!",NULL,"OK",NULL,'O',NULL);
              }
            }
          }
        }
        else
        {
          y1=SMKget(mouse_x,mouse_y);
          x1=y1%8;
          y1/=8;
          for (x=0;x<poss;x++)
          {
            if (possible[x].x1 == picked_x && possible[x].y1 == picked_y && possible[x].x2 == x1 && possible[x].y2 == y1)
            {
              check_move(picked_x,picked_y,x1,y1,0,NULL);
              set_mouse_sprite(NULL);
              set_mouse_sprite_focus(0,0);
              draw_interface();
              c=0;
              if (computer == whose_turn){
                _thinking();
                go();
              }
              if (xxx == 1)
                delay(0);
              poss = generate_possible_moves(possible,whose_turn);
              goto dalej;
            }
          }
          dalej:
        }
        c=1;
        if (poss == 0 || konec == 1)
        {
          jesach = check_for_chess(whose_turn);
          if (jesach)
          {
            draw_interface();
            k=1;
            if (whose_turn == 0)
              billalert("PinChess message","Biely dostal mat!",NULL,"OK",NULL,'O',NULL);
            else
              billalert("PinChess message","Cierny dostal mat!",NULL,"OK",NULL,'O',NULL);
          }
          else
          {
            draw_interface();
            k=1;
            if (whose_turn == 0)
              billalert("PinChess message","Biely dostal pat! Je to remiza.",NULL,"OK",NULL,'O',NULL);
            else
              billalert("PinChess message","Cierny dostal pat! Je to remiza.",NULL,"OK",NULL,'O',NULL);
          }
        }
        while (mouse_b&1)
        {}
      }
    }
    if (mouse_b&2)
    {
      if (picked_x!=-1)
      {
        picked_x=-1;
        picked_y=-1;
        set_mouse_sprite(NULL);
        c=1;
      }
    }
    if(c==1)
      draw_interface();
  }while (k!=1);
}