#include "iostream.h" #include "math.h" #include "conio.h" #include "stdlib.h" int DC[21][2]={{1,1},{1,2},{1,3},{1,4},{1,5},{1,6},{2,2},{2,3},{2,4},{2,5},{2,6},{3,3},{3,4},{3,5},{3,6},{4,4},{4,5},{4,6},{5,5},{5,6},{6,6}}; class Board { public: int list[24],B,W; Board() { for(int i=0;i<24;i++) list[i]=0; B=W=0; } }; float max(float a,float b) { return (a>b ? a : b); } float min(float a,float b) { return (amax) max=abs(game.list[i]); for(j=1;j<=max;j++) { for(i=12;i<24;i++) { if(game.list[i]<0) { cout<<'*'; game.list[i]++; } else if(game.list[i]>0) { cout<<'+'; game.list[i]--; } else cout<<' '; cout<<' '; } cout<max) max=abs(game.list[i]); while(max>0) { for(i=11;i>=0;i--) { if(abs(game.list[i])==max) { if(game.list[i]<0) { cout<<'*'; game.list[i]++; } else if(game.list[i]>0) { cout<<'+'; game.list[i]--; } } else cout<<' '; cout<<' '; } cout<=1;i--) { if(i<=9) cout<<'0'<=0) { state.list[index]--; state.list[dc+index]++; } return state; } else { for(sum=0,i=18;i<24;i++) if(state.list[i]>0) sum+=state.list[i]; if(sum==15) { state.list[index]--; return state; } else return state; } } Board min_move(Board state,int dc,int index) { int i,sum; if(index-dc>=0) { if(state.list[index-dc]==1) { state.list[index]++; state.list[index-dc]=-1; state.W++; } else if(state.list[index-dc]<=0) { state.list[index]++; state.list[index-dc]--; } return state; } else { for(sum=0,i=5;i>=0;i--) if(state.list[i]<0) sum+=state.list[i]; if(sum==-15) { state.list[index]++; return state; } else return state; } } float Eval(Board state) { float s1,s2,s3;int i; for(s1=0,i=0;i<24;i++) s1+=state.list[i]; s1+=state.W; s1-=state.B; s1*=-1; s2=state.B-state.W; for(s3=0,i=0;i<24;i++) if(state.list[i]>0) s3-=(state.list[i]*(23-i)); for(i=23;i>=0;i--) if(state.list[i]<0) s3+=(state.list[i]*(-i)); return (s1+s2+s3); } class MAIN { public : inline float Max_Dice1(Board &state,int dc1,int dc2,float alpha,float beta,int depth) { int i,j; float w,m; Board T,s1,s2; if(state.W>0) { if(state.W>=2) { if(state.list[dc1-1]>=0) { state.list[dc1-1]++; state.W--; } if(state.list[dc2-1]>=0) { state.list[dc2-1]++; state.W--; } return max(alpha,Min_Value(state,alpha,beta,depth+1)); } else { s1=T=state; if(s1.list[dc1-1]>=0) { s1.list[dc1-1]++; s1.W--; j=0; while(1) { for(;j<24;j++) if(s1.list[j]>0) break; if(j==24) break; s2=max_move(s1,dc2,j); m=Min_Value(s2,alpha,beta,depth+1); if(alpha=beta) { state=s2; return beta; } j++; } } s1=state; if(s1.list[dc2-1]>=0) { s1.list[dc2-1]++; s1.W--; j=0; while(1) { for(;j<24;j++) if(s1.list[j]>0) break; if(j==24) break; s2=max_move(s1,dc1,j); m=Min_Value(s2,alpha,beta,depth+1); if(alpha=beta) { state=s2; return beta; } j++; } } state=T; return alpha; } } else { i=0;T=state; while(1) { for(;i<24;i++) if(state.list[i]>0) break; if(i==24) break; s1=max_move(state,dc1,i); j=0; while(1) { for(;j<24;j++) if(s1.list[j]>0) break; if(j==24) break; s2=max_move(s1,dc2,j); m=Min_Value(s2,alpha,beta,depth+1); if(alpha=beta) { state=s2; return beta; } j++; } i++; } state=T; return alpha; } } inline float Max_Dice2(Board &state,int dc1,int dc2,float alpha,float beta,int depth) { int w,i,j,k,h,a[4];Board s[5],T,s1,s2,s3,s4; float m; if(state.W>0) { if(state.W>=4) { if(state.list[dc1-1]>=0) { state.list[dc1-1]+=4; state.W-=4; } return max(alpha,Min_Value(state,alpha,beta,depth+1)); } if(state.W<4) { if(state.list[dc1-1]>=0) { state.list[dc1-1]+=state.W; w=state.W; state.W=0; for(i=0;i<4-state.W;i++) a[i]=-1; s[0]=state; for(i=0;i<4-w;a[i]++) { for(;a[i]<24;a[i]++) if(s[i].list[a[i]]>0) break; if(a[i]==24) { if(i==0) break; a[i]=-1; i-=2; continue; } s[i+1]=max_move(s[i],dc1,a[i]); m=Min_Value(s[i+1],alpha,beta,depth+1); if(alpha=beta) { state=s[i+1]; return beta; } if(i<4-w-1) i++; } } } state=T; return alpha; } else { i=0; while(1) { for(;i<24;i++) if(state.list[i]>0) break; if(i==24) break; s1=max_move(state,dc1,i); j=0; while(1) { for(;j<24;j++) if(s1.list[j]>0) break; if(j==24) break; s2=max_move(s1,dc2,j); k=0; while(1) { for(;k<24;k++) if(s2.list[k]>0) break; if(k==24) break; s3=max_move(s2,dc1,k); h=0; while(1) { for(;h<24;h++) if(s3.list[h]>0) break; if(h==24) break; s4=max_move(s3,dc2,h); m=Min_Value(s4,alpha,beta,depth+1); if(alpha=beta) { state=s4; return beta; } h++; } k++; } j++; } i++; } state=T; return alpha; } } inline float Max_Value(Board state,float alpha,float beta,int depth) { float sum;int i; if(depth==2) { return Eval(state); } else { for(sum=0,i=0;i<21;i++) sum+=(DC[i][0]==DC[i][1] ? (1.36*Max_Dice2(state,DC[i][0],DC[i][1],alpha,beta,depth)) : 1.18*Max_Dice1(state,DC[i][0],DC[i][1],alpha,beta,depth)); return sum; } } inline float Min_Value(Board state,float alpha,float beta,int depth) { float sum;int i; if(depth==2) { return Eval(state); } else { for(i=0;i<21;i++) sum+=(DC[i][0]==DC[i][1] ? 1.36*Min_Dice2(state,DC[i][0],DC[i][1],alpha,beta,depth) : 1.18*Min_Dice1(state,DC[i][0],DC[i][1],alpha,beta,depth)); return sum; } } inline float Min_Dice1(Board state,int dc1,int dc2,float alpha,float beta,int depth) { int i,j;Board s1,s2; if(state.B>0) { if(state.B>=2) { if(state.list[24-dc1]<=0) { state.list[24-dc1]--; state.B--; } if(state.list[24-dc2]<=0) { state.list[24-dc2]--; state.B--; } return min(beta,Max_Value(state,alpha,beta,depth+1)); } else { s1=state; if(s1.list[24-dc1]<=0) { s1.list[24-dc1]--; s1.B--; j=23; while(1) { for(;j>=0;j--) if(s1.list[j]<0) break; if(j==-1) break; s2=min_move(s1,dc2,j); beta=min(beta,Max_Value(s2,alpha,beta,depth+1)); if(alpha>=beta) return alpha; j++; } } s1=state; if(s1.list[24-dc2]<=0) { s1.list[24-dc2]--; s1.W--; j=23; while(1) { for(;j>=0;j--) if(s1.list[j]<=0) break; if(j==-1) break; s2=min_move(s1,dc1,j); beta=min(beta,Max_Value(s2,alpha,beta,depth+1)); if(alpha>=beta) return alpha; j++; } } return beta; } } else { i=23; while(1) { for(;i>=0;i--) if(state.list[i]<0) break; if(i==-1) break; s1=min_move(state,dc1,i); j=23; while(1) { for(;j>=0;j--) if(s1.list[j]<0) break; if(j==-1) break; s2=min_move(s1,dc2,j); beta=min(beta,Max_Value(s2,alpha,beta,depth+1)); if(alpha>=beta) return alpha; j--; } i--; } return beta; } } inline float Min_Dice2(Board state,int dc1,int dc2,float alpha,float beta,int depth) { int i,j,k,h,b,a[4];Board s[5],s1,s2,s3,s4; if(state.B>0) { if(state.B>=4) { if(state.list[24-dc1]<=0) { state.list[24-dc1]-=4; state.B-=4; } return min(beta,Max_Value(state,alpha,beta,depth+1)); } else { if(state.list[24-dc1]<=0) { state.list[24-dc1]-=state.B; b=state.B; state.B=0; for(i=0;i<4-b;) { a[i]--; for(;a[i]>=0;a[i]--) if(s[i].list[a[i]]<0) break; if(a[i]==-1) { if(i==0) break; a[i]=24; i-=2; continue; } s[i+1]=min_move(s[i],dc1,a[i]); beta=min(beta,Max_Value(s[i+1],alpha,beta,depth+1)); if(alpha>=beta) return alpha; if(i<4-b-1) i++; } } return beta; } } else { i=23; while(1) { for(;i>=0;i--) if(state.list[i]<0) break; if(i==-1) break; s1=min_move(state,dc1,i); j=23; while(1) { for(;j>=0;j--) if(s1.list[j]<0) break; if(j==-1) break; s2=min_move(s1,dc2,j); k=23; while(1) { for(;k>=0;k--) if(s2.list[k]<0) break; if(k==-1) break; s3=min_move(s2,dc1,k); h=23; while(1) { for(;h>=0;h--) if(s3.list[h]<0) break; if(h==-1) break; s4=min_move(s3,dc2,h); beta=min(beta,Max_Value(s2,alpha,beta,depth+1)); if(alpha>=beta) return alpha; h--; } k--; } j--; } i--; } return beta; } } }; int win(Board state,int sign) { int sum,i; for(sum=0,i=0;i<24;i++) if(state.list[i]*sign>0) sum+=state.list[i]*sign; if(sum==0) return 1; return 0; } void main() { Board st;int i,dc1,dc2,index;MAIN f; st.list[0]=2;st.list[11]=5;st.list[16]=3;st.list[18]=5; st.list[5]=-5;st.list[7]=-3;st.list[12]=-5;st.list[23]=-2; clrscr(); show(st); while(1) { getch(); clrscr(); cout<<"computer tas mirizad..."<>index; st=min_move(st,dc1+1,index); } } else { cout<<"mohreh ra entekhab konid "<>index; st=min_move(st,dc1+1,index); cout<<"mohreh ra entekhab konid "<>index; st=min_move(st,dc2+1,index); } cout<<"\n\n\n\n\n"; show(st); if(win(st,-1)) { cout<<"karbar bord !"; break; } } getch(); }