私は迷路ゲームを作成しています。そのために私は4つの別々のクラスファイルを作成しました。私は()メソッドだけでなく、それを読むだけでなく、それに追加して、それを上書きしPlayer.class移動に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;
}
}
ありがとうございます!それは私が探していた解決策です!それが私の目の前にあったとは信じられない。私はルームクラスにもう対処する必要はないと考えていました。しかし、エスケープがないようです:D –
私はそれを考えて、私にとって最良の方法は、プレーヤーに「mazeloc」などと呼ばれる別の場所プロパティを割り当てることであると認識しました。 addPlayer()メソッドを使用すると初期化されます。このプロパティは、プレイヤーが現在どの迷路にいるかを示します。 –
@ Rauno、それはうまく動作しますが、 "適切な"デザインという点では最良の方法ではないかもしれません。問題は、あなたがそれを行うことで、より多くの「簿記」を導入しているということです。プレイヤーが動くたびに、「場所」に加えて「mazeloc」を更新する必要があります。 – JKomusin