首页 > 编程语言 >保龄球计分程序

保龄球计分程序

时间:2023-04-01 15:44:51浏览次数:35  
标签:10 ball 计分 int 程序 pins 保龄球 public

  总结:从保龄球计分程序中,我对重构有了一点小小的认知,即:把复杂的程序简洁化,把一个具有多个功能的函数拆分成多个函数(如果可以的话,尽可能的拆分一个具有明显功能的类出来),而且为了保障代码的可行性,每进一步对程序功能的添加都需要进行功能的全方位测试,避免到最后程序出现一些不可控的错误。

实验过程:

保龄球计分程序的需求:

1:首先调用一个函数(add()),来记录击倒的保龄球个数。

2:再次调用一个函数(itsCurrentFrame(第几局)),表明我查看第几局的分数。

3:最后查看总分数,调用(score())函数。

保龄球计分程序的实现:

1:根据保龄球的特点可以把程序分为两个类:

 1.1,计算当前所在的轮数。

  1,首先用户传过来一个参数(需要编写一个add(int pins)的函数),这时需要进行判断(传过来的pins是否为10,因为一轮投掷两次,为了方便计数,引入变量firstThrow,默认true,如果为false,证明这是第二次,该轮结束;)

  代码:

    public void add(int pins){

      itsScorer.addThrow(pins);  //调用另一个类的函数(Scorer)来进行计分

      adjustCurrentFrame(pins)();  //把判断的任务交给adjustCurrentFrame函数去操作。

}

  public void addjustCurrentFrame(int pins){

  //lastBallInFrame作用是判断投掷的是第几次(有两种可能,1:firstThrow=true且pins==10 2:firstThrow=false),如果满足其中的任意一项,则当前轮+     1,且最大值为10,

    if (lastBallInFrame(pins)){

      advanceFrame();  //表示当前轮+1

    }else{

      firstThrow=false;

    }

}

public boolean lastBallInFrame(int pins){

  return (strike(pins) || !firstThrow);  //strike()表示firstThrow=true且pins==10,这句话的意思是但凡有一个对,返回true

}

public boolean strike(int pins){

  return (firstThrow && pins==10)  //这俩都要满足,否则返回false

}

这时需要一个过渡函数来连接计算积分的类(Scorer),需要创建Scorer对象     aprivate Scorer itsScorer

public int score(){

  return scoreForFrame(itsCurrentFrame);  //当用户调用该函数时(不带参),他将返回最后一轮的积分(总积分)

}

public int scoreForFrame(int theFrame){

  return itsScorer.scoreForFrame(theFrame);  //这时候就需要计分类闪亮登场啦!!  在登场之前,还需要添加一个函数,因为你只传过去一个当前轮可不行,还得传击倒的保龄球数,不然怎么计算全中,补中,还有不中呢?对吧 ^~^,因此,故在第一个函数add()增添另一个函数。

}

变量有:private int itsCurrentFrame=0;  private boolean firstThrow=true;   private Scorer itsScorer;

整体代码为:

 

 1.2,计算每一局的比分(Scorer)

此时传过来的值有两个,分别为击倒的保龄球数和需要查询的当前轮,这个类需要实现的东西为:每一轮加上投掷所击倒的分数+上一轮所得分数

1:因此我们可以主要定义为两个主要接收参数的函数即:addThrow()和scoreForFrame(),添加每轮击倒的保龄球数会涉及到投掷的次数,我们按最大的投掷次数来计算即:21次

代码:

定义变量:private int[] itsThrows=new int[21];  private int ball=0;  private int itsCurrentThrow=0;

public int  addThrow(int pins){

  itsThrows[itsCurrentThrow++]=pins;  //给每一轮添加所击倒的保龄球数,进而让scoreForFrame函数判断是全中,补中,还是不中

}

public int scoreForFrame(int theFrame){

  int ball=0; int score=0;

  for (int itsCurrentFrame=0;itsCurrentFrame<theFrame){  

    if (strike()){  //strike()表示判断当前传过来的值是否是10,

      score+=10+nextTwoBallsForStrike();  //nextTwoBallsForStrike()表示加上下两次击倒的保龄球数

      ball++;                //表示增加一次投掷,

    }else if (spare()){  //spare()表示的是两次投掷超过击倒10个保龄球

      score+=10+nextBallForSpare();  //表示加上下一个击倒的保龄球数(即:第三次)

      ball+=2;            //补中,增加两次投掷

    }else{

      score+=twoBalls();  //表示两次投掷都没有超过击倒10个保龄球

      ball+=2;        //不中,增加两次投掷

    }

  }

return score;

}

public boolean strike(){

  return (itsThrows[ball]==10);  //判断传过来的pins是否为10

}

public int nextTwoBallsForStrike(){

  return itsThrows[ball+1]+itsThrows[ball+2];    //表示全中则加上下一次和再下一次的击倒的保龄球数

}

public boolean spare(){

  return (itsThrows[ball]+itsThrows[ball+1]>=10);    //如果两次投掷相加大于等于10则断定为补中

}

public int nextBallForSpare(){              //补中则加上下一次的,也即是第三个值

  return itsThrows[ball+2];

}

public int twoBalls(){

  return itsThrows[ball]+itsThrows[ball+1];      //不中的情况则是两个值相加就是所得分数

}

整体代码:

 

还有最重要的一点:不要忘记写测试,每进行一个步骤都要进行测试

  

标签:10,ball,计分,int,程序,pins,保龄球,public
From: https://www.cnblogs.com/zygdxjz/p/17278696.html

相关文章

  • 菜单计价程序1-3
    菜单计价程序-1一丶代码:1.菜品类点击查看代码classDish{Stringname;intunit_prince;intgetPrice(intportion){intpeic=0;switch(portion){case1:peic=(int)unit_prince;break;cas......
  • 软件测试经验与教训之测试手段与程序错误分析
    人们可以做的所有测试都可以分为5个方面进行描述:。测试员:进行测试的人。如用户测试需要站在用户,商家,供应商等不同角色的角度进行测试。覆盖率:测试了哪些内容。如功能测试中,要测试每个功能,接口测试中测试每个接口。潜在问题:测试的原因(要测试什么风险)如测试极值问题。活动:如何测......
  • php抽奖程序,奖品可设置数量,中奖概率可调节
    <?php$prizes[]=['probability'=>0.1,'total'=>1,'name'=>'一等奖'];$prizes[]=['probability'=>1,'total'=>1,'name'=>'二等奖']; $prizes[]=[......
  • android - AsyncTask 完成后重新启动完整的 Android 应用程序
    我正在编写的应用程序会检查/sdcard下的目录中是否有特殊的ZIP文件,如果没有则开始下载并解压缩它。下载和解压缩工作得很好,即使是子目录。但我需要在完成后重新启动该应用程序-但这是行不通的。起初我有一个特殊的Activity“PreMainActivity.java”只是为了重启目的:imp......
  • 微信小程序登录、获取用户信息的流程及实现
    微信小程序登录、获取用户信息的流程及实现本篇文章将通过以下三步,让你了解到小程序登录、和用户信息获取的微信生态变迁,和流程上前后端技术实现。小程序登录流程小程序获取手机号小程序获取头像昵称小程序登录小程序登录是通过微信官方提供的登录能力,获取微信提供的用......
  • 计算机流水线在正常程序中的体现(效果可视)
    众所周知,流水线技术对于软件开发人员不是可见的(visiable),毕竟已经在在机器语言之下,是组成机器语言的基本逻辑 但今天我就带领大家看看我新发现的结果,那就是流水线的可视效果,包括流水线预测技术的侧面体现,当然也是可见的 首先我先声明一下需要的基础,需要懂16位以及32......
  • Ubuntu GDB调试程序
    GDB命令//gdb命令$gdb-p87746//打印所有的线程信息(gdb)infothread//切换到第2个线程(gdb)thread2//bt可以打印函数堆栈,却无法看到函数参数,跟pstack命令一样(gdb)bt//打印第三帧信息,每次函数调用都会有压栈的过程,而frame则记录栈中的帧信息(gd......
  • 程序设计应用2023-04-01
    数据库配置#Database#https://docs.djangoproject.com/en/4.1/ref/settings/#databasesDATABASES={  'default':{    'ENGINE':'django.db.backends.sqlite3',    'NAME':BASE_DIR/'db.sqlite3',  ......
  • 《程序员修炼之道:从小工到专家》读后感(四)
    一个程序很有可能出现意想不到的异常,将异常用于异常的问题,通过异常处理,例程和他们的调用者被调用者更紧密的耦合在一起怎样配平资源大多数时候,资源使用遵循一种可预测的模式,分配,使用,解除其分配。对于一次不需要不只一个资源的例程,可以对资源分配的基本模式进行扩展的:以与资源分......
  • 《程序员修炼之道-从小工到专家》阅读笔记
    《程序员修炼之道》是一本经典的软件工程领域的书籍,它不仅提供了实用的编程技巧,更是给程序员们提供了一些关于软件工程师的思考和生活方式的指导。以下是我对这本书的阅读笔记:务实态度:良好的程序员应该始终保持务实态度。在编写代码时,应该根据实际需求,采用简单明了的方法来解决......