JavaScript实现保龄球计分:累加前序数组总和至下一数组首元素的方法
十瓶保龄球计分卡核心计分逻辑实现
你卡壳的索引访问逻辑说明
- 数组元素的索引从0开始计数,比如参考用的
frames = [[1, 2], [6, 4], [5, 4], [10, 0], [7, 2], [10, 0], [10, 0], [5, 2], [7, 0], [4, 4]],第一帧对应索引0,第二帧对应索引1,以此类推 - 取单个帧的两球得分总和,直接用嵌套方括号访问即可,比如索引为
i的帧,两球得分分别是frames[i][0]、frames[i][1],帧自身总和就是frames[i][0] + frames[i][1] - 要实现“当前帧总和 + 下一帧第一个数字”的需求,只需要通过
i+1的索引定位到下一帧,再取它的第一个元素:frames[i+1][0] - 关于你提到的点语法、方括号语法的选择:动态遍历索引的场景必须用方括号语法,因为点语法不能拼接动态变量值,比如写
frames.i会直接报错,合法写法是frames[i]
补中场景的计算示例(对应你举的[6,4], [5,4]的例子)
- 定位
[6,4]在frames数组里的索引是1,先算当前帧自身总和:6 + 4 =10 - 判断当前帧是补中(两球总分等于10且第一球不是全中10分),需要叠加奖励分:取下一帧(索引为2的
[5,4])的第一个元素,也就是5 - 这一帧最终计入总分的分值为
10 +5 =15,完全匹配保龄球补中场景的计分规则
基础计分实现参考代码
const frames = [[1, 2], [6, 4], [5, 4], [10, 0], [7, 2], [10, 0], [10, 0], [5, 2], [7, 0], [4, 4]]; let totalScore = 0; for (let i = 0; i < frames.length; i++) { // 最后一帧没有后续奖励,直接累加自身两球得分 if (i === frames.length -1) { totalScore += frames[i][0] + frames[i][1]; continue; } const currentFrameSum = frames[i][0] + frames[i][1]; // 补中场景:当前帧总分10,奖励下一个帧的第一个球得分 if (currentFrameSum === 10 && frames[i][0] !== 10) { totalScore += currentFrameSum + frames[i+1][0]; continue; } // 全中场景:当前帧第一球就是10,奖励后面两个球的得分 if (frames[i][0] === 10) { const nextFrameFirst = frames[i+1][0]; const nextFrameSecond = frames[i+1][1]; // 遇到连续全中的情况,第二个奖励值要取再下一帧的第一个球 const bonus = nextFrameSecond === 0 ? frames[i+2][0] : nextFrameSecond; totalScore += 10 + nextFrameFirst + bonus; continue; } // 普通非补中、非全中的帧,直接累加自身得分 totalScore += currentFrameSum; } console.log(totalScore); // 运行给定示例帧,输出结果为119
注意:遍历到靠近末尾的帧时,要做好索引越界判断,不要硬取超出数组长度的索引值导致代码报错
内容的提问来源于stack exchange,提问作者Rogan
相关产品推荐
相关产品推荐

