good luck then. A chess program is a formidable task, make one and you will know for sure you are a good programmer.
The one I did some time ago computed all possible moves chessboard positions N moves ahead, remembering from which sequence they came from, then used a kind of recursive minimax scoring approach to solve the game backwards, terribly inefficient, but in theory it could calculate to any depth.
Crazy thing is I wrote it in matlab as an exercise to learn it: it had many cool features that made the programming simpler, but was pretty slow
here is the code, if you ever happen to get on matlab (though it doesn't have an interface, it just generates a random position, shows it as a 8x8 matrix, and then tells you which move he would do)
btw, are you a good chess player? I have around 1600 elo on yahoo
The one I did some time ago computed all possible moves chessboard positions N moves ahead, remembering from which sequence they came from, then used a kind of recursive minimax scoring approach to solve the game backwards, terribly inefficient, but in theory it could calculate to any depth.
Crazy thing is I wrote it in matlab as an exercise to learn it: it had many cool features that made the programming simpler, but was pretty slow
here is the code, if you ever happen to get on matlab (though it doesn't have an interface, it just generates a random position, shows it as a 8x8 matrix, and then tells you which move he would do)
%1=pawn %3=knight %4=alfiere %5=torre %9=regina %88=re % %la variabile servono varie variabili "contamosse": una di una dimensione % incateni sulla prima dimensione le mosse e fai un vettore delle mosse unidimensionale... % poi incateni function matteochessprogram2 depth=3; mosseprime=zeros(4,50); mosseseconde=zeros(4,50,50); mosseterze=zeros(4,50,50,50); mossequarte=zeros(4,50,50,50,50); board=zeros(8,8); contamosse=0; for i=1:8 board(2,i)=1; board(7,i)=-1; end board(1,1)=5;board(1,2)=3;board(1,3)=4;board(1,4)=88;board(1,5)=9;board(1,6)=4;board(1,7)=3;board(1,8)=5; board(8,1)=-5;board(8,2)=-3;board(8,3)=-4;board(8,4)=-88;board(8,5)=-9;board(8,6)=-4;board(8,7)=-3;board(8,8)=-5; %for i=1:8 %for j=1:2 % board(j,i)=randompiece(1); % board(9-j,i)=randompiece(-1); %end %end player=1 for t=1:40 t ottimo=evaluate(board,player,depth); mossafatta=ottimo(1:4); board=applymove(mossafatta,board); board player=-player; end function ra=randompiece(player) y=rand(1)*100; if y<50 ra=1; elseif y<60 ra=5; elseif y<70 ra=3; elseif y<80 ra=4; elseif y<90 ra=9; else ra=88; end ra=ra*player; function ottimo=evaluate(board,player,depth) if depth==1 ottimo=evaluate1(board,player); end if depth>1 posizioni1=zeros(8,8,27,8,8); rispottima=zeros(5,27,8,8); for row1=1:8 for column1=1:8 if (sign (board(row1,column1))==player) mosse1(:,:,row1,column1)=computemovesperpiece(player,board,[row1,column1]); s1=1; while mosse1(s1,1,row1,column1)>0 posizioni1(:,:,s1,row1,column1)=applymove([row1,column1,mosse1(s1,1,row1,column1),mosse1(s1,2,row1,column1)],board); s1=s1+1 ; end end end end for row1=1:8 for column1=1:8 for s1=1:27 if any (posizioni1(:,:,s1,row1,column1)) rispottima(:,s1,row1,column1)=evaluate(posizioni1(:,:,s1,row1,column1),-player,depth-1); rating=-rispottima(5,:,:,:)-(rispottima(5,:,:,:)==0)*10000; end end end end rating; [C,I] = max(rating); [C2,I2]=max(C); [C3,I3]=max(C2); C3; colottima=I3; rowottima=I2(I3); mossaottima=I(1,1,rowottima,colottima); arrivoottimo=mosse1(mossaottima,:,rowottima,colottima); rating(1,mossaottima,rowottima,colottima); ottimo=[rowottima colottima arrivoottimo(1) arrivoottimo(2) rating(1,mossaottima,rowottima,colottima)]; end function ottimo=evaluate1(board,player) rating=zeros(27,8,8); for row=1:8 for column=1:8 if (sign (board(row,column))==player) mosse(:,:,row,column)=computemovesperpiece(player,board,[row,column]); s=1; while mosse(s,1,row,column)>0 posizioni(:,:,s,row,column)=applymove([row,column,mosse(s,1,row,column),mosse(s,2,row,column)],board); rating (s,row,column)=sum(sum(posizioni(:,:,s,row,column)))*player+1000; s=s+1 ; end end end end [C,I] = max(rating); [C2,I2]=max(C); [C3,I3]=max(C2); colottima=I3; rowottima=I2(I3); mossaottima=I(1,rowottima,colottima); arrivoottimo=mosse(mossaottima,:,rowottima,colottima); ottimo=[rowottima colottima arrivoottimo(1) arrivoottimo(2) rating(mossaottima,rowottima,colottima)]; rating(mossaottima,rowottima,colottima); function newboard=applymove(move,board) newboard=board; newboard(move(1),move(2))=0; newboard(move(3),move(4))=board(move(1),move(2)); function possiblemoves=computemovesahead(player,board,position,direction,range) possiblemoves=zeros(0,2); i=0; numberofmoves=0; blocked=0; while blocked==0 & i<range i=i+1; if (position(1)+direction(1)*i<1) | (position(1)+direction(1)*i>8) | (position(2)+direction(2)*i<1) | (position(2)+direction(2)*i>8) blocked=1; else if board(position(1)+direction(1)*i,position(2)+direction(2)*i)==0 numberofmoves=numberofmoves+1; %possiblemoves(numberofmoves,:)=position+direction*i; possiblemoves=vertcat(possiblemoves,position+direction*i); elseif sign (board(position(1)+direction(1)*i,position(2)+direction(2)*i))~=player numberofmoves=numberofmoves+1; %possiblemoves(numberofmoves,:)=position+direction*i; possiblemoves=vertcat(possiblemoves,position+direction*i); blocked=1; elseif sign (board(position(1)+direction(1)*i,position(2)+direction(2)*i))==player blocked=1; end end end function possiblemoves=computemovesperpiece(player,board,position) possiblemoves=zeros(0,2); totalmoves=0; if abs(board(position(1),position(2)))==88 %RE for i=-1:1 for j=-1:1 possiblemoves=vertcat(possiblemoves, computemovesahead(player,board,position,[i,j],1) ); end end end if abs(board(position(1),position(2)))==9 %REGINA for i=-1:1 for j=-1:1 possiblemoves=vertcat(possiblemoves, computemovesahead(player,board,position,[i,j],8) ); end end end if abs(board(position(1),position(2)))==1 %pedone if position(2)<8 & position(2)>1 & sign ( board(position(1)+player,position(2)+1) )==-player & sign ( board(position(1)+player,position(2)-1) )== -player & board(position(1)+player,position(2))==0 for j=-1:1 possiblemoves=vertcat(possiblemoves, computemovesahead(player,board,position,[player,j],1) ); end elseif position(2)<8 & position(2)>1 & sign ( board(position(1)+player,position(2)+1) )==-player & sign ( board(position(1)+player,position(2)-1) )== -player for j=-1:2:1 possiblemoves=vertcat(possiblemoves, computemovesahead(player,board,position,[player,j],1) ); end elseif position(2)<8 & sign ( board(position(1)+player,position(2)+1) )==-player & board(position(1)+player,position(2))==0 for j=0:1 possiblemoves=vertcat(possiblemoves, computemovesahead(player,board,position,[player,j],1) ); end elseif position(2)<8 & sign ( board(position(1)+player,position(2)+1) )==-player for j=1:1 possiblemoves=vertcat(possiblemoves, computemovesahead(player,board,position,[player,j],1) ); end elseif position(2)>1 & sign ( board(position(1)+player,position(2)-1) )== -player & board(position(1)+player,position(2))==0 for j=-1:0 possiblemoves=vertcat(possiblemoves, computemovesahead(player,board,position,[player,j],1) ); end elseif position(2)>1 & sign ( board(position(1)+player,position(2)-1) )== -player for j=-1:-1 possiblemoves=vertcat(possiblemoves, computemovesahead(player,board,position,[player,j],1) ); end else if (board(position(1)+player,position(2))==0) possiblemoves=vertcat(possiblemoves, computemovesahead(player,board,position,[player,0],1) ); end end end if abs(board(position(1),position(2)))==5 %torre for i=-1:1 for j=-1:1 if i*j==0 possiblemoves=vertcat(possiblemoves, computemovesahead(player,board,position,[i,j],8) ); end end end end if abs(board(position(1),position(2)))==4 %alfio for i=-1:1 for j=-1:1 if i*j~=0 possiblemoves=vertcat(possiblemoves, computemovesahead(player,board,position,[i,j],8) ); end end end end if abs(board(position(1),position(2)))==3 %cavallo for i=-2:2 for j=-2:2 if abs(i*j)==2 possiblemoves=vertcat(possiblemoves, computemovesahead(player,board,position,[i,j],1) ); end end end end if size(possiblemoves,1)<28 possiblemoves=vertcat(possiblemoves,zeros( 28-size(possiblemoves,1),2)); end function rate(board,player)
btw, are you a good chess player? I have around 1600 elo on yahoo