CSci 1211 Problem set 9. Due Friday, April 9th at 5pm
Individual work: Problem 1 (12 points)
In this problem you are asked to write an applet that will draw this picture. More specifically:
- The squares alternate orientation and color.
- The number of squares depends on the size of the applet: the
largest orange square (oriented diagonally) has its vertices at the
middles of the sides of the largest square that can be fit into the
applet; the smallest square has the side no less than 10 pixels. To
see how it all works, download the HTML file and the PS9.class file
and try to resize the applet.
- The width of the stroke is 2 pixels. Find the appropriate
constructor of the BasicStroke class to set the width.
Some hints:
- This is definitely a loop problem. The loop should stop when the
side of the square becomes less than 10.
-
It might be helpful to compute the vertices of the new
square from those of the current square.
-
It might also be helpful to
write a method that computes the distance between two points. You
can use this method to figure out when to stop the loop.
- Alternating colors might be somewhat tricky, leave it out until
you get the shape right.
Project Assignment, Part 1 (30 points each person)
For this project you need to implement the Battleship game. Here
is the description of the game. Here are the details of the rules:
- We will use the board 10-by-10, with rows indexed by letter from a
to j going down, and columns indexed by numbers from 1 to 10 left to
right.
- The ships may be positioned horizontally or vertically, but not
diagonally. A ship may be positioned in a straight line only.
- Ships cannot intersect (i.e. occupy the same square).
- We are not going to fix the number and sizes of the ships,
the same program will be able to handle different ship combinations.
Programming details for this part of the program
Your task for this part would be to implement two classes: Board and
Ship. You are given the compiled versions of these
classes (.class files only) and the testing file Game.java.
The class Board will implement one game board (to play a game, you'll
need two instances of this class: one for you and one for your
opponent). The class will have the following public methods:
Board()
a default constructor
boolean addShip(String name, int l, char c, int n, boolean
horizon)
a method to add a ship to the board. Here
name
is the name of the ship (such as Carrier or
Destroyer)
l
is the length of the ship
c,n
are the coordinates (such as a5) of the leftmost
square for a horizontally positioned ship, and of the uppermost square
for a vertically positioned ship
horizon
is a boolean value which is true if the ship
is positioned horizontally, and false if it's positioned vertically.
The method returns true if the ship was added successfully, and false
if one of the following occurred:
- at least one of the coordinates was outside of the grid or had any
other invalid value.
- there is another ship in at least one of the squares to be
occupied by the newly added ship.
If the method returns false then the ship has not been added to the
board.
int shot(char c, int n)
a method that simulates a
shot directed at the board. There are 4 possible return values:
- 0 if the shot is a miss. The board gets updated to record the shot.
- 1 if a ship is hit, but not sunk. The board gets updated to record
the shot. If the Ship class contains information about the hits to the
ship, then the ship gets updated as well.
- 2 if a ship is sunk. The board gets updated to record the
shot. The ship state gets updated if necessary. The message gets
printed with the name of the ship that was sunk, such as "You
have sunk my Carrier"
- -1 if the coordinates are invalid. An error message gets
printed. No shot is recorded.
void printBoard()
prints the contents of the board. 0
is printed for squares that have not been hit, 1 for squares that have
been hit, but no ship is positioned there, and 2 if there is a hit to
a ship.
void printShips()
prints names, lengths, and
positions of all the ships located on the board.
The printing methods are for testing purposes.
The Board class should have two 10-by-10 arrays:
- an array of booleans
to record the opponents shots (false = no shot, true otherwise),
regardless of whether there is a ship there.
- an array of references to objects of class Ship. Each square where
a ship is positioned is a reference to the ship. Squares where no ship
is positioned have a null value.
While the 2-array implementation is not mandatory, it is highly
recommended. If you are considering a different implementation, please
discuss it with me ahead of time.
The class Ship
contains all the information about the
ship (the name, the length, etc.). It may or may not contain the
information about whether the ship has been hit or sunk. Since the
class Ship is not going to be used directly, so the hit/sunk
information can be obtained through the board on which the ship is
positioned.
A suggestion: the printing done directly from the classes Board
and Ship is for debugging purposes only. You might want to add a
variable that indicates whether you are running your program in a test
mode. For instance, if this variable is
boolean testmode = true;
and all the print statements are written under an 'if' statement
if(testmode) System.out.println(...);
then switching this variable to false will turn off all the
printing. You may further fine-tune this approach by having different
kinds of test printing and different kinds of mode variables.
Finally, a few suggestions:
- If you are working in a group, don't split up your work. Work
together, at the same terminal: one person typing, the other person
checking and making suggestions.
- Before you write the first line of code, think carefully of what
information you have in which class and which methods you need. Draw
pictures, write method descriptions.
- If you have any questions, please ask right away. The class list
is the best place to ask. If you see someone's message with a question
and you know the answer, please answer. Even if you think that your
answer may be incomplete, still give it a try. However, don't send
your entire code files to the class list, choose the smallest
possible fragment to explain the problem.
- Write code in small portions, method by method, and test it right
away.
Happy programming!
This page is a part of the course CSci
1211 at UMM.