JS拼字游戏(Scrabble)计分功能开发问题求助
JavaScript拼字游戏(Scrabble)问题修复
问题分析
你遇到两个核心问题:
- 单词得分计算错误:比如
hello应得8分,但当前代码无法正确累加字母分值 - 函数返回
[object Object]而非实际得分
代码错误点拆解
1. loopLetters函数的计算逻辑错误
- 循环范围错误:
i <= word.length会导致循环多执行一次,最后取到word[word.length](值为undefined),既输出无效的undefined,还会让累加逻辑出错 - 累加方式错误:
result += [word[i]]是将数组与数字相加,触发字符串拼接,导致返回0hello这类错误结果,正确做法应该是取对应字母在scores中的分值累加 - 未处理大小写:如果输入大写字母,会匹配不到
scores中的小写键,需要统一转小写
2. scrabble函数的逻辑混乱
- 参数判断错误:当前
scrabble接收的是loopLetters返回的得分(数字),但函数里判断"非字符串就返回无效",完全颠倒了逻辑 - 返回值错误:返回时使用
singleValue(即整个scores对象),拼接成字符串就会显示[object Object],应该使用计算后的得分值 - 输入验证逻辑冗余:多个
else if重复判断,且遗漏了空字符串、非字母字符的全面验证
修复后的代码
const scores = { a: 1, e: 1, i: 1, o: 1, u: 1, l: 1, n: 1, r: 1, s: 1, t: 1, d: 2, g: 2, b: 3, c: 3, m: 3, p: 3, f: 4, h: 4, v: 4, w: 4, y: 4, k: 5, j: 8, x: 8, q: 10, z: 10 } const notValid = 'Input not valid:' const validWord = 'Great, your point is:' // 计算单词得分 function calculateScore(word) { let total = 0; // 循环范围修正为i < word.length for (let i = 0; i < word.length; i++) { const char = word[i].toLowerCase(); // 只累加存在于scores中的字母分值 if (scores[char]) { total += scores[char]; } } return total; } // 验证输入并返回结果 function scrabble(input) { // 验证输入是否为有效字符串(非空、仅字母) if (typeof input !== 'string' || !/^[a-zA-Z]+$/.test(input)) { return `${notValid} 0`; } const score = calculateScore(input); return `${validWord} ${score}`; } // 测试 console.log(scrabble('hello')); // 输出: Great, your point is: 8 console.log(scrabble('Hello')); // 输出: Great, your point is: 8 console.log(scrabble('123')); // 输出: Input not valid: 0
修复说明
- 将得分计算与输入验证拆分到不同函数,逻辑更清晰
- 正则表达式
/^[a-zA-Z]+$/统一验证输入是否为纯字母字符串,替代冗余的多个判断 - 计算得分时统一转小写,兼容大小写输入
- 修正循环范围,避免取到
undefined scrabble函数现在先验证输入有效性,再计算得分并返回正确的结果字符串
内容的提问来源于stack exchange,提问作者Shylan
相关产品推荐
相关产品推荐

