qicaisheng / bowling_scoring

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

需求

写一个程序给保龄球比赛计分

输入: 描述保龄球比赛成绩的字符串 (描述见下面) 输出: 整数分

计数规则: 每一局保龄球比赛,也就是我们这里的一行, 都有 10 格。格被称之为“frame”。 在每一格里, 玩家有两次机会试图击倒全部 10 个瓶。 如果第一次就击倒了全部 10 个瓶,这称之为“strike”。这一格就结束了。 这一格的分数等于 10 加上接下来两球击倒的瓶数的总和。 如果一格中的第二个球击倒了全部 10 个瓶,称之为“spare”。这一格就结束了。 这一格的分数等于 10 加上接下来一个球击倒的瓶数。 如果两个球之后,仍然有瓶子没有被击倒,那么这一格的分数就是两次击倒的瓶数的总和。 如果你在最后一格(第 10 格)拿到一个 spare,你就会得到一次额外的发球机会。 如果你在最后一格拿到了 strike,你就会得到两次额外的机会。 如果额外的机会击倒了全部的球,不会重复之前的流程,额外机会的分数只用来计算最后一格的分数。

游戏的分数为所有格分数的总和。

举例:

X 表示一个strike / 表示一个spare

  • -表示一个miss
  • | 表示一局的分界线
  • ||之后的字符表示最后一局的额外机会

十局十个strike,两个额外机会都是strike。 每局的分数 = 10+接下来两球的分数 = 10 + 10 + 10 = 30 总共的分数 = 10局 X 30 = 300

9-|9-|9-|9-|9-|9-|9-|9-|9-|9-|| 每局第一个球击倒了9个瓶,第二个球一个没击倒,全都miss了。 没有额外机会 每一局9分 总共的分数 = 10局 X 9 = 90分

5/|5/|5/|5/|5/|5/|5/|5/|5/|5/||5 每局第一个球击倒了5个瓶,第二个球击倒了剩下的五个,得到了一个spare。 一个额外机会,击倒了五个瓶。 每局的分数 = 10 + 下一个球的分数 = 10 + 5 = 15 总共的分数 = 10局 * 15 = 150

X|7/|9-|X|-8|8/|-6|X|X|X||81 Total score == 167

思考

  • 这个题目可能不太适合作为代码设计的题目

    • 如果作为代码设计练习,这个里面名词还稍微好提取一点,但是动词就获取分数了。初始练习的学员是很难抽象出这些概念
    • 里面的Frame 计分会依赖后续的Frame, 有的是一个球有的是两个球,学员就算抽象出来了Frame 还有Ball, 但是计分还是很难处理,那个逻辑很难跟面向对象设计关联起来
    • 这个题目没有太多的扩展性,没有很好体现面向对象设计相比面向过程设计的好处
    • 这个题目没有引入太多的变化,促使学员改动代码,没法让学员体会到面向对象设计的好处
  • 参考https://ronjeffries.com/xprog/articles/acsbowling/ 里的设计不一定是好的设计

    • Frame 依赖于前后多次的throws。
    • 主要是过度设计,这是一个计分规则的代码实现,这些规则是非常固定的,这么设计没有太多体现设计的优势

来源

About


Languages

Language:Java 100.0%