You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:45:38