File: SODA.C | Size: 4,068 bytes | Download file | Back to directory listing | BWPOW's homepage
/***********************************************************/
/*                                                         */
/*  Soda IQ for PisqWorks 1.1                              */
/*                                       by Samuel Kupka   */
/*                                                         */
/***********************************************************/
#include <stdio.h>
 
// externe pole
extern char pole[19][19];
 
// vnutorne premenne
float soda_temp1[19][19];
float soda_temp2[19][19];
char soda_op[16]={1,-1,1,0,1,1,0,1,-1,1,-1,0,-1,-1,0,-1};
int soda_max,soda_mxx,soda_myy;
 
// program
void soda_maxi(int x,int y,int sx,int sy)
{
  char jx,jy,i,d,j,p;
 
  j=0;d=0;
  p=pole[x][y];
  if(p==0) return;
 
  for(i=0;i<10;i++){
    x+=sx;y+=sy;
    if(x>18) break;
    if(y>18) break;
    if(x<0) break;
    if(y<0) break;
 
    if(pole[x][y]!=p){
       if(pole[x][y]==0){
         if(j==0){
           jx=x;jy=y;
           j=1;
           d++;
         }
         else break;
       }
       else break;
    }
    d++;
  }
 
  if(j==0) d=0;
  if(d>=5&&p==-1) d=100;
 
  if(d>soda_max){
    soda_max=d;
    soda_mxx=jx;soda_myy=jy;
  }
 
}
 
 
float soda_how_much(char xx,char yy,char sx,char sy)
{
  char i,p,h=0,pa,lp;
  char x,y;
  float r=0;
 
 
  x=xx;y=yy;
  p=pole[xx][yy];
  if(p==0) return 0;
  lp=pole[xx-sx][yy-sy];
 
  for(i=0;i<10;i++){
    x+=sx;y+=sy;
 
    if(x>18) break;
    if(y>18) break;
    if(x<0) break;
    if(y<0) break;
 
    pa=pole[x][y];
    if(pa!=p){
      if(pa==0){
        if(h==2) break;
        h++;r+=0.9;
      }
      else{
        if(h==0){
          if(r!=4) r-=2.5;
          else r=50;
        }
        break;
      }
    }
    else r++;
  }
 
  if(r<0) r=0;
  if(lp!=p&&r<4&&lp!=0) r/=2;
 
  if(p==-1) return -r;
  return r;
}
 
void soda_first_empty(int x,int y,int sx,int sy,int c,int a)
{
  int i;
  for(i=0;i<10;i++)
  {
    x+=sx;y+=sy;
    if(x>18) break;
    if(y>18) break;
    if(x<0) break;
    if(y<0) break;
    if(pole[x][y]==0){
      if(a==1) soda_temp1[x][y]+=c;
      if(a==2) soda_temp2[x][y]+=c;
      return;
    }
  }
}
 
 
void soda_calc(int xx,int yy)
{
  int i,c;
  if(pole[xx][yy]==0) return;
  for(i=0;i<8;i++){
    soda_maxi(xx,yy,soda_op[i*2],soda_op[i*2+1]);
    c=soda_how_much(xx,yy,soda_op[i*2],soda_op[i*2+1]);
    if(c<0) soda_first_empty(xx,yy,soda_op[i*2],soda_op[i*2+1],abs(c),1);
    if(c>0) soda_first_empty(xx,yy,soda_op[i*2],soda_op[i*2+1],c,2);
  }
}
 
void ai_soda(int *rx,int *ry)
{
  int x,y,i,l,s1;
  float m,p,pm,mp;
  int mx,my,px,py;
 
  for(y=0;y<19;y++)
    for(x=0;x<19;x++){
      soda_temp1[x][y]=0.0;
      soda_temp2[x][y]=0.0;
    }
 
  soda_max=0;
    for(y=0;y<19;y++)
      for(x=0;x<19;x++)
        soda_calc(x,y);
 
  m=0;p=0;pm=0;mp=0;
  mx=0;my=0;
  for(y=0;y<19;y++)
    for(x=0;x<19;x++){
      if(soda_temp1[x][y]==m&&soda_temp2[x][y]>mp){
        m=soda_temp1[x][y];
        mx=x;my=y;
        mp=soda_temp2[x][y];
      }
      if(soda_temp1[x][y]>m){
        m=soda_temp1[x][y];
        mx=x;my=y;
        mp=soda_temp2[x][y];
      }
    }
 
  for(y=0;y<19;y++)
    for(x=0;x<19;x++){
      if(soda_temp2[x][y]==p&&soda_temp1[x][y]>pm){
        p=soda_temp2[x][y];
        px=x;py=y;
        pm=soda_temp1[x][y];
      }
      if(soda_temp2[x][y]>p){
        p=soda_temp2[x][y];
        px=x;py=y;
        pm=soda_temp1[x][y];
      }
  }
 
 
  if(soda_max==0&&pole[10][10]==0){
    *rx=10;
    *ry=10;
    return;
  }
 
  if(soda_max>=5){
    *rx=soda_mxx;
    *ry=soda_myy;
    return;
  }
 
  if(m>p){
    if(pole[mx][my]==0){
      *rx=mx;
      *ry=my;
      return;
    }
  }
  else{
    if(pole[px][py]==0){
      *rx=px;
      *ry=py;
      return;
    }
  }
 
  for(x=0;x<19;x++)
    for(y=0;y<19;y++)
      if(pole[x][y]==0){
        *rx=x;*ry=y;return;
      }
 
  *rx=1;*ry=1;
  /* Todo: ->Tak, vsetko je plne, je to remiza! */
}