CPSC 124, Winter 1998
Sample Answers to Lab 3


This page contains sample answers to some of the exercises from Lab #3 in CPSC 124: Introductory Programming, Winter 1998. See the information page for that course for more information.


Exercise 1: The problem was to modify an existing random walk program. It was only necessary to change a few lines of the program. However, the exercise also asked you to modify the comments so that they would be appropriate for the new program. (This is not just make-work. The idea is to encourage you to read the program carefully and understand how it works, why each variable was declared, etc.) In my solution, I have removed two variables, newRow and newCol, since they are not needed in the modified program. I didn't expect you to do this, but it does make the program cleaner.

        /* 
           In this program, a "disturbance" wanders randomly in
           a window.  The window is actually made up of a lot of
           little squares.  Initially, all the squares are black.
           But each time the disturbance visits a square, it
           becomes a slightly brighter shade of green (up to the
           maximum brightness).  The action continues as long as
           the window remains open.  Note that if the disturbance
           wanders off one edge of the window, it appears at the
           opposite edge.

           by David Eck, February 2, 1998
        */


        public class MosaicApplication {

           public static void main(String[] args) {
              
              MosaicFrame mosaic = new MosaicFrame(20,30,20,10);
                  // Open a window with 30 rows and 30 columns of rectangles,
                  // all initially black.

              int row = 15;  // The row in which the disturbance is located.
              int col = 15;  // The column in which the disturbance is located.
                             // (Initial values of 15 put the disturbance in the middle
                             //          of the window.)

              while (mosaic.stillOpen()) { // repeat as long as the window stays open

                 // Executing this while loop will move the disturbance
                 // one space either left, right, up, or down, and increase
                 // the level of green displayed in the square it visits.
                 
                 int rand = (int)(4*Math.random());  // a random number from 0 to 3,
                                                     //   used to decide which direction to move

                 if (rand == 0) {  // move left
                    if (row > 0)
                       row = row - 1;
                    else  // disturbance was already at left edge; move to right edge
                       row = 29;
                 }
                 else if (rand == 1) {  // move right
                    if (row < 29)
                       row = row + 1;
                    else  // disturbance was already at right edge; move to left edge
                       row = 0;
                 }
                 else if (rand == 2) {  // move up
                    if (col > 0)
                       col = col - 1;
                    else  // disturbance was already at top edge; move to bottom
                       col = 29;
                 }
                 else {  // move down
                    if (col < 29)
                       col = col + 1;
                    else  // disturbance was already at bottom edge; move to top
                       col = 0;
                 }

                 int g = mosaic.getGreen(row,col);  // Get current level of green in this square.
                 mosaic.setColor(row,col,0,g+10,0); // Reset color with more green
                                                    //    (but still no red or blue).

                 mosaic.delay(5);  // insert a short delay between steps

              }  // end of while loop

           }  // end of main()

        }  // end of class MosaicApplication


Exercise 2: The exercise was to write the program described in the comment:

        /* 
            This program displays a window containing a grid of little colored
            squares.  Initially, the color of each square is set randomly.
            The program then selects one of the squares at random, selects
            one of its neighbors at random, and colors the selected square
            to match the color of its selected neighbor.  This is repeated
            as long as the window is open.  As the program runs, some colors
            disappear while others take over large patches of the window.
            (Note:  For the purpose of determining the neighbor of a square,
            the bottom edge of the window is considered to be connected to
            the top edge, and the left edge is considered to be connected
            to the right edge.)

            David Eck, February 2, 1998
        */

        public class ConversionExperience {

           public static void main(String[] args) {
              
              MosaicFrame mosaic = new MosaicFrame(30,30);
                  // Open a window with 30 rows and 30 columns of rectangles,
                  // all initially black

              mosaic.fillRandomly();  // start by filling the mosaic with random colors

              while (mosaic.stillOpen()) { // repeat as long as the window stays open

                 // Executing this while loop will select a random square (by selecting
                 // a random row and a random column).  It will then randomly select
                 // a neighbor of that square (by randomly selecting one of the directions
                 // up, down, left, or right).  The color of the selected square is
                 // changed to match the color of its selected neighbor.

                 int row = (int)(30 * Math.random());  // randomly selected row
                 int col = (int)(30 * Math.random());  // randomly selected column

                 int neighborRow = row;  // These will be the row and column of the
                 int neighborCol = col;  //   randomly selected neighbor.  They are
                                         //   initialized to be the same as row and col,
                                         //   but one of them will be changed by
                                         //   the following if statement.

                 int rand = (int)(4*Math.random());  // a random number from 0 to 3,
                                                     //   used to choose the direction in
                                                     //   which the neighbor lies

                 if (rand == 0) {  // choose neighbor to the left
                    if (row > 0)
                       neighborRow = row - 1;
                    else  // square is on the left edge; choose neighbor on right edge
                       neighborRow = 29;
                 }
                 else if (rand == 1) {  // choose neighbor to the right
                    if (row < 29)
                       neighborRow = row + 1;
                    else  // square is on the right edge; choose neighbor on left edge
                       neighborRow = 0;
                 }
                 else if (rand == 2) {  // choose neighbor above
                    if (col > 0)
                       neighborCol = col - 1;
                    else  // square is on the top edge; choose neighbor on bottom edge
                       neighborCol = 29;
                 }
                 else {  // choose neighbor below
                    if (col < 29)
                       neighborCol = col + 1;
                    else  // square is on the bottom edge; choose neighbor on top edge
                       neighborCol = 0;
                 }

                 int r = mosaic.getRed(neighborRow,neighborCol);    // Get color of neighbor
                 int g = mosaic.getGreen(neighborRow,neighborCol);
                 int b = mosaic.getBlue(neighborRow,neighborCol);

                 mosaic.setColor(row,col,r,g,b);  // set color of square to match neighbor

                 mosaic.delay(5);  // insert a short delay between steps

              }  // end of while loop

           }  // end of main()

        }  // end of class ConversionExperience


Exercise 3: This exercise was postponed to Lab 5.


David Eck, 2 February 1998