Разбор командной строки и изменение ее на Char или Boolean - PullRequest
0 голосов
/ 06 сентября 2018

Мне нужна опция для разбора командной строки для игры TicTacToe. Имя игрока 1 и 2 .... Игроки 1 и 2 подписываются как (char), а isP1 (P2) Ai как (булево).

 TicTacToe ttt = new TicTacToe();

    Options options = new Options();

    Option p1Name = new Option("-p1name", "--player1Name", false, "The name for Player 1");
    p1Name.setRequired(false);
    options.addOption(p1Name);

    Option p1Sign = new Option("-p1sign", "--player1Sign", false, "The sign for Player 1");
    p1Sign.setRequired(false);
    options.addOption(p1Sign);

    Option p2Name = new Option("-p2name", "--player2Name", false, "The name for Player 2");
    p2Name.setRequired(false);
    options.addOption(p2Name);

    Option p2Sign = new Option("-p2sign", "--player2Sign", false, "The sign for Player 2");
    p2Sign.setRequired(false);
    options.addOption(p2Sign);

    Option p1IsAi = new Option("-isP1Ai", "--isPlayer1Ai", false, "Determine if Player 1 should be an AI");
    p1IsAi.setRequired(false);
    options.addOption(p1IsAi);

    Option p2IsAi = new Option("-isP2Ai", "--isPlayer2Ai", false, "Determine if Player 2 should be an AI");
    p2IsAi.setRequired(false);
    options.addOption(p2IsAi);

    CommandLineParser parser = new BasicParser();
    HelpFormatter formatter = new HelpFormatter();
    CommandLine cmd = null;

    try
    {
        cmd = parser.parse(options, args);
    }
    catch (ParseException e)
    {
        System.out.println(e.getMessage());
        formatter.printHelp("utility-name", options);

        System.exit(1);
    }

    String player1Name = cmd.getOptionValue("p1Name");
    String player2Name = cmd.getOptionValue("p2Name");
    char player1Sign = cmd.getOptionValue("p1sign");
    char player2Sign = cmd.getOptionValue("p2sign");
    String boolP1 = cmd.getOptionValue("p1IsAi");
    String boolP2 = cmd.getOptionValue("p2IsAi");
    boolean isPlayer1Ai = Boolean.valueOf(boolP1);
    boolean isPlayer2Ai = Boolean.valueOf(boolP2);

    if (args.length == 4)
    {
        Player player1 = new Player(player1Name, player1Sign, isPlayer1Ai);
        Player player2 = new Player(player2Name, player2Sign, isPlayer2Ai);
        ttt = new TicTacToe(player1, player2);
    }
    ttt.run();
}

Итак, проблема в следующем:

Когда я пытаюсь получить аргумент для isPlayer1 (2) Ai

boolean isPlayer1Ai = Boolean.valueOf (boolP1);

boolean isPlayer2Ai = Boolean.valueOf (boolP2);

Это факт, что он автоматически распаковывается в логическое значение ... это как-то проблема?

И как я могу разобрать знак игрока, как я пытался, но не получилось, из командной строки и привести его к символу?

Конструктор для моих игроков:

 public Player(String name, char sign, boolean isPlayerAi)
{
    this.name = name;
    this.sign = sign;
    this.isPlayerAi = isPlayerAi;
}

1 Ответ

0 голосов
/ 06 сентября 2018

Исходя из вашего кода, cmd.getOptionValue всегда будет возвращать строку, даже если это всего лишь один символ. Чтобы преобразовать строку из одного символа в символ, вы можете использовать .charAt(0): , чтобы получить первый (0-индексированный) символ строки . Итак, предполагая, что значения знака игрока не могут быть ни null, ни пустыми, измените эти две строки:

char player1Sign = cmd.getOptionValue("p1sign");
char player2Sign = cmd.getOptionValue("p2sign");

до:

char player1Sign = cmd.getOptionValue("p1sign").charAt(0);
char player2Sign = cmd.getOptionValue("p2sign").charAt(0);

Что касается вашего другого вопроса об автобоксе от Boolean до boolean, это опять же зависит от того, могут ли строки быть null и / или пустыми, и / или недействительными. Если они всегда либо true, либо false, автобокс на boolean -примитив должен подойти. Если нет, то снова требуется проверка if, и, возможно, вместо этого следует использовать Boolean объекты, содержащие true / false / null.


Поскольку я не знаю, что должен делать ваш код, я не знаю, могут ли они быть null, и / или пустыми строками, и / или недопустимыми строками. Также я не знаю, какими они должны быть после преобразования их в boolean / char (или Boolean / Character). Так что я оставил это пока открытым.

...