首页 > 解决方案 > 在python中代码拼字游戏作弊器时添加通配符

问题描述

我正在尝试向我的拼字游戏架添加一个通配符(每个字符一个:一个 * 和一个?,总共最多两次),可以更改为任何单个字符。如果我输入 bo?*、* 和 ? 应该是 a~z 并且所有可能的单词都需要与 sowpods.txt 中的单词进行比较。我应该如何编辑此代码?:) 现在我的代码在没有通配符的情况下工作。提前致谢!

++ 当我打印结果时,它显示为 (10, 'bomb')。我怎样才能让它像(10,炸弹)?剥离或更换不起作用。

import sys
import string

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}

# Get the Scrabble rack from the command line.
if len(sys.argv) < 2:
    print("no rack error.")
    exit(1)

rack = sys.argv[1]
rack_low = rack.lower()

# Turn the words in the sowpods.txt file into a Python list.
with open("sowpods.txt","r") as infile:
    raw_input = infile.readlines()
    data = [datum.strip('\n') for datum in raw_input]

# Find all of the valid sowpods words that can be made
# up of the letters in the rack.
valid_words = []

for word in data:
    word_low = word.lower()
    candidate = True
    rack_letters = list(rack_low)
    for letter in word_low:
        if letter not in rack_letters:
            candidate = False
            break # No need to keep checking letters.
        else:
            rack_letters.remove(letter)
    if candidate == True:
        # Get the Scrabble scores for each word.
        total = 0
        for letter in word_low:
            total = total + scores[letter]
        valid_words.append([total, word_low])

# Print the valid words, sorted by Scrabble score.

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))

标签: pythonpython-3.x

解决方案


我将假设所有空白图块都由相同的字符“*”表示。我不知道你为什么想要两个不同的,但如果你这样做,你可以适当地修改我的解决方案。

用一个函数和一个更短的 for 循环替换你的 for 循环(保持其他所有内容相同):

def can_make_word(word):
    rack_letters = list(rack_low)
    for letter in word_low:
        if letter in rack_letters:
            rack_letters.remove(letter)
        elif '*' in rack_letters:
            rack_letters.remove('*') 
        else:
            return False
    return True

for word in data:
    word_low = word.lower()
    if can_make_word(word_low):
        # Get the Scrabble scores for each word.
        total = 0
        for letter in word_low:
            total = total + scores[letter]
        valid_words.append([total, word_low])

打印输出中出现单引号是因为您正在打印一个元组。它们不是字符串中的字符,因此您不能将它们剥离。如果您将打印语句(删除一组括号)重写为:

print(score, word_low)

您将10, bomb在输出中看到而不是(10, 'bomb'). 这是因为当 Python 打印一个元组时,它通过调用它的 str() 函数来格式化每个元素,该函数在单引号内显示​​字符串。您可以在 IDLE 中使用它或在交互式 Python 会话中查看它是如何工作的。


推荐阅读