最短的具有人工智能的黑白棋程序
这是很久之前在黑白棋联盟的论坛上看到的,虽然为了精简写的跟外星文一样,但确实有点佩服这位作者。
直接贴到VC上就可以看到结果。我那时候特意把它“翻译”了一遍,当然就不会那么精简了,是为了让一些人看的明白一些。
源程序:
#define D define
#define Y return
#define R for
#define e while
#define I printf
#define l int
#define W if
#define C y=v+111;H(x,v)*y++= *x
#define H(a,b)R(a=b+11;a<b+89;a++)
#define s(a)t=scanf("%d",&a)
#define U Z I
#define Z I("123/
45678/n");
H(x,V){putchar(".XO"[*x]);W((x-V)%10==8){x+=2;I("%d/n",(x-V)/10-1);}}
l V[1600],u,r[]={-1,-11,-10,-9,1,11,10,9},h[]={11,18,81,88},ih[]={22,27,72,77},
bz,lv=60,*x,*y,m,t;S(d,v,f,_,a,b)l*v;{l c=0,*n=v+100,j=d<u-1?a:-9000,w,z,i,g,q=
3-f;W(d>u){R(w=i=0;i<4;i++)w+=(m=v[h[i]])==f?300:m==q?-300:(t=v[ih[i]])==f?-50:
t==q?50:0;Y w;}H(z,0){W(E(v,z,f,100)){c++;w= -S(d+1,n,q,0,-b,-j);W(w>j){g=bz=z;
j=w;W(w>=b||w>=8003)Y w;}}}W(!c){g=0;W(_){H(x,v)c+= *x==f?1:*x==3-f?-1:0;Y c>0?
8000+c:c-8000;}C;j= -S(d+1,n,q,1,-b,-j);}bz=g;Y d>=u-1?j+(c<<3):j;}main(){R(;t<
1600;t+=100)R(m=0;m<100;m++)V[t+m]=m<11||m>88||(m+1)%10<2?3:0;I("Level:");V[44]
=V[55]=1;V[45]=V[54]=2;s(u);e(lv>0){Z do{I("You:");s(m);}e(!E(V,m,2,0)&&m!=99);
W(m!=99)lv--;W(lv<15&&u<10)u+=2;U("Wait/n");I("Value:%d/n",S(0,V,1,0,-9000,9000
));I("move: %d/n",(lv-=E(V,bz,1,0),bz));}}E(v,z,f,o)l*v;{l*j,q=3-f,g=0,i,w,*k=v
+z;W(*k==0)R(i=7;i>=0;i--){j=k+(w=r[i]);e(*j==q)j+=w;W(*j==f&&j-w!=k){W(!g){g=1
;C;}e(j!=k)*((j-=w)+o)=f;}}Y g;}
“翻译”后的程序:
#include <stdio.h>
int V[1600];
int u;
int r[]={-1,-11,-10,-9,1,11,10,9};
int h[]={11,18,81,88};
int ih[]={22,27,72,77};
int bz;
int lv=60;
int *x,*y,m,t;
void ShowBoard()
{
printf("12345678/n");
for(x=V+11;x<V+89;x++)
{
putchar(".XO"[*x]);
if((x-V)%10==8)
{
x+=2;
printf("%d/n",(x-V)/10-1);
}
}
}
int Eval(int *v,int z,int f,int o)
{
int *j;
int q=3-f;
int g=0;
int i;
int w;
int *k=v+z;
if(*k==0)
for(i=7;i>=0;i--)
{
j=k+(w=r[i]);
while(*j==q)
j+=w;
if(*j==f&&j-w!=k)
{
if(!g)
{
g=1;
y=v+111;
for(x=v+11;x<v+89;x++)
*y++= *x;
}
while(j!=k)
*((j-=w)+o)=f;
}
}
return g;
}
int Solve(int d,int *v,int f,int pass,int a,int b)
{
int c=0;
int *n=v+100;
int j=d<u-1?a:-9000;
int w,z,i,g;
int q=3-f;
if(d>u)
{
for(w=i=0;i<4;i++)
w+=(m=v[h[i]])==f?300:m==q?-300:(t=v[ih[i]])==f?-50:t==q?50:0;
return w;
}
for(z=11;z<89;z++)
{
if(Eval(v,z,f,100))
{
c++;
w= -Solve(d+1,n,q,0,-b,-j);
if(w>j)
{
g=bz=z;
j=w;
if(w>=b||w>=8003)
return w;
}
}
}
if(!c)
{
g=0;
if(pass)
{
for(x=v+11;x<v+89;x++)
c+= *x==f?1:*x==3-f?-1:0;
return c>0?8000+c:c-8000;
}
for(x=v+11;x<v+89;x++)
*y++= *x;
j= -Solve(d+1,n,q,1,-b,-j);
}
bz=g;
return d>=u-1?j+(c<<3):j;
}
void main()
{
for(;t<1600;t+=100)
for(m=0;m<100;m++)
V[t+m]=m<11||m>88||(m+1)%10<2?3:0;
printf("Level:");
V[44]=V[55]=1;
V[45]=V[54]=2;
t=scanf("%d",&u);
while(lv>0)
{
ShowBoard();
do
{
printf("You:");
t=scanf("%d",&m);
}
while(!Eval(V,m,2,0) && m!=99);
if(m!=99)
lv--;
if(lv<15&&u<10)
u+=2;
ShowBoard();
printf("Wait/n");
printf("Value:%d/n",Solve(0,V,1,0,-9000,9000));
printf("move: %d/n",(lv-=Eval(V,bz,1,0),bz));
}
}