Solution for
Programming Exercise 3.5
THIS PAGE DISCUSSES ONE POSSIBLE SOLUTION to
the following exercise from this on-line
Java textbook.
Exercise 3.5:
Write an applet that draws a checkerboard. Assume that the size of the applet
is 160 by 160 pixels. Each square in the checkerboard is 20 by 20 pixels.
The checkerboard contains 8 rows of squares and 8 columns. The squares
are red and black. Here is a tricky way to determine whether a given square
is red or black: If the row number and the column number are either both even
or both odd, then the square is red. Otherwise, it is black. Note that
a square is just a rectangle in which the height is equal to the width,
so you can use the subroutine g.fillRect() to draw the squares.
Here is an image of the checkerboard:
(To run an applet, you need a Web page to display it. A very simple page will
do. Assume that your applet class is called Checkerboard, so that
when you compile it you get a class file named Checkerboard.class
Make a file that contains only the lines:
<applet code="Checkerboard.class" width=160 height=160>
</applet>
Call this file Checkerboard.html. This is the source code for
a simple Web page that shows nothing but your applet. You can open the
file in a Web browser or with Sun's appletviewer program. The compiled
class file, Checkerboard.class, must be in the same directory
with the Web-page file, Checkerboard.html.)
Discussion
The basic algorithm is obvious:
for each row on the checkerboard:
Draw all the squares in that row
Since any given row contains eight squares, one in each column of
the checkerboard, we can expand the body of the for loop into another
for loop:
for each row on the checkerboard:
for each of the eight columns:
Draw the square in that row and column
Each square is a rectangle with height 20 and width 20, so
it can be drawn with the command g.fillRect(x,y,20,20),
where x and y are the coordinates of the
top-left corner of the square. Before drawing the square, we have
to determine whether it should be red or black, and we have to set the correct
color with g.setColor. So, the algorithm becomes
for each row on the checkerboard:
for each of the eight columns:
Compute x,y for the top-left corner of the square
if its a red square:
g.setColor(Color.red)
else
g.setColor(Color.black)
g.fillRect(x,y,20,20)
The top of the first row of squares is at y=0. Since each
square is 20 pixels high, the top of the second row is at y=20,
followed by 40 for the third row, then 60, 80, 100, 120, and 140.
If we assume that the rows are numbered 0, 1, 2, ..., 7, then the
tops are given by y = row*20, where row is the row number.
(If you number the rows 1, 2, ..., 8, the formula would be (row-1)*20.
The simpler formula in this and in many similar cases is one reason why computer
scientists like to start counting with 0 instead of 1.)
Similarly, the left edge of the squares in column col is
given by x = col*20, where again the columns are numbered 0,
1, 2, ..., 7. I'll use "for (row=0; row<8; row++)"
to count off the rows,
rather than the equivalent "for (row=0; row<=7; row++)".
The 8 reminds me that I am counting off the eight numbers 0, 1, 2, ..., 7.
Again, this is typical computer science style.
The only problem remaining is how to determine whether the square is red.
As noted in the exercise, a square is red if row and col
are either both even or both odd. Since an integer N is even if
N%2 is 0, the test could be expressed as "if
((row%2 == 0 && col%2 == 0) || (row%2 == 1 && col%2 == 1))".
However, note that this is the same as asking whether row%2 and
col%2 have the same value. So the test can be written more
simply as "if (row%2 == col%2)". Putting this all
together into syntactically correct Java code, the algorithm becomes
for ( row = 0; row < 8; row++ ) {
for ( col = 0; col < 8; col++ ) {
x = 20*col;
y = 20*row;
if ( (row % 2) == (col % 2) )
g.setColor(Color.red);
else
g.setColor(Color.black);
g.fillRect(x,y,20,20);
}
}
Of course, the variables row, col, x,
and y have to be declared to be of type int. Then,
the code goes into the body of the paint() method of an
applet. The syntax of the applet definition must follow the format
given in Section 3.7.
The Solution
import java.awt.*;
import java.applet.*;
public class Checkerboard extends Applet {
/* This applet draws a red-and-black checkerboard.
It is assumed that the size of the applet is 160
by 160 pixels.
*/
public void paint(Graphics g) {
int row; // Row number, from 0 to 7
int col; // Column number, from 0 to 7
int x,y; // Top-left corner of square
for ( row = 0; row < 8; row++ ) {
for ( col = 0; col < 8; col++) {
x = col * 20;
y = row * 20;
if ( (row % 2) == (col % 2) )
g.setColor(Color.red);
else
g.setColor(Color.black);
g.fillRect(x, y, 20, 20);
}
} // end for row
} // end paint()
} // end class
[ Exercises
| Chapter Index
| Main Index
]