Во-первых, у вас возникла логическая проблема:
} while (!(Math.abs(receiver.getScore() - server.getScore()) >= 2));
, если один игрок имеет преимущество в 2 очка, это не значит, что он выигрывает игру, так как счет может быть 30: 0, 0:30, 40:15 и т. Д.
Вместо этого я предлагаю сохранить статус игры внутри класса TennisGame:
public boolean isFinished;
public boolean isFinished() {
return isFinished;
}
и установить его, когда один из игроков выиграет игру и использует ее.вот так:
} while(!tennisGame.isFinished)
Во-вторых, чтобы избежать сбоев и следовать логике игры в теннис, я предлагаю внести следующие изменения:
public static final List<String> pointsDescriptions = Arrays.asList("0", "15", "30", "40", "A");
Также сделаны некоторые оптимизации, чтобы избежать использования многих переменных:
public String getScore(){
String score;
if (server.getScore() >= 3 && receiver.getScore() >= 3){
if(Math.abs(receiver.getScore() - server.getScore()) >= 2){
score = getLeadPlayer().getName() + " won";
isFinished = true;
} else if (server.getScore() - receiver.getScore() >= 1) {
score = "A" + ":" + receiver.getScoreDescription();
} else if (receiver.getScore() - server.getScore() >= 1) {
score = server.getScoreDescription() + ":" + "A";
} else {
score = "40:40";
}
} else if (server.getScore() > 3 || receiver.getScore() > 3) {
score = getLeadPlayer().getName() + " won";
isFinished = true;
} else {
score = server.getScoreDescription() + ":" + receiver.getScoreDescription();
}
return score;
}