#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
}
}