[SRC] CHESS

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

[SRC] CHESS

Post by Shaos »

Наверное надо поговорить о самописанных шахматных программах, и начать с Toldeo Nanochess, которые пролетали уже у нас, но теперь у них есть страничка в википедии (https://en.wikipedia.org/wiki/Toledo_Nanochess) и новый веб-сайт:

http://www.nanochess.org/chess3.html

и чуть более новая версия от 20 ноября 2009 года:

Code: Select all

/**************************************************************************\
| Toledo Nanochess (c) Copyright 2009 Oscar Toledo G. All rights reserved  |
| 1257 non-blank characters. Evolution from my winning IOCCC 2005 entry.   |
| o Use D2D4 algebraic style for movements.  biyubi@gmail.com  Nov/20/2009 |
| o On promotion add a number for final piece (3=N, 4=B, 5=R, 6=Q)         |
| o Press Enter alone for computer to play.                                |
| o Full legal chess moves.                       http://www.nanochess.org |
| o Remove these comments to get 1326 bytes source code (*NIX end-of-line) |
\**************************************************************************/
char*l="ustvrtsuqqqqqqqqyyyyyyyy}{|~z|{}"
"   76Lsabcddcba .pknbrq  PKNBRQ ?A6J57IKJT576,+-48HLSU";
#define F getchar()&z
#define v X(0,0,0,21,
#define Z while(
#define _ ;if(
#define P return--G,y^=8,
B,i,y,u,b,I[411],*G=I,x=10,z=15,M=1e4;X(w,c,h,e,S,s){int t,o,L,E,d,O=e,N=-M*M,K
=78-h<<x,p,*g,n,*m,A,q,r,C,J,a=y?-x:x;y^=8;G++;d=w||s&&s>=h&&v 0,0)>M;do{_ o=I[
p=O]){q=o&z^y _ q<7){A=q--&2?8:4;C=o-9&z?q["& .$  "]:42;do{r=I[p+=C[l]-64]_!w|p
==w){g=q|p+a-S?0:I+S _!r&(q|A<3||g)||(r+1&z^y)>9&&q|A>2){_ m=!(r-2&7))P G[1]=O,
K;J=n=o&z;E=I[p-a]&z;t=q|E-7?n:(n+=2,6^y);Z n<=t){L=r?l[r&7]*9-189-h-q:0 _ s)L
+=(1-q?l[p/x+5]-l[O/x+5]+l[p%x+6]*-~!q-l[O%x+6]+o/16*8:!!m*9)+(q?0:!(I[p-1]^n)+
!(I[p+1]^n)+l[n&7]*9-386+!!g*99+(A<2))+!(E^y^9)_ s>h||1<s&s==h&&L>z|d){p[I]=n,O
[I]=m?*g=*m,*m=0:g?*g=0:0;L-=X(s>h|d?0:p,L-N,h+1,G[1],J=q|A>1?0:p,s)_!(h||s-1|B
-O|i-n|p-b|L<-M))P y^=8,u=J;J=q-1|A<7||m||!s|d|r|o<z||v 0,0)>M;O[I]=o;p[I]=r;m?
*m=*g,*g=0:g?*g=9^y:0;}_ L>N){*G=O _ s>1){_ h&&c-L<0)P L _!h)i=n,B=O,b=p;}N=L;}
n+=J||(g=I+p,m=p<O?g-3:g+2,*m<z|m[O-p]||I[p+=p-O]);}}}}Z!r&q>2||(p=O,q|A>2|o>z&
!r&&++C*--A));}}}Z++O>98?O=20:e-O);P N+M*M&&N>-K+1924|d?N:0;}main(){Z++B<121)*G
++=B/x%x<2|B%x<2?7:B/x&4?0:*l++&31;Z B=19){Z B++<99)putchar(B%x?l[B[I]|16]:x)_
x-(B=F)){i=I[B+=(x-F)*x]&z;b=F;b+=(x-F)*x;Z x-(*G=F))i=*G^8^y;}else v u,5);v u,
1);}}
P.S. Про все версии шахматных микропрограмм от Оскара Толедо Гутьерреса: http://www.nanochess.org/chess.html

P.P.S. А ещё он выпустил книжку в 2014 году с 180 страницами комментариев к своему коду :)
http://www.lulu.com/shop/oscar-toledo-gutierrez/toledo-nanochess-the-commented-source-code/hardcover/product-21429040.html
http://www.amazon.com/Toledo-Nanochess-Commented-Source-Code/dp/1304864375
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: [SRC] CHESS

Post by Shaos »

Пропустил исходник через сишный препроцессор и вручную причесал:

Code: Select all

char*l="ustvrtsuqqqqqqqqyyyyyyyy}{|~z|{}"
"   76Lsabcddcba .pknbrq  PKNBRQ ?A6J57IKJT576,+-48HLSU";

B,i,y,u,b,I[411],*G=I,x=10,z=15,M=1e4;

X(w,c,h,e,S,s)
{
 int t,o,L,E,d,O=e,N=-M*M,K=78-h<<x,p,*g,n,*m,A,q,r,C,J,a=y?-x:x;
 y^=8;
 G++;
 d=w||s&&s>=h&&X(0,0,0,21, 0,0)>M;
 do
 {
  if(o=I[p=O])
  {
   q=o&z^y;
   if(q<7)
   {
    A=q--&2?8:4;
    C=o-9&z?q["& .$  "]:42;
    do
    {
     r=I[p+=C[l]-64];
     if(!w|p==w)
     {
      g=q|p+a-S?0:I+S;
      if(!r&(q|A<3||g)||(r+1&z^y)>9&&q|A>2)
      {
       if(m=!(r-2&7)) return --G,y^=8,G[1]=O,K;
       J=n=o&z;
       E=I[p-a]&z;
       t=q|E-7?n:(n+=2,6^y);
       while(n<=t)
       {
        L=r?l[r&7]*9-189-h-q:0;
        if(s) L+=(1-q?l[p/x+5]-l[O/x+5]+l[p%x+6]*-~!q-l[O%x+6]+o/16*8:!!m*9)+(q?0:!(I[p-1]^n)+!(I[p+1]^n)+l[n&7]*9-386+!!g*99+(A<2))+!(E^y^9);
        if(s>h||1<s&s==h&&L>z|d)
        {
         p[I]=n,O[I]=m?*g=*m,*m=0:g?*g=0:0;
         L-=X(s>h|d?0:p,L-N,h+1,G[1],J=q|A>1?0:p,s);
         if(!(h||s-1|B-O|i-n|p-b|L<-M)) return--G,y^=8,y^=8,u=J;
         J=q-1|A<7||m||!s|d|r|o<z||X(0,0,0,21, 0,0)>M;
         O[I]=o;
         p[I]=r;
         m?*m=*g,*g=0:g?*g=9^y:0;
        }
        if(L>N)
        {
         *G=O;
         if(s>1)
         {
          if(h&&c-L<0) return --G,y^=8,L;
          if(!h)i=n,B=O,b=p;
         }
         N=L;
        }
        n+=J||(g=I+p,m=p<O?g-3:g+2,*m<z|m[O-p]||I[p+=p-O]);
       }
      }
     }
    }
    while(!r&q>2||(p=O,q|A>2|o>z&!r&&++C*--A));
   }
  }
 }
 while(++O>98?O=20:e-O);
 return --G,y^=8,N+M*M&&N>-K+1924|d?N:0;
}

main()
{
 while(++B<121) *G++=B/x%x<2|B%x<2?7:B/x&4?0:*l++&31;
 while(B=19)
 {
   while(B++<99)putchar(B%x?l[B[I]|16]:x);
   if(x-(B=getchar()&z))
   {
    i=I[B+=(x-getchar()&z)*x]&z;
    b=getchar()&z;
    b+=(x-getchar()&z)*x;
    while(x-(*G=getchar()&z)) i=*G^8^y;
   }
   else X(0,0,0,21, u,5);
   X(0,0,0,21, u,1);
 }
}
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: [SRC] CHESS

Post by Shaos »

Интересно, что Toledo nanoChess включёна в регулярные тестовые соревнования шахматных движков:

http://www.computerchess.org.uk/ccrl/404/

Сейчас она (программа) там занимает 466-е место...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: [SRC] CHESS

Post by Shaos »

Shaos wrote:А ещё он выпустил книжку в 2014 году с 180 страницами комментариев к своему коду
Получил книжку - читаю :)

Там кроме nanochess все другие его шахматные программки напечатаны :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: [SRC] CHESS

Post by Shaos »

Добавил вокруг доски буквы A-H и цифры 1-8, а то тяжко было каждый раз ходы делать, вычисляя позицию:

Code: Select all

#include <stdio.h>

char*l="ustvrtsuqqqqqqqqyyyyyyyy}{|~z|{}   76Lsabcddcba .pknbrq  PKNBRQ ?A6J57IKJT576,+-48HLSU";

int B,i,y,u,b,I[411],*G=I,x=10,z=15,M=1e4;

X(w,c,h,e,S,s)
{
 int t,o,L,E,d,O=e,N=-M*M,K=78-h<<x,p,*g,n,*m,A,q,r,C,J,a=y?-x:x;
 y^=8;
 G++;
 d=w||s&&s>=h&&X(0,0,0,21, 0,0)>M;
 do
 {
  if(o=I[p=O])
  {
   q=o&z^y;
   if(q<7)
   {
    A=q--&2?8:4;
    C=o-9&z?q["& .$  "]:42;
    do
    {
     r=I[p+=C[l]-64];
     if(!w|p==w)
     {
      g=q|p+a-S?0:I+S;
      if(!r&(q|A<3||g)||(r+1&z^y)>9&&q|A>2)
      {
       if(m=!(r-2&7)) return --G,y^=8,G[1]=O,K;
       J=n=o&z;
       E=I[p-a]&z;
       t=q|E-7?n:(n+=2,6^y);
       while(n<=t)
       {
        L=r?l[r&7]*9-189-h-q:0;
        if(s) L+=(1-q?l[p/x+5]-l[O/x+5]+l[p%x+6]*-~!q-l[O%x+6]+o/16*8:!!m*9)+(q?0:!(I[p-1]^n)+!(I[p+1]^n)+l[n&7]*9-386+!!g*99+(A<2))+!(E^y^9);
        if(s>h||1<s&s==h&&L>z|d)
        {
         p[I]=n,O[I]=m?*g=*m,*m=0:g?*g=0:0;
         L-=X(s>h|d?0:p,L-N,h+1,G[1],J=q|A>1?0:p,s);
         if(!(h||s-1|B-O|i-n|p-b|L<-M)) return --G,y^=8,y^=8,u=J;
         J=q-1|A<7||m||!s|d|r|o<z||X(0,0,0,21, 0,0)>M;
         O[I]=o;
         p[I]=r;
         m?*m=*g,*g=0:g?*g=9^y:0;
        }
        if(L>N)
        {
         *G=O;
         if(s>1)
         {
          if(h&&c-L<0) return --G,y^=8,L;
          if(!h)i=n,B=O,b=p;
         }
         N=L;
        }
        n+=J||(g=I+p,m=p<O?g-3:g+2,*m<z|m[O-p]||I[p+=p-O]);
       }
      }
     }
    }
    while(!r&q>2||(p=O,q|A>2|o>z&!r&&++C*--A));
   }
  }
 }
 while(++O>98?O=20:e-O);
 return --G,y^=8,N+M*M&&N>-K+1924|d?N:0;
}

main()
{
 while(++B<121) *G++=B/x%x<2|B%x<2?7:B/x&4?0:*l++&31;
 while(B=19)
 {
#ifdef DEBUG
   FILE *f = fopen("out","at");
#endif
   printf(" | A B C D E F G H |\n-+-----------------+-");
   while(B++<99)
   {
#ifdef DEBUG
    fprintf(f,"%i %i %c\n",B,B%x,l[B[I]|16]);
#endif
    if((B%x)==0) printf("\n%i|",10-B/x);
    else if((B%x)==9) printf(" |%i",10-B/x);
    else{putchar(' ');putchar(B%x?l[B[I]|16]:x);}
   }
   printf("\n-+-----------------+-\n | A B C D E F G H |\n>>>");
#ifdef DEBUG
   fclose(f);
#endif
   if(x-(B=getchar()&z))
   {
    i=I[B+=(x-getchar()&z)*x]&z;
    b=getchar()&z;
    b+=(x-getchar()&z)*x;
    while(x-(*G=getchar()&z)) i=*G^8^y;
   }
   else X(0,0,0,21, u,5);
   X(0,0,0,21, u,1);
 }
}
процесс игры теперь выглядит так:

Code: Select all

 | A B C D E F G H |
-+-----------------+-
8| r n b q k b n r |8
7| p p p p p p p p |7
6| . . . . . . . . |6
5| . . . . . . . . |5
4| . . . . . . . . |4
3| . . . . . . . . |3
2| P P P P P P P P |2
1| R N B Q K B N R |1
-+-----------------+-
 | A B C D E F G H |
>>>e2e4
 | A B C D E F G H |
-+-----------------+-
8| r n b q k b n r |8
7| p p p p p p p p |7
6| . . . . . . . . |6
5| . . . . . . . . |5
4| . . . . P . . . |4
3| . . . . . . . . |3
2| P P P P . P P P |2
1| R N B Q K B N R |1
-+-----------------+-
 | A B C D E F G H |
>>>
 | A B C D E F G H |
-+-----------------+-
8| r n b q k b n r |8
7| p p p . p p p p |7
6| . . . . . . . . |6
5| . . . p . . . . |5
4| . . . . P . . . |4
3| . . . . . . . . |3
2| P P P P . P P P |2
1| R N B Q K B N R |1
-+-----------------+-
 | A B C D E F G H |
>>>
P.S. Погонял тесты - когда функция возвращает кучу всего через запятую (типа такого return --G,y^=8,N+M*M&&N>-K+1924|d?N:0;), а с той стороны принимают только один int, то в него записывается последнее из списка (т.е. N+M*M&&N>-K+1924|d?N:0)
Я тут за главного - если что шлите мыло на me собака shaos точка net