我决定创建一个帐户,以便提出一个我似乎无法弄清楚自己的问题,或者通过谷歌搜索,希望我不仅仅是忽略了它。

本质上,我试图用Java制作文本冒险游戏,并且在查看如何将对象概念中的所有内容联系起来时遇到了一些麻烦。 我已经成功地使用XML stax并将文件发送到程序,并使用了属性(不包括属性),使它可以在其中用户输入与选项相关联的整数,并查看选项是否需要“ item”或给出它们一个物品。 但是,我没有对此表示反对。

我希望我的新程序能够使用户输入一串用户输入而不是一个整数,并对照数组列表(如果存在)对其进行检查。 这更接近于大多数人所熟悉的经典MUD。

我想以模块化的方式设计它,这样我就可以慢慢添加想法,并增加更多的复杂性,所以我也不希望“它能很好地工作,所以不要管它”。

目前,我只是想要一些接近此的东西:

一个Room对象,该对象具有:ID,Description和可交互的Choice对象(这一点我不确定),我考虑过要制作一个对象来容纳每个房间的可能选择,包括出口和交互对象。

如果这样,房间对象可能需要一个选择对象。

我经过深思熟虑,尝试了一些代码,然后再三思,每一次,我都会以比自己想像的更多的时间结束硬编码,并制造比我认为必要的更多的变量,这让我感到自己在我的思维中缺少一些至关重要的东西。

我还希望这些房间是通过输入的文件创建的,而不是代码中生成的(因此,代码本质上是任何类型的故事阅读器/手工艺者,而不是一个)

我也尝试了太久了,我的解决方案也变得越来越差,但是下面是我最近一次尝试粗略想法的尝试:

一个GameManager类,该类接受userInput并对其进行一些检查,然后再传递。 我尚未传递任何数据,因为我不确定该方法。 我也不习惯使用正则表达式,所以其中有些可能是错误的,如果是的话,也许要指出来,但这不是我的重点

import java.util.Scanner;

public class GameManager {

private static final String EXIT_PHRASE = "exit";
public static void main(String[] args) {

    Scanner userInput = new Scanner(System.in);
        String userStringVal = "";
        while(!userStringVal.equals(EXIT_PHRASE)){
            userStringVal= userInput.nextLine();
            if(checkKeywords(userStringVal)){
                System.out.println("matches keyword");
            }
            else System.out.println("didnt match a keyword");
        }
    userInput.close();
}

public static boolean checkKeywords(String string){
    boolean isKeyword = false;
    string.toLowerCase();
    if(string.matches("travel.*") || string.matches("search.*")){
        System.out.println("passed first check");
        String substring = string.substring(6);
        if(matchDirection(substring)){
        isKeyword = true;   
        }
    }

    return isKeyword;
}

public static boolean matchDirection(String string){
    boolean hasDirection = false;
if(string.matches(".*\\bnorth|south|east|west|northeast|northwest|southeast|       southwest|up|down")){
        hasDirection = true;
}
    return hasDirection;
}
}

我这样考虑的Room对象:

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

public class Room {

private String roomDescription = "";
private int roomID=0;
private int northExit=0;
private int southExit=0;
private int eastExit=0;
private int westExit=0;
private int northeastExit=0;
private int northwestExit=0;
private int southeastExit=0;
private int southwestExit=0;
private int upExit=0;
private int downExit=0;
private String[] interactables = new String[10];
private Options options = new Options();

public Room(XMLStreamReader reader) throws XMLStreamException{
    setAttValues(reader);
    setRoomDescription(reader);
    setUpOptions();
}

public void setinteractables(XMLStreamReader reader){
    int count = reader.getAttributeCount();

    for(int i = 0; i < count; i++){
        interactables[i] = reader.getAttributeValue(i);
    }
}

public void setAttValues(XMLStreamReader reader){
    int count = reader.getAttributeCount();
    for(int i = 0; i < count; i++){
        String att = reader.getAttributeLocalName(i);
        if(att !=""){
        switch(att){
        case "North": northExit=Integer.parseInt(att);

        case "South": southExit=Integer.parseInt(att);

        case "East": eastExit=Integer.parseInt(att);

        case "West": westExit=Integer.parseInt(att);

        case "NorthEast": northeastExit=Integer.parseInt(att);

        case "NorthWest": northwestExit=Integer.parseInt(att);

        case "SouthEast": southeastExit=Integer.parseInt(att);

        case "SouthWest": southwestExit=Integer.parseInt(att);

        case "Up": upExit=Integer.parseInt(att);

        case "Down": downExit=Integer.parseInt(att);

        case "ID": roomID=Integer.parseInt(att);
        }
        }
    }
}

public void setRoomDescription(XMLStreamReader reader) throws XMLStreamException{
    roomDescription = reader.getElementText();
}

public void setUpOptions(){
options.setCardinalPointers(northExit, southExit, eastExit, westExit);
options.setIntercardinalPointers(northeastExit, northwestExit, southeastExit, southwestExit);
options.setElevationPointers(upExit, downExit);
}
}

我该怎么做以确保我不必陈述那么多带有多个变量的方向?

这是我考虑过的关于Option类的快速粗略的想法,但是我还没有确定我已经朝错误的方向走了

public class Options {

private int northPointer = 0;
private int southPointer= 0;
private int eastPointer = 0;
private int westPointer = 0;
private int northeastPointer= 0;
private int northwestPointer = 0;
private int southeastPointer = 0;
private int southwestPointer = 0;
private int upPointer = 0;
private int downPointer = 0;
private String northInteractable = "";
private String southInteractable = "";
private String eastInteractable = "";
private String westInteractable = "";
private String northeastInteractable ="";
private String northwestInteractable = "";
private String southeastInteractable = "";
private String southwestInteractable = "";
private String upInteractable = "";
private String downInteractable = "";

public Options(){
}

public void setCardinalPointers(int north, int south, int east, int west){
    northPointer = north;
    southPointer = south;
    eastPointer = east;
    westPointer = west;
}
public void setIntercardinalPointers(int northeast, int northwest, int       southeast, int southwest){
    northeastPointer = northeast;
    northwestPointer=northwest;
    southeastPointer=southeast;
    southwestPointer=southwest;
}

public void setElevationPointers(int up, int down){
    upPointer = up;
    downPointer = down;
}



public String whatToReturn(String string){
    String importantPart = "";

    if(string.matches("travel.*")){
        String substring = string.substring(6);

    }

    else {
        importantPart = "Interactable";
        String substring = string.substring(6);
        if (substring.matches("\\bnorth\\b")) {
            if(northInteractable!=0){

            }
        }

        else if (substring.matches("\\bsouth\\b"))

        else if (substring.matches("\\beast\\b"))

        else if (substring.matches("\\bwest\\b"))

        else if (substring.contains("northeast"))

        else if (substring.contains("northwest"))

        else if (substring.contains("southeast"))

        else if (substring.contains("southwest"))

        else if (substring.contains("up"))

        else if (substring.contains("down"))
    }
    return importantPart;

}
}

直到输入完之后,我才看到冒险标签,因此我将开始仔细阅读,但仍会张贴此标签,因此,如果对此有一个很好的答案,而我还没有找到,我深感抱歉。

回顾一下:关联几个对象以创建一个具有退出,描述和交互作用的房间对象(从文件中获取其信息(XML是我惯用的东西))的一种好方法。 并且用户与这些基于关键字的关键字进行交互,这些关键字可以自由输入,而不仅限于数组保持关键字的索引值。

我在想,当用户键入“北行”之类的字词时,首先要检查他们是否键入了关键字(在这种情况下为旅行),然后输入了方向。 然后,在检查其是否指示旅行的其他地方,向北检查是否有可能向北退出房间可能有或没有。 然后,如果它的另一个关键字(如check)使它变得容易,它也具有完全相同的方向,但是要检查其他字符串。

然后,如果存在房间“ northExit”,则以某种方式获得一个选项,并带有指向另一个roomID的指针。 尽管在考虑将来需要物品进入下一间房间的可能性时,这种思考过程使我遇到了问题。 另外,在哪里存储/获取这些选项也造成了一些困难。

===============>>#1 票数:0 已采纳

我想向您介绍两件事。 第一个,在enum 您可以将其视为一种特殊的类,其中所有可能的选项都在类定义中枚举 对于您的情况,这非常适合指导。 枚举很简单,您只需列出所有可能在其他类中使用的选项:

public enum Direction {
    NORTH, NORTH_EAST, EAST, SOUTH_EAST, SOUTH, SOUTH_WEST, WEST, NOTH_WEST;
}

如果您希望它们具有自己的方法和属性,它们可能会稍微复杂一些:

public enum Direction {
    NORTH(true), NORTH_EAST(false), EAST(true), SOUTH_EAST(false), SOUTH(true), SOUTH_WEST(false), WEST(true), NOTH_WEST(false);

    private final boolean isCardinal;

    private Direction(boolean isCardinal){
        this.isCardinal = isCardinal;
    }

    public boolean isCardinal(){
        return isCardinal;
    }

    public static Collection<Direction> getCardinalDirections(){
        return Arrays.asList(Direction.values()).stream().filter(Direction::isCardinal).collect(Collectors.toList());
    }

    public static Collection<Direction> getIncardinalDirections(){
        return Arrays.asList(Direction.values()).stream().filter(x -> !x.isCardinal()).collect(Collectors.toList());
    }
}

在此处阅读有关Java enum类型的更多信息。

我想向您介绍的第二件事是称为Map的数据结构。 地图也称为字典,通常可以帮助理解它们的工作方式。 地图将获取一个对象并将其映射到另一个对象,例如字典如何将单词映射到其定义,或电话簿如何将一个人的姓名映射到其电话号码。 我们可以使用Map简化您的Room类。 我不会重现您的所有代码,因为我专注于您的Room目前存在:

public class Room {

    private Map<Direction, Room> exits;

    public Room(){
        this.exits = new HashMap<>();
    }

    public void setExit(Direction direction, Room room){
        this.exits.put(direction, room);
    }

    public Room getExit(Direction direction){
        return this.exits.get(direction);
    }
}

在此处阅读有关Java Map接口的更多信息。

当然,您将需要调整从XML等中读取的方法。但是,现在,应该大大简化Room类。

希望这对您有所帮助。

  ask by Aurme Erebos translate from so

未解决问题?本站智能推荐: