Cette semaine, c'est Quentin qui vous propose un #KataOfTheWeek : Tennis game
Briefing du Kata : Les règles sont les suivantes:
- Chaque joueurs peut avoir "0", "15", “30”, “40” points durant un jeu
- Si un joueur à 40 et qu'il gagne 1 point alors il gagne le jeu en cours, cependant certaines règles peuvent s'appliquer.
- Si les 2 joueurs sont à 40 alors il sont à "deuce" ou égalité.
- Lors d'une égalité, si un joueur gagne un point il prend l'avantage.
- Si un joueur avec un avantage marque un point, il gagne le jeu.
- Si un joueur avec un avantage perd un point, les deux joueurs reviennent à égalité ou "deuce".
Saurez-vous résoudre le problème ?
Bon courage !
Et voici une solution proposée par l'auteur en Java :
public class TennisGame {
private int playerOneScore = 0;
private int playerTwoScore = 0;
private String playerTwoName;
private String playerOneName;
public TennisGame(String playerOneName, String playerTwoName) {
this.playerOneName = playerOneName;
this.playerTwoName = playerTwoName;
}
public String getScore() {
if (hasWinner()) {
return playerWithHighestScore() + " wins";
}
if (hasAdvantage()) {
return "Advantage " + playerWithHighestScore();
}
if (isDeuce())
return "Deuce";
if(playerOneScore == playerTwoScore) {
return translateScore(playerOneScore) + " all";
}
return translateScore(playerOneScore) + "," + translateScore(playerTwoScore);
}
private boolean isDeuce() {
return playerOneScore >= 3 && playerTwoScore == playerOneScore;
}
private String playerWithHighestScore() {
if (playerOneScore > playerTwoScore) {
return playerOneName;
} else {
return playerTwoName;
}
}
private boolean hasWinner() {
if(playerTwoScore >= 4 && playerTwoScore >= playerOneScore + 2 )
return true;
if(playerOneScore >= 4 && playerOneScore >= playerTwoScore + 2)
return true;
return false;
}
private boolean hasAdvantage() {
if (playerTwoScore >= 4 && playerTwoScore == playerOneScore + 1)
return true;
if (playerOneScore >= 4 && playerOneScore == playerTwoScore + 1)
return true;
return false;
}
public void playerOneScores() {
playerOneScore++;
}
public void playerTwoScores() {
playerTwoScore++;
}
private String translateScore(int score) {
switch (score) {
case 3:
return "Forty";
case 2:
return "Thirty";
case 1:
return "Fifteen";
case 0:
return "Zero";
}
throw new IllegalArgumentException("Illegal score: " + score);
}
}
Votre équipe TakiVeille