创建一个程序,给定一条美国十瓶保龄球的有效滚动序列,生成游戏的总得分。简单总结一下这种保龄球的得分方式: 一场游戏,每轮允许投2个球,10轮为1局。 1、每次投球击倒一个木瓶得1分。投完一轮分别将两个球的“所得分”相加,为该轮的“应得分”。累计为全局的总分。 2、若第一球将全部木瓶击倒成为“全中”,用“X”表示,直接进入下一轮,按规则规定,本轮击倒瓶数加下两次投球寄到瓶数为该轮的“所得分”。 3、若第一个球只击倒部分木瓶,第二球将本轮剩下的木瓶全部击倒成为“补中”。用“/”表示,本轮击倒瓶数加下一次投球击倒瓶数为该轮的“所得分”。 4、若第10轮第一球全中时,继续投两个奖励球结束全局。这两个球的所得分应累计在该局总分内。 5、若第10轮为补中时,继续投一个奖励球结束全局。这个球的所得分累计在该局总分内。 6、一局满分为300分。 应当适当地处理无效输入,注:“X”表示全中,“/”表示补中,“-”表示未命中,空格不能作为分隔符 可有可无。
- X X X X X X X X X X X X (12rolls: 12strikes) = 10frames*30points=300
- 9- 9- 9- 9- 9- 9- 9- 9- 9- 9- (20rolls:10 pairs od 9 and miss)=10 frames* 9 points = 90
- 5/ 5/ 5/ 5/ 5/ 5/ 5/ 5/ 5/ 5/5 (21rolls:10pairs of 5 and spare,with a final 5) = 10frames * 15 points = 150
function getScore(str) {
var arr = str.split(' ')
for (var i = 0, score = 0; i < 10; i++) {
// 1.本轮全中
if (arr[i].length === 1) {
if (arr[i + 1].length === 1) { // 下一轮全中
// 还需取下下一轮的第一个球,可能:X 9 -
score += 10 + 10 + calcScore(arr[i + 2][0])
} else { // 下一轮不全中
score += 10 + calcScoreAll(arr[i + 1])
}
}
// 2.本轮补中
else if (arr[i].indexOf('/') !== -1) {
if (arr[i].length === 3) { // 第10球补中时,奖励的球记录在一起的 5/5
arr[i + 1] = arr[i][2]
arr[i] = arr[i].slice(0, 2)
}
score += 10 + calcScore(arr[i + 1][0])
}
// 3.本轮存在miss
else {
score += Number(arr[i].replace(/-/g, ''))
}
}
console.log(score)
}
// 处理单个分数中的符号
function calcScore(value) {
switch (value) {
case 'X':
return 10
case '-':
return 0
default:
return Number(value)
}
}
// 计算不全中时的分数
function calcScoreAll(str) {
if (str.indexOf('/')) {
return 10
} else {
return Number(arr[i].replace(/-/g, '')) // 删除非数字-
}
}
var str = '-- -- -- -- -- -- -- -- -- --'
var score = 0
getScore(str)