### Programming Exercises

For Chapter 6

THIS PAGE CONTAINS programming exercises based on
material from Chapter 6 of this on-line
Java textbook. Each exercise has a link to a discussion of one possible solution of that
exercise.

**Exercise 6.1:**
Write an applet that shows a pair of dice. When the user clicks on the applet, the
dice should be rolled (that is, the dice should be assigned newly computed random
values). Each die should be drawn as a square showing from 1 to 6 dots. Since you
have to draw two dice, its a good idea to write a subroutine, "`void drawDie(Graphics g,
int val, int x, int y)`", to draw a die at the specified `(x,y)` coordinates.
The second parameter, `val`, specifes the value that is showing on the die.
Assume that the size of the applet is 100 by 100 pixels. Here is a working version of
the applet. (My applet plays a clicking sound when the dice are rolled. See the
solution to see how this is done.)

**See the solution!**

**Exercise 6.2:**
Improve your dice applet from the previous exercise so that it also responds
to keyboard input. When the applet has the input focus, it should be hilited
with a colored border, and the dice should be rolled whenever the user
presses a key on the keyboard. This is in addition to rolling them when
the user clicks the mouse on the applet. Here is an applet that
solves this exercise:

**See the solution!**

**Exercise 6.3:**
In Exercise 6.1, above, you wrote a pair-of-dice applet where the dice
are rolled when the clicks on the applet. Now make a pair-of-dice applet
that uses the methods discussed in Section 6.6.
Draw the dice on a JPanel, and place a "Roll" button
at the bottom of the applet. The dice should be rolled when the user clicks the
Roll button. Your applet should look and work like this one:

(Note: Since there was only one button in this applet, I added it directly
to the applet's content pane, rather than putting it in a "buttonBar" panel and adding
the panel to the content pane.)

**See the solution!**

**Exercise 6.4:**
In Exercise 3.5, you drew a checkerboard.
For this exercise, write a checkerboard applet where the user can select a square
by clicking on it. Hilite the selected square by drawing a colored border around it.
When the applet is first created, no square is selected. When the user clicks on
a square that is not currently selected, it becomes selected. If the user clicks the
square that is selected, it becomes unselected. Assume that the size of the
applet is 160 by 160 pixels, so that each square on the checkerboard is 20 by
20 pixels. Here is a working version of the applet:

**See the solution!**

**Exercise 6.5:**
Write an applet that shows two squares. The user should be able to drag
either square with the mouse. (You'll need an instance variable to remember
which square the user is dragging.) The user can drag the square off the applet
if she wants; if she does this, it's gone. You can try it here:

**See the solution!**

**Exercise 6.6:**
For this exercise, you should modify the SubKiller game from Section 6.5.
You can start with the existing source code, from the file SubKillerGame.java.
Modify the game so it keeps track of the number of hits and misses and displays these quantities.
That is, every time the depth charge blows up the sub, the number of hits goes up by one.
Every time the depth charge falls off the bottom of the screen without hitting the sub,
the number of misses goes up by one. There is room at the top of the applet to display
these numbers. To do this exercise, you only have to add a half-dozen lines to the source
code. But you have to figure out what they are and where to add them. To do this, you'll
have to read the source code closely enough to understand how it works.

**See the solution!** (A working version of the applet can be found here.)

**Exercise 6.7:**
Section 3.7 discussed `SimpleAnimationApplet2`, a framework
for writing simple animations. You can define an animation by writing a subclass and defining
a `drawFrame()` method. It is possible to have the subclass implement the
`MouseListener` interface. Then, you can have an animation that responds to mouse
clicks.

Write a game in which the user tries to click on a little square that
jumps erratically around the applet. To implement this,
use instance variables to keep track of the position of the square. In the `drawFrame()`
method, there should be a certain probability that the square will jump to a new location.
(You can experiment to find a probability that makes the game play well.) In your `mousePressed`
method, check whether the user clicked on the square. Keep track of and display the number of
times that the user hits the square and the number of times that the user misses it.
Don't assume that you know the size of the applet in advance.

**See the solution!** (A working version of the applet can be found here.)

**Exercise 6.8:**Write a Blackjack applet that lets the
user play a game of Blackjack, with the computer as the dealer. The applet should draw
the user's cards and the dealer's cards, just as was done for the graphical HighLow
card game in Section 6.6. You can use the source code for
that game, HighLowGUI.java, for some ideas about
how to write your Blackjack game. The structures of the HighLow applet and the Blackjack
applet are very similar. You will certainly want to use the `drawCard()` method
from that applet.

You can find a description
of the game of Blackjack in Exercise 5.5.
Add the following rule to that description: If a player takes five cards without
going over 21, that player wins immediately. This rule is used in some casinos. For your
applet, it means that you only have to allow room for five cards. You should assume that
your applet is just wide enough to show five cards, and that it is tall enough to show
the user's hand and the dealer's hand.

Note that the design of a GUI Blackjack game is very different from the design of the
text-oriented program that you wrote for Exercise 5.5. The user should play the
game by clicking on "Hit" and "Stand" buttons. There should be a "New Game" button that
can be used to start another game after one game ends. You have to decide what happens
when each of these buttons is pressed. You don't have much chance of getting this right
unless you think in terms of the states that the game can be in and how the state can change.

Your program will need the
classes defined in Card.java, Hand.java,
BlackjackHand.java, and Deck.java.
Here is a working version of the applet:

**See the solution!**