Python:带有2个通配符的拼字游戏:查找单词组合和分数:函数返回错误结果



我正在尝试编写一个具有两个功能的拼字游戏应用程序(主词匹配一个,第二个用于评分(。将其实现为两个.py文件,但似乎无法使查询正常工作。我们使用sowpods文件作为有效拼字游戏单词的参考。

作为次要目标,我还想使这项工作适用于总共2个(最多2个(通配符(共7个(。

这是一个得分函数,它接受一个单词并返回的得分(作为总分(

def score_word(word_low):
scores = {"a": 1, "c": 3, "b": 3, "e": 1, "d": 2, "g": 2,
"f": 4, "i": 1, "h": 4, "k": 5, "j": 8, "m": 3,
"l": 1, "o": 1, "n": 1, "q": 10, "p": 3, "s": 1,
"r": 1, "u": 1, "t": 1, "w": 4, "v": 4, "y": 4,
"x": 8, "z": 10}
total = 0
for letter in word_low:
total = total + scores[letter]
return total
#valid_words.append([total, word_low])

这是一个主要功能,它将一排字母作为输入,并返回有效单词组合的降序(按分数排序(。还有的总组合

from wordscore import *
def run_scrabble(rack):
rack_low = rack.lower()
rack_letters = list(rack_low)
valid_words = []

with open("sowpods.txt","r") as infile:
raw_input = infile.readlines()#[0:1000]
data = [datum.strip('n') for datum in raw_input]

for word in data:
word_low = word.lower()
for letter in word_low:
if letter in rack_letters:
rack_letters.remove(letter)
elif '*' in rack_letters:
rack_letters.remove('*') 
elif '?' in rack_letters:
rack_letters.remove('?')
else:
pass 
else:
valid_words.append([score_word(word_low), word_low])  

valid_words.sort(reverse = True)

for entry in valid_words:
score = entry[0]
word_low = entry[1]
print((score, word_low))
print("Total number of words:", len(valid_words))

我被困在单词匹配部分,我认为这是问题所在。

测试样品架:"野兔">

预期输出

(7, 'rhea')
(7, 'hear')
(7, 'hare')
(6, 'reh')
(6, 'rah')
(6, 'her')
(6, 'hae')
(5, 'he')
(5, 'ha')
(5, 'eh')
(5, 'ah')
(3, 'era')
(3, 'ear')
(3, 'are')
(2, 're')
(2, 'er')
(2, 'ea')
(2, 'ar')
(2, 'ae')
Total number of words: 19

实际输出:看起来像是完整字典中的最大分数排序列表

(51, 'razzamatazzes')
(50, 'razzmatazzes')
(49, 'razzamatazz')
(49, 'pizzazzy')
(48, 'razzmatazz')
(47, 'quizzifications')
(47, 'pizzazzes')
(47, 'pazzazzes')
(47, 'bezzazzes')
...
...

在解决通配符问题之前,我需要解决单词匹配查询的问题。任何帮助都将是了不起的

我认为问题可能是您正在使用。。。否则就错了。

else之后的代码总是被执行,因为你总是以正常的方式离开for循环。我想您想键入break而不是pass。而且你正在永久删除这封信。所以这样做吧。

...
for word in data:
word_low = word.lower()
temp_rack_letters = rack_letters.copy() # keep the original
for letter in word_low:
if letter in temp_rack_letters :
temp_rack_letters .remove(letter)
elif '*' in temp_rack_letters :
temp_rack_letters .remove('*') 
elif '?' in temp_rack_letters :
temp_rack_letters .remove('?')
else:
break # You want to exit the loop if letter dont match
else:
valid_words.append([score_word(word_low), word_low])
...

这也是为了。。。否则,语法不太可读,正如你所看到的,我很容易犯错误和错误,所以要小心使用它

HTH-

最新更新