Как разобрать результат игры String Blackjack - PullRequest
0 голосов
/ 10 июня 2019

Я работаю над моим новым Java-приложением.Это анализатор игры в блэкджек.Сервер отправляет результат игры в блэкджек пользователю, мое приложение анализирует его, а затем показывает описание игры пользователю.Результат игры выглядит следующим образом: #N145. 20(9♥️,6♠️,J♠️,Q♦️) - 19(8♦️,A♠️) Здесь 145 - это номер игры, 20 - это счет казино, а 19 - счет игрока.И этот ряд должен быть разобран в объект Game.Вот класс игры:

//import

public class Game {
    private final int gameNumber;
    private final boolean casinoWon;
    private final Set<Card> gamerDeck;
    private final Set<Card> casinoDeck;
    private final int gamerScore;
    private final int casinoScore;

    public Game(int gameNumber, boolean casinoWon,
                Set<Card> gamerDeck, Set<Card> casinoDeck,
                int gamerScore, int casinoScore) {
        this.gameNumber = gameNumber;
        this.casinoWon = casinoWon;
        this.gamerDeck = gamerDeck;
        this.casinoDeck = casinoDeck;
        this.gamerScore = gamerScore;
        this.casinoScore = casinoScore;
    }

    //getters
}

Я начал писать парсер, но думаю, что делаю это неправильно.Вот код из него:


//import

public class StringParser {
    public Game parseStringToGame(String inputString) throws ParseException {
        int gameNumber = -1;
        boolean isCasinoWon = false;
        int gamerScore = -1;
        int casinoScore = -1;
        String stringGamerDeck = "";
        String stringCasinoDeck = "";

        Iterator<Character> iterator = stringToCharacterList(inputString).iterator();
        while(iterator.hasNext()) {
            StringBuilder currentObject = new StringBuilder();
            Character c = iterator.next();

            if (c == '#')
                c = iterator.next();
            else
                throw new ParseException();

            if (c == 'N')
                c = iterator.next();
            else
                throw new ParseException();

            while(Character.isDigit(c)) {
                currentObject.append(c);
                c = iterator.next();
            }
            gameNumber = Integer.parseInt(currentObject.toString());
            currentObject = new StringBuilder();
            //c=='.'
            if (c == '.')
                c = iterator.next();
            else
                throw new ParseException();

            //c==' '
            if (c == ' ')
                c = iterator.next();
            else
                throw new ParseException();

            //to be continued

        }
    }

    private List<Character> stringToCharacterList(String s) {
        List<Character> characters = new LinkedList<>();
        for (char c : s.toCharArray())
            characters.add(c);
        return characters;
    }
}

Как видите, это выглядит очень отвратительно.Есть ли какой-нибудь более продвинутый способ разбора строки?

1 Ответ

1 голос
/ 10 июня 2019

Вы можете использовать regexp для этой задачи, если вывод игры всегда фиксирован.

    Pattern p = Pattern.compile("^#N(\\d*).\\s+(\\d*)(.+)\\s+-\\s+(\\d*)(.+)");
    Matcher m = p.matcher(s);
    m.find();
    int gameNumber = Integer.valueOf(m.group(1));
    int gamerScore = Integer.valueOf(m.group(2));
    int casinoScore = Integer.valueOf(m.group(4));
    boolean casinoWon = casinoScore - gamerScore > 0;
    Set<Card> gamerDeck  = parseDeck(m.group(3));
    Set<Card> casinoDeck = parseDeck(m.group(5));

Все, что вам нужно, это реализовать метод parseDeck.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...