public class RandomMosaicWalk2 {

   /*
      This program shows a window full of randomly colored
      squares.  A "disturbance" moves randomly around
      in the window, randomly changing the color of
      each square that it visits.  The program runs
      until the user closes the window.
   */
   
   final static int ROWS = 30;        // Number of rows in the mosaic.
   final static int COLUMNS = 30;     // Number of columns in the mosaic.
   final static int SQUARE_SIZE = 15; // Size of each square in the mosaic.
       
   static int currentRow; // row currently containing the disturbance
   static int currentColumn; // column currently containing disturbance
           
   public static void main(String[] args) {
          // Main program creates the window, fills it with
          // random colors, then moves the disturbance in
          // a random walk around the window.
       Mosaic.open(ROWS, COLUMNS, SQUARE_SIZE, SQUARE_SIZE);
       fillWithRandomColors();
       currentRow = ROWS / 2;   // start at center of window
       currentColumn = COLUMNS / 2;
       while (Mosaic.isOpen()) {
           changeToRandomColor(currentRow, currentColumn);
           randomMove();
           Mosaic.delay(20);
       }
   }  // end of main()
   
   static void fillWithRandomColors() {
           // Fill every square, in each row and column,
           // with a random color.
        for (int row=0; row < ROWS; row++) {
           for (int column=0; column < COLUMNS; column++) {
               changeToRandomColor(row, column);  
           }
        }
   }  // end of fillWithRandomColors()
   
   static void changeToRandomColor(int rowNum, int colNum) {
           // Change the square in row number rowNum and
           // column number colNum to a random color.
        int red = (int)(256*Math.random());    // choose random levels in range
        int green = (int)(256*Math.random());  //     0 to 255 for red, green, 
        int blue = (int)(256*Math.random());   //     and blue color components
        Mosaic.setColor(rowNum,colNum,red,green,blue);  
    }  // end of changeToRandomColor()
    
    static void randomMove() {
           // Randomly move the disturbance in one of
           // four possible directions: up, down, left, or right;
           // if this moves the disturbance outside the window,
           // then move it to the opposite edge of the window.
        int directionNum; // Randomly set to 0, 1, 2, or 3 to choose direction.
        directionNum = (int)(4*Math.random());
        switch (directionNum) {
           case 0:  // move up 
              currentRow--;
              if (currentRow < 0)
                 currentRow = ROWS - 1;
              break;
           case 1:  // move right
              currentColumn++;
              if (currentColumn >= COLUMNS)
                 currentColumn = 0;
              break; 
           case 2:  // move down
              currentRow ++;
              if (currentRow >= ROWS)
                 currentRow = 0;
              break;
           case 3:  
              currentColumn--;
              if (currentColumn < 0)
                 currentColumn = COLUMNS - 1;
              break; 
        }
    }  // end of randomMove()
   
} // end of class RandomMosaicWalk2
