Juego de Ajedrez Toledo en Java
Entre el 16 y el 20 de marzo del 2009 trasladé
Toledo Nanochess a lenguaje Java, con la versión
más reciente el código fuente resultante mide exactamente 2835 bytes, lo que lo
convierte en el programa de ajedrez más pequeño del mundo en Java, la clase
compilada ocupa 4538 bytes, aparte 967 bytes de las gráficas (reutiliza las del
Ajedrez Toledo Javascript).
Vealo en acción, para jugar haga click en la pieza deseada
y luego click en el cuadro destino:
La pieza de coronación está fija en reina y actualmente
no hay forma de jugar con las piezas negras.
Solo comprobado con Windows en la Java VM 1.6 de Sun.
El código fuente
El lenguaje Java hereda la sintaxis de los lenguajes C y
C++ y es primo del lenguaje Javascript, así que resultó relativamente sencillo
realizar el traslado de Toledo Nanochess.
La mayor parte del código se parece mucho al original,
excepto que los apuntadores fueron trasladados a acceso a matrices.
Las diferencias son notables en el código fuente al
comparar C y Java, éste último tiene nombres más largos y por ejemplo no es
posible asignar un entero a un booleano o viceversa, no se maneja el operador
coma, y la 2da. edición de Java vuelve obsoletas varias características de la
interfaz gráfica. Aún así el programa hereda la naturaleza confusa del
original.
El nivel de juego está fijo en una profundidad de 4
movimientos, y puede ser modificado (busque /*ply*/ en el código
fuente), pero cada nivel extra es un orden de magnitud más lento.
Una breve descripción del funcionamiento de este código
puede hallarse en la sección dedicada al
Ajedrez Toledo 1.
//(c)2010 Oscar Toledo G.
import java.applet.*;import java.awt.event.*;import java.awt.*;
public class toledo_chess extends Applet implements MouseListener{
int B,i,y,u,b,I[]=new int[411],G=120,l[]={5,3,4,6,2,4,3,5,1,1,1,1,1,1,1,1,9,9,9
,9,9,9,9,9,13,11,12,14,10,12,11,13,0,11,0,34,33,55,94,0,1,2,3,3,2,1,0,-1,1,-10,
10,-11,-9,9,11,10,20,-9,-11,-10,-20,-21,-19,-12,-8,8,12,19,21,53,47,61,51,47,47
};Image[]im;static final int x=10,z=15,M=10000;
public void init(){for(B=i=y=u=b=0;B++<120;)I[B-1]=B%x!=0?B/x%x<2|B%x<2?7:(B/x&
4)!=0?0:l[i++]|16:7;im=new Image[16];for(;b<15;b++)if(b<7|b>8)im[b]=this.
getImage(this.getDocumentBase(),b+".gif");addMouseListener(this);}
public void stop(){removeMouseListener(this);}
public void update(Graphics g){paint(g);}
public void paint(Graphics g){int x,y,c=21,a;boolean n=false;for(y=0;y<320;y+=
40){for(x=0;x<320;x+=40){g.drawImage(im[I[c]&z],x,y,40,40,n?new Color(144,144,
208):new Color(192,192,255),this);if(c==B){g.setColor(new Color(255,255,0));g.
drawRect(x,y,39,39);g.drawRect(x+1,y+1,37,37);}c++;n=!n;}c+=2;n=!n;}}
void Z(){paint(getGraphics());}public void mouseExited(MouseEvent e){}public
void mousePressed(MouseEvent e){}public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseReleased(MouseEvent e){int s=e.getX()/40+(e.getY()/40*x+21);i=
(I[s]^y)&z;if(i>8){B=s;Z();}else if(B!=0&&i<9){b=s;i=I[B]&z;if((i&7)==1&(b<29|b
>90))i=14^y;X(0,0,0,21,u,1);B=0;Z();if(y>0){X(0,0,0,21,u,4/*ply*/);X(0,0,0,21,u
,1);B=0;Z();}}}
public String getAppletInfo(){return"Toledo Java Chess by Oscar Toledo G.";}
int X(int w,int c,int h,int e,int S,int s){int t,o,L,E,d,O=e,N=-M*M,K=78-h<<x,p
,g,n,m,A,q,r,C,a=y>0?-x:x;boolean D,J;y^=8;G++;D=w>0||s>0&&s>=h&&X(0,0,0,21,0,0
)>M;do{if((o=I[p=O])>0){q=o&z^y;if(q<7){A=(q--&2)>0?8:4;C=(o&z)!=9?l[69+q]:57;
do{r=I[p+=l[C]];if(w<1|p==w){g=q>0|p+a!=S?0:S;if(r<1&(q>0|A<3||g>0)||(r+1&z^y)>
9&&q>0|A>2){if((r&7)==2){y^=8;I[G--]=O;return K;}m=0;n=o&z;J=true;E=I[p-a]&z;if
(q>0|E!=7)t=n;else{n+=2;t=6^y;}while(n<=t){L=(r>0?l[r&7|32]*9-h-q:0);if(s>0)L+=
(q!=1?l[p/x+37]-l[O/x+37]+l[p%x+38]-l[O%x+38]+o/16*8:(m>0?9:0))+(q<1?l[p%x+38]-
1+((I[p-1]^n)<1?1:0)+((I[p+1]^n)<1?1:0)+l[n&7|32]*9-99+(g>0?99:0)+(A<2?1:0):0)+
((E^y^9)<1?1:0);if(s>h||1<s&s==h&&L>z|D){I[p]=n;I[O]=0;if(m>0){I[g]=I[m];I[m]=0
;}else if(g>0)I[g]=0;L-=X(s>h|D?0:p,L-N,h+1,I[G+1],E=q>0|A>1?0:p,s);if(h<1&s==1
&&B==O&i==n&p==b&L>-M){G--;return u=E;}J=q!=1||A<7||m>0||s<1|D|r>0|o<z||X(0,0,0
,21,0,0)>M;I[O]=o;I[p]=r;if(m>0){I[m]=I[g];I[g]=0;}else if(g>0)I[g]=9^y;}if(L>N
){I[G]=O;if(s>1){if(h>0&&c-L<0){y^=8;G--;return L;}if(h<1){i=n;B=O;b=p;}}N=L;}
if(J)n++;else{g=p;m=p<O?g-3:g+2;if(I[m]<z|I[m+O-p]>0||I[p+=p-O]>0)n++;}}}}}
while(r<1&q>2||((p=O)>0)&&(q>0|A>2|o>z&r<1)&&++C>0&&--A>0);}}if(++O>98)O=20;}
while(e!=O);y^=8;G--;return N!=-M*M&&N>-K+1924|D?N:0;}}
Java tiende a ser un poco lento debido a que se compila a un
lenguaje intermedio y después se interpreta o traslada en tiempo de
ejecución.
Como compilarlo
Para compilar el
código
fuente es necesario disponer del Java Development Kit descargable desde
http://java.sun.com/
Desde la ubicación del compilador Java y con el código
fuente en el mismo directorio, introduzca en la línea de órdenes:
javac -d . toledo_chess.java -Xlint:deprecation -g:none -target 1.5
Esto generará el archivo de clase lo más pequeño posible,
que luego puede ser invocado por un archivo HTML para ser ejecutado por un
navegador de Internet:
<applet code="toledo_chess.class" width="320" height="320">
</applet>
Por supuesto este código HTML (llámelo algo así como
ajedrez.html) debe estar en el mismo directorio que el archivo
toledo_chess.class, y recuerde poner las gráficas GIF disponibles
en el archivo ZIP del
Ajedrez Toledo Javascript.
Ligas relacionadas
- El ajedrez Toledo Java es el núcleo de IA
utilizado para el impresionante
Wearable
Chess por Mitchell J.
Última modificación: 10-oct-2015