如何使用另一个类的变量?

时间:2012-03-01 22:19:58

标签: java

我正在创造一个迷宫游戏。为此,我创建了4个单独的类文件。我想知道如何在Player.class move()方法中访问Maze.class的囚犯,而不仅仅是读取它,还要添加它并覆盖它:

Maze.class

package y1;

import java.util.*;

@SuppressWarnings(value = "all")

public class Maze {
private Room entry;
private Map <Room, ArrayList<Player>> inmates=new HashMap<Room,ArrayList<Player>>();
/**
 * 
 * @param r The room that is going to be the entry
 */
public void setEntry(Room r){
    this.entry=r;
    }
/**
 * 
 * @return Returns the entry room
 */
    public Room getEntry(){
        return this.entry;
    }
    /**
     * Method adds a player to the maze
    * @param p Player to be added to the maze
    */
    public void addPlayer(Player p){
        ArrayList<Player> players=new ArrayList<Player>();
        p.setRoom(getEntry());
        if (this.inmates.isEmpty()==true){
        players.add(p);
        this.inmates.put(this.entry,players);
        }
        else{
        players=this.inmates.get(this.entry);
        players.add(p);
        }

        this.inmates.put(p.getRoom(), players);

    }
    public void getPlayers(Room r){
        if(this.inmates.get(r)!=null){
        System.out.println(Arrays.asList(this.inmates.get(r)));
        }
        else{
        System.out.println("Ruum on tühi");

        }
    }
    public Map getInmates(){
        return this.inmates;
    }
}

Room.class

package y1;

import java.util.*;

@SuppressWarnings(value = "all")
public class Room {

private String name;
private Room north;
private Room east;
private Room west;
private Room south;
private boolean isExit = false;
private boolean isPortal = false;
private Maze maze;

/**
 * @return Returns the name of the room
 */
public String getName() {
    return this.name;
}

/**
 * Sets room name
 * 
 * @param name
 */
public void setName(String name) {
    this.name = name;
}

/**
 * Gets northern room if any
 * 
 * @return pointer to northern room if any, otherwise <code>null</code>
 */
public Room getNorth() {
    return this.north;
}

/**
 * Sets the door to the next room to the north in that room and in the other
 * room sets southern door as connecting back to that room
 * 
 * @param otherRoom
 */
public void setNorth(Room otherRoom) {
    this.north = otherRoom;
    otherRoom.south = this;
}
public Room getSouth() {
    return this.south;
}

/**
 * Sets the door to the next room to the south in that room and in the other
 * room sets northern door as connecting back to that room
 * 
 * @param otherRoom
 */
public void setSouth(Room otherRoom) {
    this.south = otherRoom;
    otherRoom.north = this;
}
public Room getEast() {
    return this.east;
}

/**
 * Sets the door to the next room to the east in that room and in the other
 * room sets western door as connecting back to that room
 * 
 * @param otherRoom
 */
public void setEast(Room otherRoom) {
    this.east = otherRoom;
    otherRoom.west = this;
}
public Room getWest() {
    return this.west;
}

/**
 * Sets the door to the next room to the west in that room and in the other
 * room sets eastern door as connecting back to that room
 * 
 * @param otherRoom
 */
public void setWest(Room otherRoom) {
    this.west = otherRoom;
    otherRoom.east = this;
}
/**
 * Returns the room in the given direction
 * 
 * @param Which way to move?
 * @return The room in that direction.
 */
public Room get(String direction){
    Room dir=this;
    if(direction=="N" && this.north!=null){
        dir=dir.getNorth();
        return dir;
    }
    else if(direction=="W" && this.west!=null){
        dir=dir.getWest();
        return dir;
    }
    else if(direction=="E" && this.east!=null){
        dir=dir.getEast();
        return dir;
    }
    else if(direction=="S" && this.south!=null){
        dir=dir.getSouth();
        return dir;
    }
    else{
        return dir;
    }


}
/**
 * Returns the room that givens coordinates point to
 * 
 * @param dirlist List of directions
 * @return returns Returns the room it stops in
 */
public Room get(List<String> dirlist){
    Room dir=this;
    if (validate(dirlist)==true){
        for(int i=0;i<dirlist.size();i++){
            if(dirlist.get(i)=="N"){
                dir=dir.getNorth();
            }
            else if(dirlist.get(i)=="W"){
                dir=dir.getWest();
            }
            else if(dirlist.get(i)=="E"){
                dir=dir.getEast();
            }
            else if(dirlist.get(i)=="S"){
                dir=dir.getSouth();
            }
        }
    }
    return dir;     
}


/**
 * creates a new room to the north and connects back to this room
 * 
 * @param toa nimi
 *            0
 * @return uus tuba
 */
public Room createNorth(String name) {
    Room otherRoom = null;

    // Creates new room only when no room lies ahead in this direction
    if (this.getNorth() == null) { // Checks north - if nothing there then new room is create
        otherRoom = new Room(); // Creates new room
        this.setNorth(otherRoom); // Creates door between rooms
        otherRoom.setName(name); // Names the room

    } else { // If room already exists then prints alert message
        System.out.println("Room already exist!");
    }

    return otherRoom;
}
public Room createSouth(String name) {
    Room otherRoom = null;
    if (this.getSouth() == null) {
        otherRoom = new Room();
        this.setSouth(otherRoom); 
        otherRoom.setName(name);

    } else {
        System.out.println("Room already exists!");
    }

    return otherRoom;
}
public Room createEast(String name) {
    Room otherRoom = null;
    if (this.getEast() == null) {
        otherRoom = new Room();
        this.setEast(otherRoom);
        otherRoom.setName(name);

    } else {
        System.out.println("Room already exists!");
    }

    return otherRoom;
}
public Room createWest(String name) {
    Room otherRoom = null;
    if (this.getWest() == null) {
        otherRoom = new Room();
        this.setWest(otherRoom);
        otherRoom.setName(name);

    } else {
        System.out.println("Room already exists!");
    }

    return otherRoom;
}
public void setExit(){
    this.isExit=true;
}

public void setPortalA(){
    this.isPortal=true;
}
public boolean validate(List<String> pathList){
    Room check = this;
    boolean value=false;
    for(int i = 0;i<pathList.size();i++){
        if(pathList.get(i)=="N" && check.north!=null){
            check=check.north;
            value=true;
        }
        else if(pathList.get(i)=="S" && check.south!=null){
            check=check.south;
            value=true;
        }
        else if(pathList.get(i)=="W" && check.west!=null){
            check=check.west;
            value=true;
        }
        else if(pathList.get(i)=="E" && check.east!=null){
            check=check.east;
            value=true;
        }
        else{ 
            value = false;
            System.out.println("Can't move in the given directions!");
        }
    }
    return value;       
}

@Override
public String toString() {
    return this.getName();
}

}

和Player.class

package y1;

import java.util.*;

public class Player {
private String name;
private Room location;

public void setRoom(Room r){
    this.location=r;
}
public Room getRoom(){
    System.out.println(this.name+" is at " +this.location);
    return this.location;

}


public Room move(String dir){
    Player p=this;
    if(dir=="N" && this.location.getNorth()!=null){
        p.location=p.location.getNorth();
    }
    else if(dir=="S" && this.location.getSouth()!=null){
        p.location=p.location.getSouth();
    }
    else if(dir=="W" && this.location.getWest()!=null){
        p.location=p.location.getWest();
    }
    else if(dir=="E" && this.location.getEast()!=null){
        p.location=p.location.getEast();
    }
    else{
        System.out.println("There's a wall in the way!");
    }
    return this.location;   
}
public Room move(List<String> dirList){
    Player player=this;
        for(int i=0 ; i<dirList.size() ; i++){
            if(dirList.get(i)=="N" && player.location.getNorth()!=null){
                player.location=player.location.getNorth();
            }
            else if(dirList.get(i)=="S" && player.location.getSouth()!=null){
                player.location=player.location.getSouth();
            }
            else if(dirList.get(i)=="W" && player.location.getWest()!=null){
                player.location=player.location.getWest();
            }
            else if(dirList.get(i)=="E" && player.location.getEast()!=null){
                player.location=player.location.getEast();
            }   
            else{
                System.out.println("Wall in the way. Stopping!");
                break;
            }
        }
    return this.location;   
}

public void setName(String n){
    this.name=n;
}


@Override
public String toString() {
    return this.name;
}

}

3 个答案:

答案 0 :(得分:3)

您需要创建修饰符方法,例如

public void resetInmates(){
    this.inmates = new Map();
}

public void addInmate( Room r, ArrayList<Player> players ){
}

public void removeInmate( Room r ){
}

答案 1 :(得分:2)

玩家需要以某种方式引用Maze对象,以便在其上调用getInmates()方法(或任何其他修改方法)。

您如何获得参考资料取决于您,并且有很多方法可以做到这一点。一种方法是让玩家的位置(房间对象)提供参考。为此,您可以在Room对象中实现一个getMaze()方法,该方法将返回Room的Maze。在Player的move()方法中,您可以在Player的'location'属性(即Room)上调用getMaze(),然后在返回的Maze对象上调用getInmates()。

之后,就是你想如何在Maze对象上实现修饰符/重置方法。

答案 2 :(得分:0)

简单地从囚犯字段中移除private使其对同一个包中的其他类具有可读性,但对于creata getter方法(可能也包可见)来说,这将是一个很好的设计。