保龄球计分算法

Posted by hcy on October 27, 2020

保龄球计分算法

题目描述:

​ 保龄球前面个会摆放10个球瓶,计分规则如下:

​ 如果第一球就把全部的球瓶击倒,所得的分数是10分再加下两球的倒瓶数;如果第一球没有全部击倒,就要再打一次,如果两次能把全部球瓶击倒,则分数是10分再加下一球的倒瓶数;如果两次加一块没有击倒全部球数,则分值为两次的倒瓶数和。

​ 请你写一个记分牌程序,统计每次的得分。

​ 可以参考下保龄球-百度百科介绍的计分规则部分,题目和真实场景下是相同的。

保龄球项目是根据运动员投球所击倒的球瓶数量来计算得分,按运动员在规定局数中所得分数的多少决定胜负。记分规则如下:每局比赛由10格组成,前9格中运动员每格有两次投球机会:(1)如该格第一次投球击倒全部10个球瓶,则不需第二次投球,该格计为全中,该格全中所击倒的瓶数(10分)加随后两次投球所击倒的瓶数为该格所得的分数;(2)若该格第一次投球未能击倒全部10个球瓶,则可投第二次,若第二次投球将剩余的球瓶全部击倒,则该格计为补中,该格两次投球所击到的瓶数(10分)加下一次投球所击倒的瓶数为该格所得的分数;(3)若该格两次投球未能将10个球瓶全部击倒,则称为失误,该格得分为两次投球所击倒的全部瓶数。在第10格中,如果在第一或第二次投球中出现了全中或补中,则运动员可进行第三次投球,该格所得分数为该格实际击倒的球瓶数量。按上述规定将运动员10格所得分数进行累计,即为该局得分

分析:

​ 分析此问题,首先一次击球后是无法判断出成绩的,因为一次击球如果全部击倒,则会奖励下两球的倒瓶数,如果两次能全部击倒,则会奖励下一次的倒瓶数,如果两次加一起都没有全部击倒,则直接计算分值。

所以有如下规则:

  • 如果第一球 = 10,则分数等于 第一球 + 第二球 + 第三球

  • 如果第一球 + 第二球 = 10,则分数等于 第一球 + 第二球 + 第三球

  • 如果第一球 + 第二球 < 10,则分数等于 第一球 + 第二球

​ 所以将每次的分值记录下来,等数据满足条件能够计算时再开始计算,并移除已经计算的部分。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Score {

	//存储分数的列表
	private List<Integer> scores = new ArrayList<>();

	//存储每次击球得分的列表
	private List<Integer> list = new LinkedList<>();

	public void addScore(int score) {
		//将最新数据添加到列表
		list.add(score);
        //尝试计算当前分数
		compute();
	}

	public List<Integer> getCurrentScore() {
		return new ArrayList<>(scores);
	}


    //最少两条记录才能计算分值,一条记录是无法计算分值的
	private void compute() {
		//如果分值1 + 分值 2 < 10,可以直接计算出分值
		if (list.size() == 2 && list.get(0) + list.get(1) < 10) {
			scores.add(list.get(0) + list.get(1));
			list.clear();
            //如果当前分值列表大小>=3,要么分值1 = 10,要么分值1+分值2=10,只有这两种情况
            //因为加一起小于10的情况在列表长度等于2时已经被计算了
		} else if (list.size() >= 3) {
			Integer first = list.get(0);    //第一次球的得分
			if (first == 10) {            //如果第一次为10分,第一轮就只会投一次,叠加后面两次的分数
				scores.add(list.get(0) + list.get(1) + list.get(2));
				list.remove(0);
				compute();            //计算结果后,剩余两个,还有可能可以计算
			} else {
				scores.add(list.get(0) + list.get(1) + list.get(2)); //此时分值1+分值2 = 10,奖励分值3的值
				list.remove(0);
				list.remove(1);
			}
		}
	}

}


转载请注明出处:https://www.huangchaoyu.com/2020/10/27/保龄球计分算法/