content: // <applet code="Ant" width=100 height=100>
  // <PARAM NAME="refresh" VALUE="60">
  // <PARAM NAME="rndPixels" VALUE="100">
  // </applet>
  // (Generalized) Langton's Ant Automaton
  // http://en.wikipedia.org/wiki/Langton%27s_ant
  // FB - 201102163
  import java.applet.Applet;
  import java.awt.*;
  import java.awt.image.*;
  import java.util.Arrays;
  
  public class Ant extends Applet
  {
      Image img;
      int pix[],mat[];
      int red[],green[],blue[];
      int w,h;
      long ctm;
      int rep[],dir[]; // byte replacement and direction arrays
      int[] dirx={1,1,0,-1,-1,-1,0,1};
      int[] diry={0,1,1,1,0,-1,-1,-1};
      int x,y; // location of the ant
      int refresh; // refresh period in seconds
      int rndPixels; // # of initial random pixels on the screen
  
      private void putPixel(int x,int y,int c)
      {
          int alpha=255;
          pix[w*y+x]=(alpha<<24)|(red[c]<<16)|(green[c]<<8)|blue[c];
          mat[w*y+x]=c;
      }
      
      public void init()
      {
          refresh=Integer.parseInt(getParameter("refresh"))*1000;
          rndPixels=Integer.parseInt(getParameter("rndPixels"));
          w=getSize().width;
          h=getSize().height;
          pix=new int[w*h]; 
          mat=new int[w*h];
          Arrays.fill(pix,2147483647);
          
          // create a color palette (RGBY)
          red=new int[256];
          green=new int[256];
          blue=new int[256];
          
          for(int i=0;i<256;i++)
          {
              switch((int)(i/64))
              {
                  case 0:
                      red[i]=(i%64)*3+64;
                      green[i]=0;
                      blue[i]=0;
                      break;
                  case 1:
                      red[i]=0;
                      green[i]=(i%64)*3+64;
                      blue[i]=0;
                      break;
                  case 2:
                      red[i]=0;
                      green[i]=0;
                      blue[i]=(i%64)*3+64;
                      break;
                  case 3:
                      red[i]=(i%64)*3+64;
                      green[i]=(i%64)*3+64;
                      blue[i]=0;
                      break;
              }
          }
  
          // create byte replacement and direction arrays
          rep=new int[256];
          dir=new int[256];
          
          for(int i=0;i<256;i++)
          {
              rep[i]=(int)(Math.random()*256);
              dir[i]=(int)(Math.random()*8);
          }
          
          // put random pixels onto screen and start the ant from the last one
          for(int i=0;i<rndPixels;i++)
          {
              x=(int)(Math.random()*w);
              y=(int)(Math.random()*h);
              putPixel(x,y,(int)(Math.random()*256));
          }
  
          ctm=System.currentTimeMillis();        
      }
  
      public void paint(Graphics g)
      {
          // restart the applet periodically
          if((System.currentTimeMillis()-ctm)>=refresh) {init();}
  
          // run the ant 1 step
          int c=mat[w*y+x];
          putPixel(x,y,rep[c]);
          x+=dirx[dir[c]];
          y+=diry[dir[c]];
          // keep the ant in the screen
          if(x<0) x+=w;
          if(x>w-1) x-=w;
          if(y<0) y+=h;
          if(y>h-1) y-=h;
          
          img=createImage(new MemoryImageSource(w,h,pix,0,w));
          g.drawImage(img,0,0,this);
          repaint();
      }
  
      public void update(Graphics g) { paint(g); } // to prevent flickering
  }
  