实践题目:保龄球比赛计分
保龄球比赛一般分十局,每局最多可扔两个球,如果第一个球将所有的瓶子打倒了,就没必要打第二个球。但每局的计分可能会依赖后面的扔球得分,即如果这局扔第一个球得了10分,我们称全中,那个这局的得分=10分+后面扔的两球的得分,如果这局扔两球共得10分,我们称补中,那个这局的得分=10分+后面扔的一球的得分。
如下为敏捷培训时教练画的图:
答案有很多种,如下是我个人的做法,具体过程就不展示了。直接附上代码:
BowlingGameTest.java
package com.bijian.study.bowling.test; import org.junit.Assert; import org.junit.Test; import com.bijian.study.bowling.Game; public class BowlingGameTest { @Test public void normal_roll_should_return_sum_of_tow_rolls() { Game game = new Game(20); game.roll(4); game.roll(5); Assert.assertEquals(4+5, game.getFrameScore(1)); Assert.assertEquals(4+5, game.getTotalScore()); } @Test public void spare_roll_should_return_sum_contain_next_roll() { Game game = new Game(20); game.roll(5); game.roll(5); game.roll(4); game.roll(5); Assert.assertEquals(5+5+4, game.getFrameScore(1)); Assert.assertEquals(4+5, game.getFrameScore(2)); Assert.assertEquals((5+5+4)+(4+5), game.getTotalScore()); } @Test public void strike_roll_should_return_sum_contain_next_two_rolls() { Game game = new Game(20); game.roll(10); game.roll(5); game.roll(4); Assert.assertEquals(10+5+4, game.getFrameScore(1)); Assert.assertEquals(5+4, game.getFrameScore(2)); Assert.assertEquals((10+5+4)+(5+4), game.getTotalScore()); } @Test public void last_normal_roll_should_return_last_frame() { Game game = new Game(20); game.roll(10); game.roll(5); game.roll(4); game.roll(3); game.roll(4); game.roll(10); game.roll(3); game.roll(3); game.roll(0); game.roll(3); game.roll(2); game.roll(8); game.roll(10); game.roll(10); game.roll(2); game.roll(3); Assert.assertEquals(10+5+4, game.getFrameScore(1)); Assert.assertEquals(5+4, game.getFrameScore(2)); Assert.assertEquals(3+4, game.getFrameScore(3)); Assert.assertEquals(10+3+3, game.getFrameScore(4)); Assert.assertEquals(3+3, game.getFrameScore(5)); Assert.assertEquals(0+3, game.getFrameScore(6)); Assert.assertEquals(2+8+10, game.getFrameScore(7)); Assert.assertEquals(10+10+2, game.getFrameScore(8)); Assert.assertEquals(10+2+3, game.getFrameScore(9)); Assert.assertEquals(2+3, game.getFrameScore(10)); Assert.assertEquals((10+5+4)+(5+4)+(3+4)+(10+3+3)+(3+3)+(0+3)+(2+8+10)+(10+10+2)+(10+2+3)+(2+3), game.getTotalScore()); } @Test public void last_spare_roll_should_return_last_frame_with_add_one_roll() { Game game = new Game(20); game.roll(10); game.roll(5); game.roll(4); game.roll(10); game.roll(5); game.roll(4); game.roll(0); game.roll(0); game.roll(10); game.roll(5); game.roll(4); game.roll(10); game.roll(10); game.roll(2); game.roll(8); game.roll(9); Assert.assertEquals(2+8+9, game.getFrameScore(10)); Assert.assertEquals((10+5+4)+(5+4)+(10+5+4)+(5+4)+(0+0)+(10+5+4)+(5+4)+(10+10+2)+(10+2+8)+(2+8+9), game.getTotalScore()); } @Test public void last_strike_roll_should_return_last_frame_with_add_two_roll() { Game game = new Game(20); game.roll(10); game.roll(5); game.roll(4); game.roll(10); game.roll(10); game.roll(10); game.roll(10); game.roll(5); game.roll(4); game.roll(10); game.roll(10); game.roll(10); game.roll(8); game.roll(2); //多投算无效球 game.roll(3); Assert.assertEquals(10+5+4, game.getFrameScore(1)); Assert.assertEquals(5+4, game.getFrameScore(2)); Assert.assertEquals(10+10+10, game.getFrameScore(3)); Assert.assertEquals(10+10+10, game.getFrameScore(4)); Assert.assertEquals(10+10+5, game.getFrameScore(5)); Assert.assertEquals(10+5+4, game.getFrameScore(6)); Assert.assertEquals(5+4, game.getFrameScore(7)); Assert.assertEquals(10+10+10, game.getFrameScore(8)); Assert.assertEquals(10+10+8, game.getFrameScore(9)); Assert.assertEquals(10+8+2, game.getFrameScore(10)); //只有10局 Assert.assertEquals(0, game.getFrameScore(11)); Assert.assertEquals((10+5+4)+(5+4)+(10+10+10)+(10+10+10)+(10+10+5)+(10+5+4)+(5+4)+(10+10+10)+(10+10+8)+(10+8+2), game.getTotalScore()); } @Test public void last_strike_roll_should_return_last_frame_with_add_two_max_score_roll() { Game game = new Game(20); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(5); game.roll(5); game.roll(5); game.roll(4); game.roll(10); game.roll(5); game.roll(4); game.roll(10); game.roll(10); game.roll(10); game.roll(10); //多投无效球 game.roll(10); Assert.assertEquals(0+0, game.getFrameScore(1)); Assert.assertEquals(0+0, game.getFrameScore(2)); Assert.assertEquals(0+0, game.getFrameScore(3)); Assert.assertEquals(5+5+5, game.getFrameScore(4)); Assert.assertEquals(5+4, game.getFrameScore(5)); Assert.assertEquals(10+5+4, game.getFrameScore(6)); Assert.assertEquals(5+4, game.getFrameScore(7)); Assert.assertEquals(10+10+10, game.getFrameScore(8)); Assert.assertEquals(10+10+10, game.getFrameScore(9)); Assert.assertEquals(10+10, game.getFrameScore(10)); Assert.assertEquals((0+0)+(0+0)+(0+0)+(5+5+5)+(5+4)+(10+5+4)+(5+4)+(10+10+10)+(10+10+10)+(10+10), game.getTotalScore()); } @Test public void all_strike_roll_should_return_all_roll_with_last_two_max_score() { Game game = new Game(20); game.roll(10); game.roll(10); game.roll(10); game.roll(10); game.roll(10); game.roll(10); game.roll(10); game.roll(10); game.roll(10); game.roll(10); game.roll(10); //多投算无效球 game.roll(5); Assert.assertEquals(10+10+10, game.getFrameScore(1)); Assert.assertEquals(10+10+10, game.getFrameScore(2)); Assert.assertEquals(10+10+10, game.getFrameScore(3)); Assert.assertEquals(10+10+10, game.getFrameScore(4)); Assert.assertEquals(10+10+10, game.getFrameScore(6)); Assert.assertEquals(10+10+10, game.getFrameScore(7)); Assert.assertEquals(10+10+10, game.getFrameScore(8)); Assert.assertEquals(10+10+10, game.getFrameScore(9)); Assert.assertEquals(10+10, game.getFrameScore(10)); Assert.assertEquals((10+10+10)+(10+10+10)+(10+10+10)+(10+10+10)+(10+10+10)+(10+10+10)+(10+10+10)+(10+10+10)+(10+10+10)+(10+10), game.getTotalScore()); } @Test public void all_zero_roll_should_return_zero_score() { Game game = new Game(20); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); game.roll(0); Assert.assertEquals(0+0+0, game.getFrameScore(1));//0 Assert.assertEquals(0+0+0, game.getFrameScore(2));//0 Assert.assertEquals(0+0+0, game.getFrameScore(3));//0 Assert.assertEquals(0+0+0, game.getFrameScore(4));//0 Assert.assertEquals(0+0+0, game.getFrameScore(5));//0 Assert.assertEquals(0+0+0, game.getFrameScore(6));//0 Assert.assertEquals(0+0+0, game.getFrameScore(7));//0 Assert.assertEquals(0+0+0, game.getFrameScore(8));//0 Assert.assertEquals(0+0+0, game.getFrameScore(9));//0 Assert.assertEquals(0+0+0, game.getFrameScore(10));//0 Assert.assertEquals((0+0+0) + (0+0+0) + (0+0+0) + (0+0+0) + (0+0+0) + (0+0+0) + (0+0+0) + (0+0+0) + (0+0+0) + (0+0+0), game.getTotalScore()); } }
Game.java
package com.bijian.study.bowling; /** * 保龄球比赛,计算每局分数及总分 * 实现方法: * 采用rollScore数组记录比赛每次投球的分数,如果在一局当中,第一个球为满分的话,第二个球无需投,但在此数组中将其设置为0 * 采用rollScoreState数组记录rollScore对应的下标是真实的分数还是免投设置的值 * * @author BIJIAN */ public class Game { //满分值 public static int MAX_SCORE = 10; //记录比赛每次投球的分数,如果在一局当中,第一个球为满分的话,第二个球无需投,但在此数组中将其设置为0 private int[] rollScore; //rollScoreState记录rollScore对应的下标是真实的分数还是免投设置的值 private boolean[] rollScoreState; //num为2*实际比赛的局数 private int num; //投球的下标记数器 private int currentRoll; /* * 构造方法 */ public Game(int num) { this.num = num; rollScore = new int[num+4]; rollScoreState = new boolean[num+2]; this.currentRoll = 0; } /* * 投球 */ public void roll(int pin) { if(currentRoll >= num + 2) { return; } if(currentRoll > num && rollScore[currentRoll-1] == MAX_SCORE) { return; } rollScore[currentRoll++] = pin; if(pin == MAX_SCORE && currentRoll < num) { rollScore[currentRoll] = 0; rollScoreState[currentRoll++] = true; } } /* * 获取指定局次的分数 */ public int getFrameScore(int frame) { if(frame > num /2) { return 0; } int res = rollScore[(frame-1)*2] + rollScore[(frame-1)*2 + 1]; if(rollScore[(frame-1)*2] == MAX_SCORE) { res += rollScore[frame*2] + rollScore[frame*2 + 1]; if(rollScore[frame*2] == MAX_SCORE && rollScoreState[(frame-1)*2 + 1]) { res += rollScore[(frame+1)*2]; } }else if(res == MAX_SCORE) { res += rollScore[frame*2]; } return res; } /* * 获取比赛总分 */ public int getTotalScore() { int totalScore = 0; for(int i=1;i<=currentRoll/2;i++) { if(i <= this.num/2) { totalScore += getFrameScore(i); } } return totalScore; } }
相关推荐
5. **TDD实践** 文件名中的“测试驱动开发TDD培训讲义.ppt”、“TDD_测试驱动开发.ppt”和“测试驱动开发—1.1_测试驱动开发简介.ppt”很可能包含了关于TDD的详细讲解,涵盖了TDD的概念、原则、实践技巧以及如何在...
本项目是一个基于Java语言的TDD(测试驱动开发)实践应用设计源码,共包含49个文件,其中包括14个可执行文件、14个Java源代码文件、11个锁定文件、6个Gradle构建脚本文件、2个属性文件、1个Git忽略文件以及1个...
在C#的TDD实践中,还有一种称为"行为驱动开发"(Behavior Driven Development,BDD)的方法,它使用自然语言描述测试场景,使非技术人员也能理解。例如,我们可以使用SpecFlow这个工具,将Gherkin语法的测试场景转化...
在《测试驱动开发的三项修炼——走出TDD丛林》中,作者深入探讨了如何有效地实践TDD,以提高软件质量和开发效率。以下是关于TDD的三个关键修炼: 1. **理解测试金字塔**:测试金字塔是一个指导原则,它建议我们构建...
描述中提到的“java TDD测试开发流程”,意味着这些文档专注于Java语言的TDD实践,可能包括如何在Java项目中实施TDD的具体步骤。 mekito是一个流行的Java模拟框架,用于单元测试。它允许开发者模拟对象的行为,以便...
管理测试资产也是TDD实践中不可忽视的一部分。测试资产包括测试用例、测试脚本、测试数据等,这些都应当得到良好的组织和维护,以便在软件开发的全生命周期内重复使用。 在敏捷开发中,测试类型主要分为单元测试、...
本手册还提供了丰富的案例分析和实践指导,旨在帮助读者更好地理解和掌握UMTS-TDD仿真技术。例如,通过具体的场景设置,展示了如何在NS2环境中配置不同的网络参数、设置仿真场景以及分析仿真结果。此外,还包括了...
**TDD的基本流程**包括三个步骤: 1. **编写测试**:首先编写一个或多个测试用例来定义所需功能。 2. **运行测试**:运行这些测试,如果它们失败,则表明需要编写实际的代码。 3. **编写功能代码**:实现必要的功能...
### 使用PHPUnit进行TDD驱动开发 #### 一、引言 测试驱动开发(TDD, Test-Driven Development)是一种软件开发方法论,它要求在编写实际...在实际项目中,建议结合持续集成等最佳实践进一步提高代码质量和开发效率。
### 工程与技术实践-TDD中常见的10大反模式 #### 1. 引言 测试驱动开发(Test-Driven Development, TDD)是一种软件开发方法论,它要求在编写任何生产代码之前,先编写相关的测试用例。TDD的核心原则包括“先测试...
首先,TDD的基本流程包括三个主要步骤:红色(Red)、绿色(Green)、重构(Refactor)。在Ruby中,我们通常会使用RSpec或Minitest等测试框架来实现这一过程。 1. **红色阶段**:开发者编写一个失败的测试用例。这...
这本书以PDF英文版的形式提供,旨在帮助Java程序员深入理解和实践TDD方法论,提升软件开发的质量和效率。 测试驱动开发(TDD)是一种软件开发方法,强调在编写任何生产代码之前先编写测试。TDD的核心流程可以概括为...
在TDD实践中,功能测试是至关重要的一步,它涉及到将应用程序置于各种可能的使用场景中进行测试,以验证其行为是否符合预期。这不仅包括正常操作路径,也包括异常情况和边界条件。通过列出所有可能的应用场景,可以...
在TDD实践中,我们通常遵循以下步骤: 1. **编写测试**:首先,为待实现的功能编写一个失败的单元测试。这个测试应该清晰地表明期望的行为。 2. **运行测试**:运行测试,确保它如预期般失败,因为此时功能代码尚未...
在软件开发领域,TDD(Test-Driven Development,测试驱动开发)是一种编程实践,它强调先编写测试用例,再编写实现功能的代码。Laravel,作为一款流行的PHP框架,高度支持TDD,使得开发者能够更高效、更稳定地构建...