Gå til Cave.java og bytt ut TODO i konstruktøren “Cave(caveWidth, caveHeight)” med:
public Cave(int caveWidth, int caveHeight) {
this.caveWidth = caveWidth;
this.caveHeight = caveHeight;
createCave();
connectRooms();
}
Sett kursoren på “caveWidth” i “this.caveWidth” og ta “Quick Fix”, og velg:
Create field 'caveWidth' in type 'Cave'
Gjør det samme for “caveHeight”
La “Quick Fix” lage metodene “createCave” og “connectRooms” og lagre alle filer.
Merk: “Outline”-vinduet til høyre i Eclipse viser metodene etterhvert som du lager dem. Ved å klikke på metodene der kan du navigere rett til metoden. Du kan også endre rekkefølgen på metodene med å dra og slippe dem i Outline-vinduet.
Merk2: På høyre side av Cave.java-vinduet vises blå firkanter for alle linjene som inneholder TODO. Ved å klikke på en blå firkant kan du navigere rett til TODO-linja.
Bytt ut TODO i “createCave” med dette:
private void createCave() {
rooms = new Room[caveWidth][caveHeight];
for (int xPos=0; xPos<caveWidth; ++xPos)
{
for (int yPos=0; yPos<caveHeight; ++yPos)
{
rooms[xPos][yPos] = new Room(xPos, yPos);
}
}
}
Sett kursoren over “Room” i første linje og la “Quick Fix” lage klassen “Room”. Lagre alle filer og bruk Ctrl-F6 til å gå tilbake til Cave.java.
Sett kursoren over “rooms” i første linje og la “Quick Fix” lage feltet rooms, som skal se slik ut når det er ferdig:
private Room[][] rooms;
La “Quick Fix” lage konstruktøren “Room(int, int)”, og endre metoden til dette:
public Room(int xPos, int yPos) {
super();
name = "Room at (" + xPos + "," + yPos + ")";
}
La “Quick Fix” lage feltet “name”, og lagre alle filer.
Ta Ctrl-F6 for å gå tilbake til Cave.java. Bytt så ut innholdet i “connectRooms” med dette:
private void connectRooms() {
for (int xPos=0; xPos<caveWidth; ++xPos)
{
for (int yPos=0; yPos<caveHeight; ++yPos)
{
Room room = rooms[xPos][yPos];
if (xPos>0)
{
Direction direction = Direction.WEST;
Room neighbour = rooms[xPos-1][yPos];
room.setNeighbour(direction, neighbour);
}
if (xPos<caveWidth-1)
{
room.setNeighbour(Direction.NORTH, rooms[xPos+1][yPos]);
}
if (yPos>0)
{
room.setNeighbour(Direction.EAST, rooms[xPos][yPos-1]);
}
if (yPos<caveHeight-1)
{
room.setNeighbour(Direction.SOUTH, rooms[xPos][yPos+1]);
}
}
}
}
Sett kursoren på første feil i “Direction direction”, ta “Quick Fix” og velg:
Create enum 'Direction'
og klikk på “Finish”-knappen (eller bare trykk RET), lagre alle filer.
Ta Ctrl-F6 for å komme tilbake til Cave.java. Ta Ctrl-. for å gå til “WEST” og Ctrl-1 for å velge “Quick Fix” og velg så
Create enum constant 'WEST' in 'Direction'
Lagre alle filer og ta Ctrl-F6 for å komme tilbake til Cave.java og ta “Quick Fix” på “setNeighbour” og velg
Create method 'setNeighbour(Direction, Room)' in type 'Room'
og trykk RET to ganger for å velge default-verdier. Endre metoden til dette:
public void setNeighbour(Direction direction, Room neighbour)
{
neighbours.put(direction, neighbour);
}
Gjør så en “Quick Fix” på “neighbours” og lag et felt. Endre feltet så det blir seende sånn ut (det blir default av type Object):
Map<Direction, Room> neighbours = new EnumMap<Direction, Room>(Direction.class);
Lagre alle filer og sett kursoren på “Map”, ta “Quick Fix”, og velg:
Import 'Map' (java.util)
Ta Ctrl-. og så Ctrl-1 og velg:
Import 'EnumMap' (java.util)
og lagre så alle filer.
Lagre alle filer og ta Ctrl-F6 for å komme tilbake til Cave.java og bruk så Ctrl-. og Ctrl-1 for å lage de resterende enum-konstantene. Lagre alle filer når du er ferdig, og gå til Cave.java.
Gå til “printDescriptions”, og endre TODO sånn at metoden blir seende sånn ut:
void printDescriptions() {
for (int xPos=0; xPos<caveWidth; ++xPos)
{
for (int yPos=0; yPos<caveHeight; ++yPos)
{
System.out.print(rooms[xPos][yPos].describe());
}
}
}
Gjør “Quick Fix” på linja med “describe()” og velg
Create method 'describe()' in type 'Room'
trykk RET en gang for å velge default, og skriv så “strin” (uten anførselstegn), skriv Ctrl-SPC og trykk RET.
Endre innhold i den nylagde metoden sånn at den blir seende sånn ut:
public String describe()
{
if (contents.size()>0)
{
StringBuffer sb = new StringBuffer(name);
sb.append(" contains:n");
for (Actor actor : contents)
{
sb.append(" ");
sb.append(actor.describe());
sb.append("n");
}
return sb.toString();
}
return "";
}
Gjør “Quick Fix” på feilen i “describe” og velg
Create field 'contents'
Trykk F3 for å gå til “contents” og endre feltet fra en Map til et Set:
Set<Actor> contents = new HashSet<Actor>();
“Quick Fix” feilen i Set og velg:
Import 'Set' (java.util)
“Quick Fix” feilen i HashSet og velg:
Import 'HashSet' (java.util)
Lagre alle filer med Ctrl-Shift-s.
Trykk Ctrl-. for å gå til feilen i “describe” og bruk “Quick Fix” og velg
Create method 'describe()' in type 'Actor'
trykk RET en gang for å velge default, og skriv så “strin” (uten anførselstegn), skriv Ctrl-SPC og trykk RET.
Endre “describe()” fra dette:
public String describe() {
// TODO Auto-generated method stub
return null;
}
til dette
public abstract String describe();
Lagre alle filer.
Ta “Quick Fix” på “describe”, og velg:
Make type 'Actor' abstract
Lagre alle filer og bruk Ctrl-F6 til å gå til Cave.java.
Sett kursoren på “name” og gjør “Quick Fix”, og velg:
Create getter and setter for 'name'
I dialogen “Encapsulate Field”, trykk på “OK”-knappen.
Lagre alle filer.
Gå til Cave.java, finn metoden “addActorsToRooms” og endre den til å se sånn ut:
void addActorsToRooms(List<Actor> actors) {
for (Actor actor : actors) {
rooms[randX()][randY()].enter(actor);
}
}
Bruk “Quick Fix” for å lage metoden “randX” og endre den til å se sånn ut:
private int randX() {
return randomGenerator.nextInt(caveWidth);
}
Bruk “Quick Fix” til å lage feltet “randomGenerator”, trykk F3 for å navigere til feltet og endre det fra
private Object randomGenerator;
til
private Random randomGenerator = new Random();
Bruk “Quick Fix” på “Random” og velg
Import 'Random' (java.util)
Gå til feilen med Ctrl-. og bruk “Quick Fix” til å lage metoden “randY”, som så endres til:
private int randY() {
return randomGenerator.nextInt(caveHeight);
}
Sett kursoren i “enter”, bruk “Quick Fix” til å lage metoden i Room, og endre metoden “enter” sånn at den blir seende sånn ut:
public void enter(Actor actor) {
contents.add(actor);
actor.setCurrentLocation(this);
}
Lagre alle filer.
Gjør “Quick Fix” på “setCurrentLocation” og velg:
Create method 'setCurrentLocation(Room)' in type 'Actor'
trykk RET to ganger for å velge default
Endre innholdet i “setCurrentLocation” sånn at den blir seende sånn ut:
public void setCurrentLocation(Room room) {
currentLocation = room;
}
Bruk “Quick Fix” til å lage feltet “currentLocation”.