nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 23 Oct 2017 03:43



Reply to topic  [ 5 posts ] 
[SRC] CHESS 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15563
Location: Colorado
Reply with quote
Наверное надо поговорить о самописанных шахматных программах, и начать с Toldeo Nanochess, которые пролетали уже у нас, но теперь у них есть страничка в википедии (https://en.wikipedia.org/wiki/Toledo_Nanochess) и новый веб-сайт:

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

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

Code:
/**************************************************************************\
| 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

_________________
:eugeek: https://twitter.com/Shaos1973


28 Jan 2016 16:29
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15563
Location: Colorado
Reply with quote
Пропустил исходник через сишный препроцессор и вручную причесал:
Code:
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);
 }
}

_________________
:eugeek: https://twitter.com/Shaos1973


28 Jan 2016 17:07
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15563
Location: Colorado
Reply with quote
Интересно, что Toledo nanoChess включёна в регулярные тестовые соревнования шахматных движков:

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

Сейчас она (программа) там занимает 466-е место...

_________________
:eugeek: https://twitter.com/Shaos1973


30 Jan 2016 19:33
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15563
Location: Colorado
Reply with quote
Shaos wrote:
А ещё он выпустил книжку в 2014 году с 180 страницами комментариев к своему коду

Получил книжку - читаю :)

Там кроме nanochess все другие его шахматные программки напечатаны :)

_________________
:eugeek: https://twitter.com/Shaos1973


14 Feb 2016 12:17
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15563
Location: Colorado
Reply with quote
Добавил вокруг доски буквы A-H и цифры 1-8, а то тяжко было каждый раз ходы делать, вычисляя позицию:
Code:
#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:
 | 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)

_________________
:eugeek: https://twitter.com/Shaos1973


17 Feb 2016 17:26
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 5 posts ] 

Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.