编程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;@Beforepublic void beforeGameTest() {victor = new Player("Victor");sarah = new Player("Sarah");game = new Game(victor, sarah);}@Testpublic void loveShouldBeDescriptionForScore0() {Game game = new Game(victor, sarah);assertThat(game, hasProperty("score", is("love, love")));}@Testpublic void fifteenShouldBeDescriptionForScore1() {sarah.winBall();assertThat(game, hasProperty("score", is("love, fifteen")));}@Testpublic void thirtyShouldBeDescriptionForScore2() {victor.winBall();victor.winBall();sarah.winBall();assertThat(game, hasProperty("score", is("thirty, fifteen")));}@Testpublic void fortyShouldBeDescriptionForScore3() {IntStream.rangeClosed(1, 3).forEach((Integer) -> {victor.winBall();});assertThat(game, hasProperty("score", is("forty, love")));}@Testpublic 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")));}@Testpublic 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")));}@Testpublic 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