Механизм поворота в Java

#java

#java

Вопрос:

Я пытаюсь реализовать механизм поворота в своем приложении с помощью этого сценария: AppFrame получает список пользователей в системе> Он запрашивает диалоговое окно сообщения «Очередь пользователя! > Пользователь вводит свои ответы, нажимает кнопку отправки > система добавляет в HashMap свои ответы > если пользователей больше не осталось, отображается рамка с результатами, иначе начинается очередь второго пользователя с диалоговым окном сообщения и т. Д.

Я пытался сделать что-то подобное

 public void turnMechanism() {
    for (final User user : gf.getUsers()) {
        JOptionPane.showMessageDialog(null, user.getUserName() 's turn);
        gameStopButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                gameStopButtonActionPerformed(evt, user);

            }
        });
    }
    new ResultsFrame(gf);
    dispose();

}
private void userStop(User u){
    AnswerSet userSet = new AnswerSet(gameNameField.getText().trim()
            .toLowerCase(), gameAnimalField.getText().trim().toLowerCase(),
            gamePlantField.getText().trim().toLowerCase(), gameCountryField
                    .getText().trim().toLowerCase(), gameCityField
                    .getText().trim().toLowerCase(), gameOccupationField
                    .getText().trim().toLowerCase());
    answers.put(u, userSet);
}

private void gameStopButtonActionPerformed(ActionEvent evt, User u) {
    userStop(u);
 

Но он не работает должным образом. Можете ли вы дать мне подсказку, как это сделать? Без статических полей.

Комментарии:

1. что означает «не работает должным образом»? какую ошибку вы получили или неожиданный вывод?

2. На самом деле нет вывода.

3. Это Swing? Что такое «ResultFrame»? Что такое набор ответов? Где у вас будет вывод?

4. Желаемое поведение: AppFrame получает список пользователей в системе> Появляется диалоговое окно с сообщением «Очередь пользователя! > Пользователь вводит свои ответы, нажимает кнопку отправки > система добавляет в HashMap свои ответы > если пользователей больше не осталось, отображается рамка с результатами, иначе начинается очередь второго пользователя с диалоговым окном сообщения.

5. Пожалуйста, предоставьте MCTaRE (минимальный полный протестированный и читаемый … Пример), чтобы помочь вам лучше.

Ответ №1:

Вот мой код на табличке, который может сработать для вас. Класс структуры для пользователя для хранения ответа:

 public class Player {
    private final User user;
    private AnswerSet answer;

    public Player(User p_user) {
        user = p_user;
    }

    public User getUser() {
        return user;
    }

    public void setAnswer(AnswerSet answer) {
        this.answer = answer;
    }

    public AnswerSet getAnswer() {
        return answer;
    }
}
 

Вот класс с основной логикой пошагового поведения:

 public class TurnBasedGame {
    public enum State {
        READY,
        RUNNING,
        ENDED
    }

    private final List<Player> players = new ArrayList<>();
    private final int rounds;
    private int currentRound;
    private int currentTurn;
    private State currentState = State.READY;


    public TurnBasedGame() {
        this(1);
    }

    public TurnBasedGame(int rounds) {
        this.rounds = rounds;
    }

    public void addPlayer(Player player) {
        players.add(player);
    }

    public List<Player> getPlayers() {
        return players;
    }

    public void start() {
        currentTurn = 0;
        currentRound = 0;
        currentState = State.RUNNING;
    }

    public void endPlayerTurn() {
        if (currentState != State.RUNNING) {
            throw new IllegalStateException("Game is not started");
        }

        currentTurn  ;

        if (currentTurn >= players.size()) {
            currentTurn = 0;
            currentRound = 0;
        }
        if (currentRound >= rounds) {
            currentState = State.ENDED;
        }
    }

    public State getCurrentState() {
        return currentState;
    }

    public Player getCurrentPlayer() {
        return players.get(currentTurn);
    }
}
 

И вот как вы переплетаете это с вашим кодом:

 public void turnMechanism() {
    final TurnBasedGame game = new TurnBasedGame();

    for (final User user : gf.getUsers()) {
        game.addPlayer(new Player(user));
    }

    gameStopButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            final Player currentPlayer = game.getCurrentPlayer();
            currentPlayer.setAnswer(createAnswerSet());
            game.endPlayerTurn();

            switch (game.getCurrentState()) {
                 case RUNNING:
                     //next player
                     showCurrentPlayerInfo(game);
                     break;
                 case ENDED:
                     //show your resutls here
                     showResults(game);
                     break;
            }
        }
    });
    game.start();
    showCurrentPlayerInfo(game);

    //not sure what this does
    new ResultsFrame(gf);
    dispose();
}

private void showCurrentPlayerInfo(TurnBasedGame p_game) {
    JOptionPane.showMessageDialog(null, p_game.getCurrentPlayer().getUser().getUserName()   's turn);
}

private void showResults(TurnBasedGame p_game) {
    for (Player player : p_game.getPlayers()) {
        final AnswerSet answer = player.getAnswer();
        //do whatever you want with the answer
    }
}