nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 05:41



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

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
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

_________________
:dj: https://mastodon.social/@Shaos


28 Jan 2016 13:29
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
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);
 }
}

_________________
:dj: https://mastodon.social/@Shaos


28 Jan 2016 14:07
Profile WWW
Admin
User avatar

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

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

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

_________________
:dj: https://mastodon.social/@Shaos


30 Jan 2016 16:33
Profile WWW
Admin
User avatar

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

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

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

_________________
:dj: https://mastodon.social/@Shaos


14 Feb 2016 09:17
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
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)

_________________
:dj: https://mastodon.social/@Shaos


17 Feb 2016 14: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 18 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.