最短的具有人工智能的黑白棋程序

最短的具有人工智能的黑白棋程序

           这是很久之前在黑白棋联盟的论坛上看到的,虽然为了精简写的跟外星文一样,但确实有点佩服这位作者。

        直接贴到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));
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值