Computer Science 252
Problem Solving with Java
Spring 2014, The College of Saint Rose
ShirtsAndPants Demo
A working demo of ShirtsAndPants will appear below. Click inside the applet to interact with it.
ShirtsAndPants BlueJ Project
Click here to download a BlueJ project for ShirtsAndPants.
ShirtsAndPants Source Code
The Java source code for ShirtsAndPants is below. Click on a file name to download it.
import objectdraw.*;
import java.awt.*;
import java.util.Random;
/*
* A fancier version of the laundry sorting simulation
* that uses nicer laundry baskets and which can
* use any laundry object which implements the
* Laundry interface.
*
* Jim Teresco, The College of Saint Rose, Fall 2013
* Based on example from Williams College CSCI 134
*
* $Id: ShirtsAndPants.java 2218 2013-10-18 14:06:39Z terescoj $
*/
public class ShirtsAndPants extends WindowController {
// Constants controlling basket locations
private static final int BASKETTOPS = 120;
private static final int BASKETLEFT = 20;
private static final int BASKETOFFSET = 100;
// Constants controlling shirt's position and size
private static final int ITEMLEFT = 115;
private static final int ITEMTOP = 10;
// Location where score should be displayed
private static final int SCORELINE = 200;
private static final int SCORELEFT = 40;
//The piece of laundry to be sorted.
private Laundry item;
// baskets for white, dark, and color washing machines.
private LaundryBasket white;
private LaundryBasket dark;
private LaundryBasket colors;
// The basket corresponding to shirt's color
private LaundryBasket correct;
// Determines if next laundry should be a tshirt or a pair of pants
private Random laundryGenerator = new Random();
// Previously noted position of mouse cursor
private Location lastPoint;
// counters to measure trainees accuracy
private int numsorted, mistakes;
// Display of current result
private Text scoreDisplay;
// Initializes the applet by constructing all the objects.
public void begin(){
white =new LaundryBasket(BASKETLEFT + 0*BASKETOFFSET,
BASKETTOPS,"whites",canvas);
dark =new LaundryBasket(BASKETLEFT + 1*BASKETOFFSET,
BASKETTOPS,"darks",canvas);
colors=new LaundryBasket(BASKETLEFT + 2*BASKETOFFSET,
BASKETTOPS,"colors",canvas);
item= new TShirt(ITEMLEFT,ITEMTOP,canvas);
numsorted = 0;
mistakes = 0;
scoreDisplay = new Text("Correct: " + numsorted +
" Incorrect: " + mistakes,
SCORELEFT,SCORELINE,canvas);
scoreDisplay.setFontSize(13);
}
// Whenever mouse is depressed, note its location
public void onMousePress(Location point) {
lastPoint = point;
}
// If mouse is dragged from a position within the item,
// move the item with it
public void onMouseDrag(Location point) {
if (item.contains(lastPoint)) {
item.move( point.getX() - lastPoint.getX(),
point.getY() - lastPoint.getY());
lastPoint = point;
}
}
// Checks if the item has been place in the correct basket
public void onMouseRelease(Location point){
if (item.contains(lastPoint)) {
// Determine correct basket
if ( item.colorValue() > 600 ) {
correct=white;
}
else if ( item.colorValue() > 250 ) {
correct=colors;
}
else {
correct=dark;
}
}
// if the object was dragged to the correct basket
if ( correct.contains(point)) {
numsorted++;
item.removeFromCanvas();
// Make a new item
if (laundryGenerator.nextInt(2) == 1) {
item = new TShirt(ITEMLEFT,ITEMTOP,canvas);
}
else {
item = new Pants(ITEMLEFT,ITEMTOP,canvas);
}
}
else {
mistakes++;
item.moveTo(ITEMLEFT, ITEMTOP);
}
scoreDisplay.setText("Correct: " + numsorted +
" Incorrect: " + mistakes);
}
}
import objectdraw.*;
/*
* A Java interface that lists the methods required by
* the "laundry" items in a more advanced version of
* the laundry sorter program.
*
* Jim Teresco, The College of Saint Rose, Fall 2013
* Based on example from Williams College CSCI 134
*
* $Id: Laundry.java 2218 2013-10-18 14:06:39Z terescoj $
*/
public interface Laundry {
// Move the laundry relative to its current position
// Parameter:
// xOffset - distance to move horizontally
// yOffset - distance to move vertically
public void move(double xOffset, double yOffset);
// Move the laundry to a specific position:
// x - x coordinate
// y - y coordinate
public void moveTo(double x, double y);
// Remove the laundry from the canvas
public void removeFromCanvas();
// Return true if the point is in the laundry
// Parameters:
// pt - the point to test for containment
public boolean contains(Location pt);
// Return the sum of the redness, blueness, and greenness
// of the laundry item.
public int colorValue();
}
import objectdraw.*;
import java.awt.*;
/*
* A slightly fancier laundry basket object, encapsulating
* the basket with its label.
*
* Jim Teresco, The College of Saint Rose, Fall 2013
* Based on example from Williams College CSCI 134
*
* $Id: LaundryBasket.java 2218 2013-10-18 14:06:39Z terescoj $
*/
public class LaundryBasket {
// Constant controlling basket sizes
private static final int BASKETSIZE = 50;
// Constants controlling text positioning
private static final int TEXTDOWNSET = 30;
private static final int TEXTINSET = 5;
// boundary of basket
private FramedRect box;
// Create a new laundry basket
//
// x,y -- location of basket's upper left corner
// label -- text to display within basket
// canvas - the drawing canvas
public LaundryBasket(double x, double y, String label ,
DrawingCanvas canvas) {
box = new FramedRect(x, y, BASKETSIZE, BASKETSIZE, canvas);
new Text(label, x + TEXTINSET, y + TEXTDOWNSET,
canvas).setFontSize(13);
}
// Test to see if the basket contains a point
public boolean contains(Location point) {
return box.contains(point);
}
}
import objectdraw.*;
import java.awt.*;
import java.util.Random;
/*
* A graphical object that looks a bit like pants,
* which implements the "Laundry" interface.
*
* Jim Teresco, The College of Saint Rose, Fall 2013
* Based on example from Williams College CSCI 134
*
* $Id: Pants.java 2218 2013-10-18 14:06:39Z terescoj $
*/
public class Pants implements Laundry {
// constants to define the dimensions of the pants
// components
private static final double SIZE = 90;
private static final double HIP_WIDTH = SIZE / 3;
private static final double HIP_HEIGHT = SIZE / 3;
private static final double LEG_WIDTH = HIP_WIDTH / 2 - 3;
private static final double LEG_HEIGHT = SIZE - HIP_HEIGHT;
// rectangles that form a border around
private FramedRect leftLegTrim, rightLegTrim, hipTrim;
// rectangles that form the interior color
private FilledRect leftLeg, rightLeg, hips;
// the initial location of the pants
private double startX, startY;
// Current color of the pants
private Color hue;
// Random number generator used to select colors
private Random generator = new Random();
// create a new pair of pants with its upper left corner at (x,y)
public Pants(double x, double y, DrawingCanvas canvas) {
// create boundary rectangles
leftLegTrim = new FramedRect(x, y + HIP_HEIGHT, LEG_WIDTH,
LEG_HEIGHT, canvas);
rightLegTrim = new FramedRect(x + HIP_WIDTH - LEG_WIDTH,
y + HIP_HEIGHT, LEG_WIDTH,
LEG_HEIGHT, canvas);
hipTrim = new FramedRect(x, y, HIP_WIDTH, HIP_HEIGHT, canvas);
// create interior rectangles
leftLeg = new FilledRect(x+1, y+HIP_HEIGHT-1, LEG_WIDTH-1,
LEG_HEIGHT+1, canvas);
rightLeg = new FilledRect(x+HIP_WIDTH-LEG_WIDTH+1, y+HIP_HEIGHT-1,
LEG_WIDTH-1, LEG_HEIGHT+1, canvas);
hips = new FilledRect(x+1, y+1, HIP_WIDTH-1, HIP_HEIGHT-1, canvas);
// remember the starting location for re-set
startX = x;
startY = y;
setColor();
}
// move the pants by specified offsets.
public void move(double xOffset, double yOffset) {
hips.move(xOffset,yOffset);
leftLeg.move(xOffset,yOffset);
rightLeg.move(xOffset,yOffset);
hipTrim.move(xOffset,yOffset);
leftLegTrim.move(xOffset,yOffset);
rightLegTrim.move(xOffset,yOffset);
}
// move the pants to a specific position.
public void moveTo(double x, double y) {
move(x - hips.getX(), y - hips.getY());
}
// remove the pants from the canvas
public void removeFromCanvas() {
hips.removeFromCanvas();
leftLeg.removeFromCanvas();
rightLeg.removeFromCanvas();
hipTrim.removeFromCanvas();
leftLegTrim.removeFromCanvas();
rightLegTrim.removeFromCanvas();
}
// returns true if the pants contains the point; false otherwise
public boolean contains(Location pt) {
return hips.contains(pt) || leftLeg.contains(pt) ||
rightLeg.contains(pt);
}
// pick a new random color for the pants
private void setColor() {
hue = new Color(generator.nextInt(256),
generator.nextInt(256),
generator.nextInt(256));
hips.setColor(hue);
leftLeg.setColor(hue);
rightLeg.setColor(hue);
}
// get the sum of the components of the pant's color
public int colorValue() {
return hue.getRed() + hue.getBlue() + hue.getGreen();
}
}
import objectdraw.*;
import java.awt.*;
import java.util.Random;
/*
* An alternate T-shirt object, this one implements the
* "Laundry" interface.
*
* Jim Teresco, The College of Saint Rose, Fall 2013
* Based on example from Williams College CSCI 134
*
* $Id: TShirt.java 2218 2013-10-18 14:06:39Z terescoj $
*/
// by including "implements Laundry" here, we are promising
// to provide implementations of all methods that are
// listed in the Laundry interface specification.
public class TShirt implements Laundry {
// constants to define the size of the shirt
// note how in this case, all are defined relative
// to a single "SIZE" that we can change and
// have all components change in an appropriate
// proportion.
private static final double SIZE = 120;
private static final double SLEEVE_WIDTH = SIZE;
private static final double SLEEVE_HEIGHT = 0.2*SIZE;
private static final double BODY_WIDTH = 0.6*SIZE;
private static final double BODY_HEIGHT = (0.65)*SIZE;
private static final double BODY_INSET = 0.2*SIZE;
private static final double NECK_WIDTH = 0.3*SIZE;
private static final double NECK_HEIGHT = 0.06*SIZE;
private static final double NECK_INSET = 0.35*SIZE;
// rectangles that form a border around the shirt
private FramedRect sleeveTrim, bodyTrim;
private FramedOval neckTrim;
// rectangles that form the interior color of the shirt
private FilledRect body, sleeves;
private FilledOval neck;
// Current color of the shirt
private Color hue;
// Random number generator used to select next object
private Random generator = new Random();
// create a new T-shirt with its upper left corner at (x,y).
public TShirt(double x, double y, DrawingCanvas canvas) {
// create boundary rectangles
sleeveTrim = new FramedRect(x, y + NECK_HEIGHT/2, SLEEVE_WIDTH,
SLEEVE_HEIGHT, canvas);
bodyTrim = new FramedRect(x + BODY_INSET, y + NECK_HEIGHT/2,
BODY_WIDTH, BODY_HEIGHT, canvas);
// create interior rectangles
sleeves = new FilledRect(x+1, y+NECK_HEIGHT/2+1, SLEEVE_WIDTH-1,
SLEEVE_HEIGHT-1, canvas);
body = new FilledRect(x+BODY_INSET+1, y+NECK_HEIGHT/2+1,
BODY_WIDTH-1, BODY_HEIGHT-1, canvas);
// give it a neck hole
neck = new FilledOval(x + NECK_INSET, y, NECK_WIDTH,
NECK_HEIGHT, canvas);
neckTrim = new FramedOval(x + NECK_INSET, y, NECK_WIDTH,
NECK_HEIGHT, canvas);
// set the interior color
setColor();
}
// move the t-shirt by specified offsets.
public void move(double xOffset, double yOffset) {
body.move(xOffset,yOffset);
neck.move(xOffset,yOffset);
sleeves.move(xOffset,yOffset);
bodyTrim.move(xOffset,yOffset);
sleeveTrim.move(xOffset,yOffset);
neckTrim.move(xOffset,yOffset);
}
// remove the t-shirt from the canvas.
public void removeFromCanvas() {
body.removeFromCanvas();
neck.removeFromCanvas();
sleeves.removeFromCanvas();
bodyTrim.removeFromCanvas();
sleeveTrim.removeFromCanvas();
neckTrim.removeFromCanvas();
}
// move the t-shirt to a new upper-left coordinate position
public void moveTo(double x, double y) {
move(x - sleeves.getX(), y - neck.getY());
}
// returns true if the t-shirt contains the point; false otherwise
public boolean contains(Location pt) {
return body.contains(pt) || sleeves.contains(pt) || neck.contains(pt);
}
// pick a new random color for the shirt
private void setColor() {
hue = new Color(generator.nextInt(256),
generator.nextInt(256),
generator.nextInt(256));
body.setColor(hue);
sleeves.setColor(hue);
neck.setColor(hue);
}
// get the sum of the components of the shirt's color
public int colorValue() {
return hue.getRed() + hue.getBlue() + hue.getGreen();
}
}