Я много борюсь с этим, поэтому, пожалуйста, go легко для меня, поскольку я все еще новичок во всем этом.
У меня есть класс Player, и одним из параметров, который он принимает, является Location. Однако теперь я столкнулся с проблемой, которую я не знаю, как решить. Я создал несколько дочерних классов Location, таких как HotelRoom и HotelKitchen, и мне нужно иметь возможность доступа к методам дочерних классов из созданного объекта Player.
Теперь я не могу просто изменить конструктор Игрока, чтобы он принимал HotelRoom, поскольку расположение персонажей может измениться на HotelKitchen.
Класс игрока:
public class Player {
private int health;
private int cluesLeft; //1 clue per level
private String name;
private Location currentRoom;
public Player(String name, int health, int cluesLeft, Location currentRoom) {
this.setHealth(health);
this.setCluesLeft(cluesLeft);
this.setName(name);
this.setCurrentRoom(currentRoom);
}
/**
* @return the health
*/
public int getHealth() {
return health;
}
/**
* @param health the health to set
*/
public void setHealth(int health) {
this.health = health;
}
/**
* @return the cluesLeft
*/
public int getCluesLeft() {
return cluesLeft;
}
/**
* @param cluesLeft the cluesLeft to set
*/
public void setCluesLeft(int cluesLeft) {
this.cluesLeft = cluesLeft;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the currentRoom
*/
public Location getCurrentRoom() {
return currentRoom;
}
/**
* @param currentRoom the currentRoom to set
*/
public void setCurrentRoom(Location currentRoom) {
this.currentRoom = currentRoom;
}
}
Класс местоположения
import java.util.Scanner;
/**
*
* @author User
*/
public class Location {
static Scanner scan = new Scanner(System.in);
private String locationImage; // string holds the ASCII map
private String locationName;
private String[] itemImages;
public Location(String locationName, String locationImage, String[] itemImages) {
this.setLocationName(locationName);
this.setLocationImage(locationImage);
this.setItemImages(itemImages);
}
/**
* @return the locationImage
*/
public String getLocationImage() {
return locationImage;
}
/**
* @param locationImage the locationImage to set
*/
public void setLocationImage(String locationImage) {
this.locationImage = locationImage;
}
/**
* @return the locationName
*/
public String getLocationName() {
return locationName;
}
/**
* @param locationName the locationName to set
*/
public void setLocationName(String locationName) {
this.locationName = locationName;
}
public void printLocationMap() {
try {
Thread.sleep(1500);
} catch (Exception e) {
System.out.print(e);
}
System.out.println(this.getLocationImage());
}
public String retrieveSpecificItem(int item){
String[] array = this.getItemImages();
for (int x = 0; x < array.length; x++) {
if (item == (x + 1)) {
return array[x];
}
else {
return null;
}
}
return null;
}
/**
* @return the itemImages
*/
public String[] getItemImages() {
return itemImages;
}
/**
* @param itemImages the itemImages to set
*/
public void setItemImages(String[] itemImages) {
this.itemImages = itemImages;
}
Одно из дочерних классов местоположений
import java.util.Scanner;
/**
*
* @author User
*/
public class HotelRoom extends Location {
Scanner scan = new Scanner(System.in);
public HotelRoom(String locationName, String locationImage, String[] itemImages) {
super(locationName, locationImage, itemImages);
}
public static String instructions(Player gameCharacter) {
boolean loopDone = false;
String choice = "";
do {
String menu = "What would you like to do next?\n"+
"1.) Move to Kitchen\n"+
"2.) Inspect PC\n"+
"3.) Inspect Cupboard\n"+
"4.) Inspect bed\n"
+ "5.) Guess who did it!";
int userChoice = JavaApplication2.checkInput(menu);
switch(userChoice) {
case 1:
choice = "HotelKitchen";
loopDone = true;
break;
case 2:
System.out.println(this.retrieveSpecificItem(0));
break;
case 3:
System.out.println(this.retrieveSpecificItem(1));
break;
case 4:
System.out.println(this.retrieveSpecificItem(2));
break;
case 5:
choice = "Choose";
break;
}
}while (loopDone == false);
return choice;
}
}
Ниже приведен метод в моем классе ApplicationTester (который имеет основной), который создает объект местоположения, который затем устанавливается как параметр
public static Location setLocations(int whichRoom) {
Location locations = null;
String room = ("|----------| [1] |----------|\n"+
"| [CUPBOARD] [PC] |\n"+
"| P |\n"+
"| |\n"+
"| [BED] |\n"+
"| | | |\n"+
"| | X | |\n"+
"| |___| |\n"+
"|-------------------------------|\n");
String kitchen = ("|----------| [1] |----------|\n"+
"| [FRIDGE] [OVEN] |\n"+
"| P |\n"+
"| |\n"+
"| [SERVING TABLE] |\n"+
"| |\n"+
"| [TABLES] |\n"+
"| |\n"+
"|-------------------------------|\n");
if (whichRoom == 1) {
Location hotelRoom = new Location("Hotel Room", room, allItems(1));
locations = hotelRoom;
}
else {
Location hotelKitchen = new Location("Hotel Kitchen", kitchen, allItems(2));
locations = hotelKitchen;
}
return locations;
}
Метод allitems (число), который используется вышеописанным методом
public static String[] allItems(int area) {
String pc = "\n" +
" ____________________________________________________\n" +
" / \\\n" +
" | _____________________________________________ |\n" +
" | | ___________________ | |\n" +
" | | | | | |\n" +
" | | DuckDuckGo - |How to remove stain| | |\n" +
" | | |___________________| | |\n" +
" | | | |\n" +
" | | | |\n" +
" | | | |\n" +
" | | Removing stains from any surface | |\n" +
" | | | |\n" +
" | | Getting rid of stains in 3 steps | |\n" +
" | | | |\n" +
" | | Choosing the right stain remover | |\n" +
" | | | |\n" +
" | |_____________________________________________| |\n" +
" | |\n" +
" \\\\_____________________________________________________/\n" +
" \\\\_______________________________________/\n" +
" _______________________________________________\n" +
" _-' .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. --- `-_\n" +
" _-'.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.--. .-.-.`-_\n" +
" _-'.-.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-`__`. .-.-.-.`-_\n" +
" _-'.-.-.-.-. .-----.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-----. .-.-.-.-.`-_\n" +
" _-'.-.-.-.-.-. .---.-. .-----------------------------. .-.---. .---.-.-.-.`-_\n" +
":-----------------------------------------------------------------------------\n" +
"`---._.-----------------------------------------------------------------._.---";
String cupboard = " __________\n" +
" / /|\n" +
" /__________/ |\n" +
" |________ | |\n" +
" /_____ /|| |\n" +
"|\".___.\"| || |\n" +
"|_______|/ | |\n" +
" || .___.\"|| /\n" +
" ||_______|| /\n" +
" |_________|/\n";
String bed = " __.--'|\n" +
" ___.---' |\n" +
" ___.---' |\n" +
" _.--' \\\\\\ |\n" +
" | XX | |\n" +
" | U. ' |\n" +
" J __=__ |\n" +
" L / |\n" +
" L / /|. .| -`-.\n" +
" | | ||____| __.>-._\n" +
" | | || |__.--' `--._\n" +
" J-._ _____.---------' `--.__\n" +
" J `-<_ `-.__\n" +
" L `-. _>-.\n" +
" +. `-._ ___.--' |\n" +
" | `-._ `-._ __.--' |\n" +
" `-._ `-. __.--' _.--'\n" +
" `-._ `-._.-' _.--' |\n" +
" `-. | _.--'\n" +
" `-. | _.--'\n" +
" `-. | _.--'\n" +
" `|'\n" +
" |";
String sink = " ___\n" +
" .' _ '.\n" +
" / /` `\\ \\\n" +
" | | [__]\n" +
" | | {{\n" +
" | | }}\n" +
" _ | | _ {{\n" +
" ___________<_>_| |_<_>}}________\n" +
" .=======^=(___)=^={{====.\n" +
" / .----------------}}---. \\\n" +
" / / {{ \\ \\\n" +
" / / }} \\ \\\n" +
" ( '=========================' )\n" +
" '-----------------------------'";
String couch = ".----.\n" +
" | |\n" +
" |____|\n" +
" _.-------------._()_.-------------._\n" +
" / | | )( | | \\\n" +
" | | | () | | |\n" +
" _\\|_____________| )( |_____________|/_\n" +
".=. / /(__)\\ \\ .=.\n" +
"|U|/_____________/______\\_____________\\|U|\n" +
"| |====================================| |\n" +
"| | | |\n" +
"|_|LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLlc|_|";
String bin = " _.,-----/=\\-----,._\n" +
" (__ ~~~\"\"\"\"\"\"\"~~~ __)\n" +
" | ~~~\"\"\"\"\"\"\"\"\"~~~ |\n" +
" | | ; , , ; | |\n" +
" | | | | | | | |\n" +
" | | | | | | | |\n" +
" | | | | | | | |\n" +
" | | | | | | | |\n" +
" | | | | | | | |\n" +
" | | | | | | | |\n" +
" | | | | | | | |\n" +
" |. \\_| | | |_/ .|\n" +
" `-,.__ ~~~ __.,-'\n" +
" ~~~~~";
String[] hotelRoom = {pc, cupboard, bed};
String[] hotelKitchen = {bin, couch, sink};
if (area == 1) {
return hotelRoom;
} else if (area == 2) {
return hotelKitchen;
} else if (area == 3) {
return null; //not set up yet
} else if (area == 4){
return null; //not set up yet
} else {
return null; //not set up yet
}
}
Теперь я вижу, что некоторые люди предлагают интерфейсы / абстрактные классы, и я благодарю вас за ввод, но все еще запутался по двум причинам ,
Во-первых, метод в main, называемый setLocation, может возвращать только местоположение, теперь после определения местоположения Аннотация позволит ли мне вернуть любой класс, являющийся дочерним по отношению к местоположению?
И наконец, аналогично Ситуация, как указано выше. Если расположение сделано Абстрактным, примет ли конструктор Player какой-либо дочерний класс расположения?