简体   繁体   中英

How to use variable from another class?

I am creating a maze game. For that I have created 4 separate class files. I'd like to know how I can access the inmates of Maze.class in Player.class move() method and not just read it but also add to it and overwrite it:

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();
}

}

and 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;
}

}

You need to create modifier methods, eg

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

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

public void removeInmate( Room r ){
}

etc

The player needs to have a reference in some way to the Maze object in order to call the getInmates() method (or any other modifier method) on it.

How you get the reference is up to you, and there are many ways to do it. One way would be to have the Player's location (Room object) provide the reference. To do that, you could implement a getMaze() method in the Room object that would return that Room's Maze. In the move() method of Player, you could call getMaze() on the Player's 'location' property (which is a Room), and then call getInmates() on the returned Maze object.

After that, it's just how you want to implement the modifier/reset methods on the Maze object.

只需从inmates字段中删除private使其对同一包中的其他类可读,但是创建一个getter方法(可能也可见包)将是一个很好的设计。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM