/***********************************************************/ /* */ /* 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! */ }