Scrabble游戏问题:通配符(?和*)需计0分而非匹配字母得分
解决Scrabble通配符(?/*)计0分的问题
问题根源
当前代码的核心问题在于run_scrabble函数计算得分时,将匹配后的完整单词传入score_word函数,而非原始的rack字符。这导致通配符?和*被替换成对应字母后,按字母本身的分值计算,而非0分。
比如输入a?*生成单词AND时,原逻辑会计算A(1)+N(1)+D(2)=4,但实际需求是A(1)+?(0)+*(0)=1。
解决方案
需要修改两个部分的逻辑:
- 调整
run_scrabble中传递给score_word的参数,传入原始rack而非匹配后的单词; - 更新
score_word函数,基于原始rack的字符计算得分——通配符计0分,普通字母按对应分值计算。
代码修改示例
1. 修正run_scrabble的得分计算逻辑
假设原代码中向valid_words添加元素的逻辑是:
valid_words.append((matched_word, score_word(matched_word)))
将其修改为传入原始rack:
valid_words.append((matched_word, score_word(rack)))
2. 更新score_word函数
替换原有的按匹配单词计分逻辑,改为遍历原始rack的每个字符:
def score_word(rack): # Scrabble官方字母分值表 letter_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 } total_score = 0 for char in rack.upper(): if char in ('?', '*'): total_score += 0 else: total_score += letter_scores.get(char, 0) return total_score
验证效果
- 调用
run_scrabble('*?')时,rack中的两个字符都是通配符,得分计算为0+0=0,符合预期; - 输入
a?*时,得分计算为1+0+0=1,与需求一致。
内容的提问来源于stack exchange,提问作者gaurav8936
相关产品推荐
相关产品推荐

