我必须创建一个java类,我可以从标准控制台读取一些命令。这就像模拟网格中的运动。我很难完全创建我想要的东西。假设我有这样的命令:
“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命令或其他类型的问题。有人能帮我解决这个问题吗??谢谢。
用不同的方式思考你的问题...
这意味着您需要识别用户输入的命令,然后才能执行命令背后的逻辑,例如。。。
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 问题答案: 如果没有等待您输入另一个,则将错误地假定您已完成输入。 我的意思是,