1

对于我的学校项目,我正在为 iPhone 创建一个像 Bad Apples 这样的游戏(不是我个人的选择,但这不是问题)。

游戏需要有两个版本,第一个在控制台,第二个在 JavaFX。但我想更进一步。我想添加用户在启动游戏时可以添加到终端的参数,例如

java -jar BadApplesClone.jar --height=10 --width=10 --numPieces=5

然后我将处理所有引入的值并更改变量。

我正在使用 OpenJDK6,所以我现在这样做:

    for (int i=0; i<args.length; i++)
    {
        if (args[i].equals("--help"))
            throw new UnsupportedOperationException("Not yet implemented");

        if (args[i].equals("--largura"))
            throw new UnsupportedOperationException("Not yet implemented");

        if (args[i].equals("--altura"))
            throw new UnsupportedOperationException("Not yet implemented");

        if (args[i].equals("--pecas_inicio"))
            throw new UnsupportedOperationException("Not yet implemented");

        if (args[i].equals("--javafx"))
        {
            JavaFX javaFX = new JavaFX(ALTURA, LARGURA, PECAS_INICIO);
            javaFX.initJogo();
        }
    }

但我不知道如何处理 --width=10 之类的值。我想到了一个枚举,但我真的不知道该怎么做。

谁能解释我实现这一目标的方法?

4

4 回答 4

2

如果您被允许使用外部库,请查看Apache Commons CLI,这将使您免于重新发明轮子。

于 2012-05-24T21:54:43.903 回答
2

要回答您实际提出的问题...

args 数组的某些元素采用“--SOMETHING=ANOTHER”形式。

所以,你首先需要的是:

if(args[x].startsWith("--SOMETHING")) { 

第二个问题是解析 ANOTHER。

args[x].split("=") 

是开始的地方。

于 2012-05-24T22:25:25.863 回答
1

如果您使用的是 JavaFX,您可以getParameters在 Application 类中使用该方法(请注意,不是在构造函数中),它处理来自命令行以及来自 jnlp 文件的两个参数!

public final Application.Parameters getParameters()

检索此应用程序的参数,包括在命令行上传递的任何参数以及在小程序或 WebStart 应用程序的 JNLP 文件中指定的任何参数。注意:不应从 Application 构造函数调用此方法,因为它将返回 null。它可以在 init() 方法中或之后的任何时间调用。

http://docs.oracle.com/javafx/2/api/javafx/application/Application.html#getParameters ()

有关更多详细信息,请参阅返回对象的文档:http: //docs.oracle.com/javafx/2/api/javafx/application/Application.Parameters.html

它处理命名和未命名(当然总是可以获取原始参数)。

Map您从调用中获得的命名参数getNamed()包括在 JNLP 文件中明确指定的那些对。它还包括以下形式的任何命令行参数:“--name=value”

List您通过调用获得的未命名参数getUnnamed()是您今天在代码中已经处理的简单参数,这意味着命名参数(即表示为对的参数)从 this 中过滤掉List

于 2012-05-24T21:56:06.660 回答
1

在这篇博文中有一个关于 JavaFX 和命令行参数的有趣讨论: Exploring JavaFX 2 - Accessing application parameters,其中作者建议您“让Application.getParameters()充当传输器并要求 Apache Commons CLI 获取主要工作”,他的意思是只获取原始参数数据而不是解析参数:

getParameters().getRaw().toArray(new String[getParameters().getRaw().size()])

这会将 JavaFX 示例的参数转换为您从命令行应用程序获得的相同类型的字符串数组,然后您可以使用通用函数处理参数解析。

如果您不能在您的项目中使用Apache Commons CLI,您可以自己为您的应用程序实现一个基本参数解析器,它在一个通用函数中处理基于从getParameters().getRaw().toArray调用中检索到的参数(在 JavaFX 模式下)或main()传递给的参数的解析您的应用程序(在命令行模式下)。

于 2012-05-24T22:07:21.053 回答