Let's play tennis

Cette semaine, c'est Quentin qui vous propose un #KataOfTheWeek : Tennis game

Briefing du Kata : Les règles sont les suivantes:

  1. Chaque joueurs peut avoir "0", "15", “30”, “40” points durant un jeu
  2. Si un joueur à 40 et qu'il gagne 1 point alors il gagne le jeu en cours, cependant certaines règles peuvent s'appliquer.
  3. Si les 2 joueurs sont à 40 alors il sont à "deuce" ou égalité.
  4. Lors d'une égalité, si un joueur gagne un point il prend l'avantage.
  5. Si un joueur avec un avantage marque un point, il gagne le jeu.
  6. 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

TakiVeille

TakiVeille