当前位置: 首页 > 知识库问答 >
问题:

Java扫描仪命令系统

钱睿范
2023-03-14

我必须创建一个java类,我可以从标准控制台读取一些命令。这就像模拟网格中的运动。我很难完全创建我想要的东西。假设我有这样的命令:

  • 从X、Y、方向开始
  • 步子

“X”和“Y”是矩阵6x6的坐标。“方向”可以是“上”、“下”、“左”、“右”。如果我写“步骤”,我会做一步。

程序应该丢弃STEP命令,直到有效的START命令被执行。之后,我可以使用STEP或另一个有效的START命令,它将使用新的坐标将“1”删除第一个。

例如:

a)START 1,4,UP ---> OK! ANOTHER START OR STEP COMMAND
  STEP ---> OK MOVE!

b)START 3,5,UP ---> OK! ANOTHER START OR STEP COMMAND
  START 5,2,LEFT ---> DONE! OK NEW POSITION!
  STEP ---> OK MOVE!

c)STEP ---> NO! I NEED START
  OWINEVEIVNEW ---> NO! I NEED START
  START 3,2,RIGHT ---> OK! ANOTHER START OR STEP COMMAND

如果我有开始命令,我还必须捕捉坐标(X,Y)和方向。

我的想法是:

public static void main(String[] args) {
    Movement grid = new Movement(6); --> call constructor. 6 is dimension square grid
    System.out.println("**********INSERT COMMANDS**********");
    while(true){ --> loop to continue to insert commands
        if (grid.startCommand()) {
           System.out.println("OK START RECEIVED! I CAN USE STEP");
           grid.stepForward();
        } else {
           System.out.println("I can't go ahead without valid START command. Try again!");
        };
    }   
}

public boolean stepForward() {
    if (start.equals("STEP") {
        System.out.println("OK LET'S DO A STEP!!");
    }
    return true;
}

public boolean startCommand() {
    Scanner sc = new Scanner(System.in);
    String start = sc.next();
    sc.useDelimiter("\\s+");
    String[] coordinates = sc.next().split(",");
    X = Integer.parseInt(coordinates[0]);
    Y = Integer.parseInt(coordinates[1]);
    direction = coordinates[2];
    while(start.equals("START")) {
        if ((0<=X && X<dim) && (0<=Y && Y<dim)){
            if (direction.equals("UP")||direction.equals("DOWN")||direction.equals("LEFT")||direction.equals("RIGHT")){
                cleanGrid(); --> this is just a method that put everything at 0
                matrix[X][Y] = 1;
                return true;
            } else {
                System.out.println("Your direction doesn't exist. Use \"UP\",\"DOWN\",\"LEFT\",\"RIGHT\".Try again!");
                return false;
            }
        } else {
            System.out.println("Check range of X and Y. Try again!");
            return false;
        }
    } 
    System.out.println("Insert command like ex. \"START 1,2,UP\". Try again!");
    return false;
}

是的,我在IF、WHILE等之间迷路了...我尝试了不同的解决方案,但是或者我失去了插入另一个START的可能性,或者我不能识别STEP命令或其他类型的问题。有人能帮我解决这个问题吗??谢谢。

共有1个答案

禹昊穹
2023-03-14

用不同的方式思考你的问题...

  • 提示用户输入
  • 用户输入一些输入
  • 您需要确定输入内容并对其执行一些操作
  • 返回到提示用户

这意味着您需要识别用户输入的命令,然后才能执行命令背后的逻辑,例如。。。

Scanner scanner = new Scanner(System.in);
boolean exit = false;
do {

    System.out.print("CMD> ");
    String input = scanner.nextLine();
    if ("exit".equalsIgnoreCase(input)) {
        exit = true;
    } else if (input.toLowerCase().startsWith("start")) {
        doStart(input);
    } else if (input.toLowerCase().startsWith("step")) {
        doStep(input);
    }

} while (!exit);

一旦知道用户输入的命令,就知道要执行哪个方法来执行该命令。

然后,根据命令,您可能需要解析参数并对其进行处理。。。

protected void doStart(String input) {
    Scanner scanner = new Scanner(input);
    scanner.next(); // Command
    String parameters[] = scanner.next().split(",");
    int x = Integer.parseInt(parameters[0]);
    int y = Integer.parseInt(parameters[1]);
    String dir = parameters[2];

    System.out.println(" > start @ " + x + "x" + y + " in " + dir + " direction");
}

就像你的html" target="_blank">代码说的那样,我可以写“开始2,3,向上”并继续执行“步骤”,但我也可以像第一个命令那样写“步骤”

例如,你需要一些能够维持当前状态的东西。。。

public class BotPos {

    private int x;
    private int y;
    private String direction;

    public BotPos(int x, int y, String direction) {
        this.x = x;
        this.y = y;
        this.direction = direction;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public String getDirection() {
        return direction;
    }

    public void setDirection(String direction) {
        this.direction = direction;
    }

    @Override
    public String toString() {
        return " > Bot is @ " + x + "x" + y + " in " + direction + " direction";
    }
}

假设botPos是一个类实例字段,那么do start将设置此状态。。。

protected void doStart(String input) {
    Scanner scanner = new Scanner(input);
    scanner.next(); // Command
    String parameters[] = scanner.next().split(",");
    int x = Integer.parseInt(parameters[0]);
    int y = Integer.parseInt(parameters[1]);
    String dir = parameters[2];

    botPos = new BotPos(x, y, dir);
    System.out.println(botPos);
}

如果可以的话,doStep会更新它。。。

protected void doStep(String input) {
    if (botPos != null) {

        switch (botPos.getDirection().toLowerCase()) {
            case "up":
                botPos.setY(botPos.getY() - 1);
                break;
            case "down":
                botPos.setY(botPos.getY() + 1);
                break;
            case "left":
                botPos.setX(botPos.getX() - 1);
                break;
            case "right":
                botPos.setX(botPos.getX() + 1);
                break;
        }
        System.out.println(botPos);

    } else {

        System.out.println(" > Invalid state, you have no start position");

    }
}

现在,您也可以将botPos传递给方法,但想法是相同的。

如果需要,只需将botPos设置为null即可使其无效

 类似资料:
  • 问题内容: 如何将扫描仪的定界符设置为;或换行? 我试过: 但这不起作用。 问题答案: 通常,在模式中,您需要将翻倍。 所以,尝试 要么 编辑 :如果是问题,则可能要尝试以下操作: 它匹配的一个或多个,和。 注意 :我还没有尝试过这些。

  • 问题内容: 我有一个创建多个对象并将其放入一个类的类,如下所示: 我有一个从控制台扫描输入“ add”的应用程序,如果找到该应用程序,则调用如下所示的方法: 该应用程序应允许用户根据需要多次输入“添加”,但是在add调用该方法后将出现错误“找不到行” 。 我猜这是因为方法中的尚未关闭,然后在需要时重新打开。这是程序的问题吗?如果是,我将如何修复它? 请注意,该程序尚未完成,因为我将添加一种出售这些

  • 问题内容: 我正在尝试读取具有多个单词的字符串,即。洛杉矶或纽约市。如果有两个词并将它们分割在变量之间,则使用scanner.next()进行“出发”和“到达”只会读取第一个。nextLine()也不是很幸运。这是我的代码: 我知道这很简单,但我还没有弄清楚。 这是上面的代码的输入/输出: 输入航班号:29 输入出发城市:(立即跳至下一行) 输入到达城市: -—我真正想要的是---- 输入航班号:

  • 问题内容: 我的Java作业有问题。我遇到了意外的异常,特别是: java.util.NoSuchElementException:找不到行 我正在使用,该程序不断读取任何内容,并重复“无效格式”异常文本。如果输入正确的值,则第一部分通过,然后该部分立即进入此异常。如果输入的值不正确,则它将开始循环异常。 这是我的代码: 问题答案: 您关闭了多个库,这些库关闭了底层库,因此另一个库将不再从同一库和

  • 问题内容: 使用Scanner类中的useDelimiter时遇到一些问题。 如果我有这个输入 美国广播公司 输出将是 AB 然后等到我键入另一个“-”以打印出最后一个字符 但是,如果我没有用户输入数据,而是将字符串插入到Scanner中,则代码将起作用。原因是什么?如何解决?我不想使用StringTokenzier 问题答案: 如果没有等待您输入另一个,则将错误地假定您已完成输入。 我的意思是,