###如下部分为实现主体类

package ideal4j.imp.bigscreen.dailypattern.utils.test.tdd.bowlingGame;

/**

* @Author: Jolly

* @Date: 2019/11/5 0005 18:54

* @Project: demo

* @Version: 1.0

* @Description: 这里是基于TDD规则完成保龄球案例的一个实现类

*/

public class BowlingGame {

/**

* 第二次重构之前

*/

public void roll(int count) {

}

public int score() {

return 0;

}

/**

* 第二次重构,roll点同时计算得分

*/

private int score =0;

public void rollV2(int count) {

score += count;

}

public int scoreV2() {

return score;

}

/**

* 第四次重构,roll点同时计算得分

*/

private int rolls[] =new int[21];

private int currentRoll =0;

public void rollV4(int count) {

rolls[currentRoll++] = count;

}

public int scoreV4() {

int score =0;

for (int i =0; i

//考虑数组越界可能,从倒数第二个倒球数开始计算

//倒数第二轮,针对case出现一次STRIKE或者SPARE,后续为0,简化,不出现此种情况

if (i >=0 && i <18) {

//前18轮,针对case出现一次STRIKE或者SPARE,后续为0,实际中出现下一轮或者下两轮的得分计算

if (validateStrike(rolls[i])) {

score +=10 +rolls[i +1] +rolls[i +2];

}else if (validateSpare(rolls[i],rolls[i +1]) && (!validateStrike(rolls[i]) && (!validateStrike(rolls[i +1])))) {

score +=10 +rolls[i +2];

//出现spare,当前轮两次击球总数为10,第二次击球数已经计算过,跳过第二次,故此i++

i++;

}else {

score +=rolls[i];

}

}else if (i >=18 && i <20) {

//TODO 此处待验证,针对末尾一轮出现STRIKE或者SPARE的case

if (validateStrike(rolls[i])) {

score +=10 +rolls[i +1] +rolls[i +2];

return score;

}else if (validateSpare(rolls[i],rolls[i +1])) {

score +=10 + +rolls[i +2];

return score;

}else {

//score += rolls[i];

//最后一次出现Spare或者Strike,前十轮计算分数完结,后面多打的不用再额外累加.

return score;

}

}else {

;

}

}

return score;

}

/**

* 添加STRIKE的计算方法

*/

public Boolean validateStrike(int firstRollCount) {

if (10 == firstRollCount) {

return true;

}

return false;

}

/**

* 添加SPARE的计算方法

*/

public Boolean validateSpare(int firstRollCount,int secondRollCount) {

if (10 == firstRollCount + secondRollCount) {

return true;

}

return false;

}

/**

* @desc 此处省略中间N次重构过程,推演出最终一次重构方法

*/

//用来存放投掷击倒的数目

public int rollSummary[] =new int[21];

//数组下标

int ball =0;

//分数

int scoreSummary;

//记录当前是第几轮

int countRound =0;

//判断第一次投球,默认依次加载数据,第一次算作true

boolean firstThrow =true;

//当前一轮得分

private int currentRollSum =0;

/**

* @desc 用来判断是否是第一次投球

*/

private void judgeFirstThrow(int count) {

if (firstThrow) {

if (count ==10) {

countRound++;

}else {

firstThrow =false;

}

}else {

firstThrow =true;

countRound++;

}

}

/**

* @desc 添加分数 将分数添加到数组中

*/

public void rollSummary(int count) {

rollSummary[ball++] = count;

judgeFirstThrow(count);

}

/**

* @desc 返回这是第几轮

*/

public int getCurrentRound() {

return countRound;

}

/**

* @desc 当前轮的计算方法循环当前轮的次数

* a[0]赋值第一次击球firstThrow 然后下标自增一;判断第一次都不是击倒了10个

* 规则 保龄球一轮两个球 第一个全中就是之前的分数+10+后面两次投掷的分数

* 补中 两次一共击倒10个 之前的分数加两次击倒的10分加后面一次的的分数

*/

public int scoreSummary(int currentRound) {

int scoreSummary =0;

int ball =0;

for (int countRound =0; countRound < currentRound; countRound++) {

int firstThrow =rollSummary[ball++];

if (firstThrow ==10) {

scoreSummary = scoreSummary +10 +rollSummary[ball] +rollSummary[ball +1];

}else {

int secondThrow =rollSummary[ball++];

int currentRollSum = firstThrow + secondThrow;

if (currentRollSum ==10) {

scoreSummary = currentRollSum +rollSummary[ball] + scoreSummary;

}else {

scoreSummary = currentRollSum + scoreSummary;

}

}

}

return scoreSummary;

}

}

java 保龄球游戏开发_2019-11-08-基于TDD实现的java版本的保龄球规则(实体类)相关推荐

  1. Java手机游戏开发简明教程 (SunJava开发者认证程序员 郎锐)

    原文发布时间为:2008-07-30 -- 来源于本人的百度文章 [由搬家工具导入] Java手机游戏开发实例简明教程 (SunJava开发者认证程序员 郎锐) 一.手机游戏编写基础 1.手机游戏设计 ...

  2. Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(

    2019独角兽企业重金招聘Python工程师标准>>> 在Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(百搜技术) 在Java ME游戏开发中,经常需要进行碰撞检测 ...

  3. java手机游戏开发人才短缺

    java手机游戏开发人才短缺 文章来源:乐成数字通信学院   网址:(http://www.ldci.com.cn)     手机游戏的火爆指日可待,但目前,踏入这个领域并非遍地黄金.     手机游 ...

  4. 【Java 2D游戏开发(一)】GUI基础 / 显示出一个窗口

    显示窗口 游戏里所有的绘制操作都要在窗口的基础上进行,可以用JFrame来新建一个窗口 JFrame window = new JFrame();//新建窗口 window.setVisible(tr ...

  5. 碰撞检测碰撞Java简单游戏开发之碰撞检测

    最近研究碰撞检测碰撞,稍微总结一下,以后继续补充: 前言 未几之前在论坛上有人发贴,使用java编写的超级马里奥如何实现碰撞检测,笔者自己以前 也做过Tank大战.里面一样涉及到碰撞检测,翻翻U盘里的 ...

  6. java斗地主游戏开发 算法思路讲解

    上学期刚开学的时候我特别沉迷于斗地主 充了6块钱赢了30万豆 然后一夜之间破产 越想越气 然后我就有一个大胆的想法开发一个斗地主现在这个斗地主能在控制台上运行 本文主要讲解我在开发斗地主时研究的算法思 ...

  7. 经典按键java手机游戏_用诺基亚N95体验2G时代的JAVA手游,能正常运行吗?

    5G时代的来临似乎有点快,尽管5G在有些地区还没有完全普及开来,不少人还在用只支持4G.3G的手机,甚至还有在用2G手机.但不可否认的是,手机是否支持5G俨然成为当下消费者买手机的第一关注点. 而这篇 ...

  8. 经典按键java手机游戏_用诺基亚N95体验2G时代的JAVA网游,能正常运行么

    5G时代的来临似乎有点快,尽管5G在有些地区还没有完全普及开来,不少人还在用只支持4G.3G的手机,甚至还有在用2G手机.但不可否认的是,手机是否支持5G俨然成为当下消费者买手机的第一关注点. 而这篇 ...

  9. 《Java和Android开发实战详解》——1.2节Java基础知识

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  10. java 调用.net webservice axis2_java利用axis2调用.net写的webservice,传递自定义的实体类参数...

    利用axis2可以很方便的自动生成客户端代码,同时对复杂参数类型的传递也很方便,本文的服务端以.net开发,有一个自定义的实体类作为参数,客户端用java,简单介绍一下利用axis2的wsdl2jav ...

最新文章

  1. 解决启动httpd报: apr_sockaddr_info_get() failed for错误
  2. 计算机视觉编程——图像搜索
  3. android一天一次弹窗,Android自定义Toast,多次弹出时取消上次弹出,最后一次弹出为准...
  4. c语言实现python列表_用C语言实现python的扩展模块
  5. 关于Jquery中ajax方法data参数用法的总结
  6. 数据返回nan_NumPy 的 nan 如何理解?
  7. 【渝粤教育】国家开放大学2018年春季 0508-21T影视特技及后期合成 参考试题
  8. Maven添加本地依赖
  9. 5分钟学会Markdown语法,在GitHub上写出漂亮文本,提升别人阅读体验
  10. python背景怎么自定义铃声_Python 上课铃声的定时播放(具有较强的自我管理意识.jpg)...
  11. 分布式系统的现代消息传递
  12. Spotfire 修改标记及颜色
  13. 找工作杂谈(一)2019年春招复习资料总结
  14. ggplot绘制时间相关性折线图和面积图(2)
  15. 获取文件夹下的文件,包含子文件夹并复制文件
  16. Global Malmquist-Luenberger 指数分解及matlab应用,文后有网盘链接
  17. 北京华虹正式加入CPChain行业节点
  18. 前台传数据到后台的HelloWorld程序
  19. Linux只读文件系统
  20. frame-relay 学习笔记

热门文章

  1. 从低位开始取出长整型变量s中奇数位上的数依次构成一个新数放在t中
  2. Windows初级运维(一)文件查找DOS命令大全
  3. The Little Schemer 笔记(第一章)
  4. 嵌入式linux保存参数数据
  5. 刘寅立matlab数值计算案例分析 pdf,《MATLAB数值计算案例分析》源代码
  6. NYOJ 137 取石子(三)(教主神题)
  7. System State 转储分析案例一则
  8. locust 性能测试工具(V2.8.6)
  9. 大气科学领域必备的模型软件汇总丨WRF、WRF-CMAQ、WRF-Chem、WRF-Hydro、WRF DA、PMF、MCM、CAMx、SMOKE、CMIP6等
  10. matlab连接mysql有什么用_MATLAB连接SQLServer和MySql数据库