PHP Scrabble代码问题求助:计算“Harambe”仅得3分
排查Scrabble计分功能的常见问题
嘿,我来帮你揪出这个计分错误的问题——毕竟我之前开发类似功能时也踩过不少坑!你说计算“Harambe”只返回3分,这明显不对(正确分值应该是14分),大概率是遗漏了下面这些关键逻辑:
最可能的问题:字母大小写未统一处理
Scrabble的计分是不区分大小写的,但如果你的分值映射数组(比如存的是小写字母的分值),而代码里没有把输入单词转成统一大小写,那像H、R、M这些大写字母就找不到对应的分值,会被默认计0分。这样一来,只有a、a、e这三个小写字母能拿到1分,总和刚好是3分!
其他可能的遗漏点
- 分值映射表错误或不完整:比如你的数组里漏写了
h、m、b这些字母的分值,或者把它们的分值设成了0,导致这些字母没贡献分数。 - 循环逻辑漏洞:比如你只遍历了单词的前几个字符,或者循环条件写错了(比如用了错误的索引范围),导致只计算了部分字母的分值。
- 未处理非字母字符?:不过这个单词里没有特殊字符,这个可能性较低,但如果你的代码有过滤逻辑,也可能误删了有效字母。
快速排查步骤
- 统一大小写:在计算前把输入单词转成全小写(或全大写),比如:
$word = strtolower($word); - 打印调试每个字母的分值:在循环里输出每个字符对应的分值,看看哪些字母没拿到正确分数:
foreach(str_split($word) as $char) { $score = isset($scores[$char]) ? $scores[$char] : 0; echo "字符 $char 的分值:$score\n"; } - 核对官方分值表:确认你的分值数组是正确的,Scrabble官方分值里:
h=4、m=3、b=3、r=1,这些别写错。 - 检查循环完整性:确保遍历了单词的所有字符,推荐用
foreach(str_split($word) as $char)这种方式,避免索引错误。
正确的示例代码片段
参考这个实现,应该能得到正确结果:
function calculateScrabbleScore($word) { // Scrabble官方分值映射 $scores = [ 'a' => 1, 'b' => 3, 'c' => 3, 'd' => 2, 'e' => 1, 'f' => 4, 'g' => 2, 'h' => 4, 'i' => 1, 'j' => 8, 'k' => 5, 'l' => 1, 'm' => 3, 'n' => 1, 'o' => 1, 'p' => 3, 'q' => 10, 'r' => 1, 's' => 1, 't' => 1, 'u' => 1, 'v' => 4, 'w' => 4, 'x' => 8, 'y' => 4, 'z' => 10 ]; $totalScore = 0; $lowercaseWord = strtolower(trim($word)); // 统一转小写并去除首尾空格 foreach(str_split($lowercaseWord) as $char) { // 只累加存在于分值表中的字母分数 if(array_key_exists($char, $scores)) { $totalScore += $scores[$char]; } } return $totalScore; } // 测试Harambe:4+1+1+1+3+3+1 = 14 echo calculateScrabbleScore("Harambe"); // 输出14
内容的提问来源于stack exchange,提问作者Engjëll Bislimi
相关产品推荐
相关产品推荐

