通过Katas进行Java教程:网球比赛(轻松)

本文介绍了编程kata的概念,作为磨练编程技能的一种方式。特别是通过一个简易的网球比赛kata,适合已有Java基础并熟悉JUnit的读者。文章提供了一个测试驱动的开发方法,给出了测试代码和可能的解决方案。
摘要由CSDN通过智能技术生成

编程kata是一种练习,可以帮助程序员通过练习和重复练习来磨练自己的技能。

本文是“通过Katas的Java教程”系列的一部分。 文章分为易,中和难。

Fizz Buzz(轻松) -Java 7
柏林时钟(简易) – Java 7和8
网球比赛(简易)– Java 7 反向波兰表示法(中) – Java 7和8


本文假定读者已经具有Java的使用经验,熟悉JUnit测试的基本用法,并且知道如何从自己喜欢的IDE(我们是IntelliJ IDEA )运行它们。

下面显示证明解决方案正确的测试。 解决此问题的推荐方法是使用测试驱动的开发方法(编写第一个测试的实现,确认它通过并转到下一个测试)。 一旦所有测试通过,就可以认为解决了问题。

测试下方提供了一种可能的解决方案。 尝试先自己解决kata。

网球比赛

实施简单的网球比赛

规则:
  • 从零到三分的分数分别描述为“爱”,“十五”,“三十”和“四十”。
  • 如果每方至少得分3分,并且玩家比对手多1分,那么比赛的得分对领先的玩家来说是“优势”。
  • 如果每个玩家至少获得了3分,并且得分相等,则得分为“降低”。
  • 第一位赢得比赛的玩家至少赢得了至少4分,并且比对手多赢得了至少2分。

[测试]

public class GameTest {

    Player victor;
    Player sarah;
    Game game;

    @Before
    public void beforeGameTest() {
        victor = new Player("Victor");
        sarah = new Player("Sarah");
        game = new Game(victor, sarah);
    }

    @Test
    public void loveShouldBeDescriptionForScore0() {
        Game game = new Game(victor, sarah);
        assertThat(game, hasProperty("score", is("love, love")));
    }

    @Test
    public void fifteenShouldBeDescriptionForScore1() {
        sarah.winBall();
        assertThat(game, hasProperty("score", is("love, fifteen")));
    }

    @Test
    public void thirtyShouldBeDescriptionForScore2() {
        victor.winBall();
        victor.winBall();
        sarah.winBall();
        assertThat(game, hasProperty("score", is("thirty, fifteen")));
    }

    @Test
    public void fortyShouldBeDescriptionForScore3() {
        IntStream.rangeClosed(1, 3).forEach((Integer) -> {
                victor.winBall();
        });
        assertThat(game, hasProperty("score", is("forty, love")));
    }

    @Test
    public void advantageShouldBeDescriptionWhenLeastThreePointsHaveNeenScoredByEachSideAndPlayerHasOnePointMoreThanHisOpponent() {
        IntStream.rangeClosed(1, 3).forEach((Integer) -> {
            victor.winBall();
        });
        IntStream.rangeClosed(1, 4).forEach((Integer) -> {
            sarah.winBall();
        });
        assertThat(game, hasProperty("score", is("advantage Sarah")));
    }

    @Test
    public void deuceShouldBeDescriptionWhenAtLeastThreePointsHaveBeenScoredByEachPlayerAndTheScoresAreEqual() {
        for(int index = 1; index <= 3; index++) {
            victor.winBall();
        }
        for(int index = 1; index <= 3; index++) {
            sarah.winBall();
        }
        assertThat(game, hasProperty("score", is("deuce")));
        victor.winBall();
        assertThat(game, hasProperty("score", is(not("deuce"))));
        sarah.winBall();
        assertThat(game, hasProperty("score", is("deuce")));
    }

    @Test
    public void gameShouldBeWonByTheFirstPlayerToHaveWonAtLeastFourPointsInTotalAndWithAtLeastTwoPointsMoreThanTheOpponent() {
        for(int index = 1; index <= 4; index++) {
            victor.winBall();
        }
        for(int index = 1; index <= 3; index++) {
            sarah.winBall();
        }
        assertThat(game, hasProperty("score", is(not("Victor won"))));
        assertThat(game, hasProperty("score", is(not("Sarah won"))));
        victor.winBall();
        assertThat(game, hasProperty("score", is("Victor won")));
    }

}

测试代码可以在GitHub GameTest.java中找到。 可以在GitHub PlayerTest.java中找到另一组测试(未在上面列出)。

[一种可能的解决方案]

public class Game {

    private Player player1;
    private Player player2;

    public Game(Player player1, Player player2) {
        this.player1 = player1;
        this.player2 = player2;
    }

    public String getScore() {
        if (player1.getScore() >= 3 && player2.getScore() >= 3) {
            if (Math.abs(player2.getScore() - player1.getScore()) >= 2) {
                return getLeadPlayer().getName() + " won";
            } else if (player1.getScore() == player2.getScore()) {
                return "deuce";
            } else {
                return "advantage " + getLeadPlayer().getName();
            }
        } else {
            return player1.getScoreDescription() + ", " + player2.getScoreDescription();
        }
    }

    public Player getLeadPlayer() {
        return (player1.getScore() > player2.getScore()) ? player1 : player2;
    }

}

Java解决方案代码可以在Game.java解决方案中找到。 它使用Player.java解决方案中可以找到的Player类(上面未列出)。

翻译自: https://www.javacodegeeks.com/2014/05/java-tutorial-through-katas-tennis-game-easy.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值