//The design among these 3 classes needs improvement, and the code has a couple of bugs, too. //Improve the design and fix the bugs. //The public interface of Player should remain the same as it is now. //Hints: //Avoid duplicate data //Methods and instance data should have high cohesion //Coupling should be loose between classes import java.util.*; public class Player { private String name; private CoinInventory coinInventory; private ArrayList otherInventory; private int encumbrance; public Player(String name) { this.name = name; coinInventory = new CoinInventory(); otherInventory = new ArrayList(); encumbrance = 0; } public void addItem(Item item) { otherInventory.add(item); } public void collectMoney(int cp, int sp, int ep, int gp, int pp) { int[] moneys = coinInventory.getCoins(); moneys[0] += cp; moneys[1] += sp; moneys[2] += ep; moneys[3] += gp; moneys[4] += pp; coinInventory.setCoins(moneys); } public double getRunningSpeed() { double speed = 5 * (1 - getEncumbrance() / 1000.0); //Speed 5 if unencumbered; speed 0 if 1000 units carried or more. if (speed < 0) { return 0; } else { return speed; } } public double getMoneyValue() { int[] moneys = coinInventory.getCoins(); return .01 * moneys[0] + .1 * moneys[1] + .5 * moneys[2] + 1 * moneys[3] + 5 * moneys[4]; } public int getEncumbrance() { int[] moneys = coinInventory.getCoins(); return moneys[0] + moneys[1] + moneys[2] + moneys[3] + moneys[4] + encumbrance; } //Test method. public static void main(String[] args) { Player p = new Player("Whistlestick"); Item sword = new Item("Magic sword +2", 20); Item shield = new Item("Normal shield", 40); p.addItem(sword); p.addItem(shield); if (p.getEncumbrance() != 60) throw new RuntimeException("getEncumbrance() should be 60, not " + p.getEncumbrance()); p.collectMoney(10,2,0,40,2); if (p.getEncumbrance() != 60+54) throw new RuntimeException("getEncumbrance() should be 114, not " + p.getEncumbrance()); if (p.getMoneyValue() != 50.3) throw new RuntimeException("getMoneyValue() should be 50.3, not " + p.getMoneyValue()); p.collectMoney(0,0,0,6,0); if (p.getEncumbrance() != 120) throw new RuntimeException("getEncumbrance() should be 120, not " + p.getEncumbrance()); if (p.getRunningSpeed() != 4.4) throw new RuntimeException("getRunningSpeed() should be 4.4, not " + p.getRunningSpeed()); System.out.println("All tests passed."); } }