Instructions
Requirements and Specifications
Source Code
COLOR
/**
* Property groups, represented by colors
*/
public enum Color {
RED,
ORANGE,
YELLOW,
GREEN,
BLUE,
PURPLE,
BLACK,
WHITE,
}
DECK
import java.util.ArrayList;
public class Deck {
/**
* Collection, containing all TitleDeeds, which are not bought year
*/
private final ArrayList<TitleDeed> titleDeeds;
/**
* No-args constructor - creates deck with full set of properties
*/
public Deck() {
titleDeeds = new ArrayList<>();
// iterating over all colors and creating whole color groups one by one
for (int j = 0; j<Color.values().length; j++) {
Color color = Color.values()[j];
Side side = null;
switch (j / 2) {
case 0:
side = Side.NORTH;
break;
case 1:
side = Side.EAST;
break;
case 2:
side = Side.SOUTH;
break;
case 3:
side = Side.WEST;
break;
default:
throw new IllegalStateException();
}
String colorStr = color.name();
for (int i = 0; i<3; i++) {
// calculating reasonable locations
int loc = (j % 2) * 5 + i * 2;
// making simple property names out of color name and number
titleDeeds.add(new TitleDeed(colorStr + " house #" + (i+1), color, side, loc));
}
}
}
/**
* Method for buying property from the deck.
* If found, removes property from deck and returns it
* @param name of property to buy
* @return bought property or null, if property with such name does not exist in deck
*/
public TitleDeed buyProperty(String name) {
TitleDeed target = searchForProperty(name);
if (target == null) {
return null;
}
titleDeeds.remove(target);
return target;
}
/**
* Method for getting string details of property from the deck.
* @param name of property to get details
* @return details of property or null, if property with such name does not exist in deck
*/
public String viewProperty(String name) {
TitleDeed target = searchForProperty(name);
if (target == null) {
return null;
}
return target.display();
}
/**
* Method for getting property object from the deck by name.
* @param name of property to search for
* @return property with given name or null, if it does not exist
*/
public TitleDeed searchForProperty(String name) {
return titleDeeds.stream().filter(td -> td.getName().equals(name)).findAny().orElse(null);
}
/**
* Method for getting property object from the deck by its location.
* @param side of property to search for
* @param loc location of property to search for
* @return property with given position or null, if it does not exist
*/
public TitleDeed searchForProperty(Side side, int loc) {
return titleDeeds.stream().filter(td -> td.getSide() == side && td.getLocation() == loc).findAny().orElse(null);
}
/**
* Method for getting current deck size
* @return deck size
*/
public int remainingProperties() {
return titleDeeds.size();
}
/**
* Method for getting deck string representation, obtained from simple string representation
* for each card in deck
* @return compact string representation
*/
public String printDeck() {
StringBuilder builder = new StringBuilder();
for (TitleDeed td : titleDeeds) {
builder.append(td.simpleDisplay()).append(System.lineSeparator());
}
return builder.toString();
}
/**
* Method for getting deck string representation, obtained from full string representation
* for each card in deck
* @return full string representation
*/
public String printAllCards() {
StringBuilder builder = new StringBuilder();
for (TitleDeed td : titleDeeds) {
builder.append(td.display()).append(System.lineSeparator()).append(System.lineSeparator());
}
return builder.toString();
}
}
DEMO
public class Demo {
/**
* Method for showing console representation of game board
* @param deck to show board for
*/
private static void printBoard(Deck deck) {
// iterating over all sides, showing properties for each side
for (Side side : Side.values()) {
System.out.println("Side: " + side.name());
// iterating over all valid locations, showing property on each location, if exists
for (int i = 0; i < 10; i++) {
TitleDeed td = deck.searchForProperty(side, i);
System.out.print(i + ": ");
if (td == null) {
System.out.println();
} else {
System.out.println(td.simpleDisplay());
}
}
}
}
public static void main(String[] args) {
// checking printing methods
Deck deck = new Deck();
System.out.println(deck.printDeck());
System.out.println();
System.out.println(deck.printAllCards());
System.out.println();
printBoard(deck);
// covering all methods in Deck class
int size = deck.remainingProperties();
System.out.println("Deck size: " + size);
if (size == 24) {
System.out.println("Size of deck is correct. CORRECT");
} else {
System.out.println("Deck size is incorrect. FAIL!!!");
return;
}
System.out.println("Searching for Property with name \"foo\"");
TitleDeed foo = deck.searchForProperty("foo");
if (foo != null) {
System.out.println("Foo was found. FAIL!!!");
return;
} else {
System.out.println("Foo was not found. CORRECT");
}
System.out.println("Searching for Property with name \"RED house #2\"");
TitleDeed redHouse2 = deck.searchForProperty("RED house #2");
if (redHouse2 != null) {
System.out.println("Found. CORRECT");
} else {
System.out.println("Existing property was not. FAIL!!!");
return;
}
System.out.println("Getting info for this property:");
System.out.println(deck.viewProperty(redHouse2.getName()));
System.out.println("Trying to by this property:");
TitleDeed redHouse2Bought = deck.buyProperty(redHouse2.getName());
if (redHouse2 != redHouse2Bought) {
System.out.println("Incorect return value of bought method. FAIL!!!");
return;
} else {
System.out.println("Correct value returned by buy method. CORRECT");
}
int newSize = deck.remainingProperties();
System.out.println("Deck size: " + newSize);
if (size == newSize + 1) {
System.out.println("Size of deck is correct. CORRECT");
} else {
System.out.println("Deck size is incorrect. FAIL!!!");
return;
}
}
}
SIDE
/**
* Four sides of Monopoly board
*/
public enum Side {
NORTH,
SOUTH,
EAST,
WEST;
}
TITLE DEED
public class TitleDeed {
/**
* Property name
*/
private final String name;
/**
* Color of property
*/
private final Color groupColor;
/**
* Monopoly board side of property
*/
private final Side side;
/**
* Location of the property on the side: integer from 0 to 9
*/
private final int location;
/**
* Cost of property
*/
private final double purchaseCost;
/**
* Rent for property without any upgrades (houses/hotel)
*/
private final double baseRent;
/**
* Array, representing rent amount for given number of houses:
* housesRent[0] - rent with 1 house
* housesRent[1] - rent with 2 houses
* etc
*/
private final double[] housesRent;
/**
* Rent amount of property with hotel
*/
private final double hotelRent;
/**
* Constructor, creating Property with default prices
* @param name property name
* @param groupColor property color
* @param side property position side
* @param location property position on the side
*/
public TitleDeed(String name, Color groupColor, Side side, int location) {
this(name, groupColor, side, location, 100.0, 10.0, new double[]{50, 100, 150, 200}, 400);
}
/**
* All args constructor for Property
* @param name property name
* @param groupColor property color
* @param side propertt position side
* @param location property position on the side
* @param purchaseCost property price
* @param baseRent property rent without upgrades
* @param housesRent array, represetning rent amount for number of houses
* @param hotelRent rent amount with hotel
*/
public TitleDeed(String name, Color groupColor, Side side, int location, double purchaseCost, double baseRent, double[] housesRent, double hotelRent) {
this.name = name;
this.groupColor = groupColor;
this.side = side;
this.location = location;
this.purchaseCost = purchaseCost;
this.baseRent = baseRent;
this.housesRent = housesRent;
this.hotelRent = hotelRent;
}
/**
* Getter for name field
* @return property name
*/
public String getName() {
return name;
}
/**
* Getter for purchaseCost field
* @return property price
*/
public double getPurchaseCost() {
return purchaseCost;
}
/**
* Getter for side field
* @return propert position side
*/
public Side getSide() {
return side;
}
/**
* Getter for location field
* @return property position on the side
*/
public int getLocation() {
return location;
}
/**
* Method for getting full string representation of the property
* @return full string representation of the property
*/
public String display() {
StringBuilder builder = new StringBuilder("\"" + name + "\"");
builder.append(System.lineSeparator());
builder.append("Side: ").append(side).append(" Location: ").append(location).append(System.lineSeparator());
builder.append("Price $: ").append(purchaseCost).append(System.lineSeparator());
builder.append("Rent $: ").append(baseRent).append(System.lineSeparator());
for (int i = 0; i<4; i++) {
builder.append("With " + (i+1) + " house(s): $" + housesRent[i]).append(System.lineSeparator());
}
builder.append("With hotel: $" + hotelRent);
return builder.toString();
}
/**
* Method for getting short string representation of the property
* @return short string representation of the property
*/
public String simpleDisplay() {
return "\"" + name + "\" Price: $" + purchaseCost;
}
/**
* Method for calculate current rent of property
* @param houses number of houses
* @param hasHotel if property has hotel or not
* @return rent amount
*/
public double getRent(int houses, boolean hasHotel) {
if (hasHotel) {
return hotelRent;
}
if (houses == 0) {
return baseRent;
}
return housesRent[houses-1];
}
}