在解释之前,如果您玩过在线游戏 Wordle,这会更有意义,因为我正在尝试使用 Python 3 中的 AI 插件重新创建它。
我让玩家输入一个 5 个字母的字符串,该字符串被拆分为一个 5 个项目列表,以及一个代表单词的 5 个字母字符串,该字符串被拆分为一个 5 个项目列表。
当检查猜测中的“黄色”字母时,我的程序将用“0”或“1”替换单词和猜测中相同的字符,这里使用这些代码:
if guess[y] == word[y]:
results[y] = "Green"
word[y] = 1
guess[y] = 0
和
if word.count(character_x) > 0:
results[y] = "Yellow"
word[word.index(guess[y])] = 1
guess[y] = 0
正是这行代码:word[word.index(guess[y])] = 1,这给我带来了一些问题。 这只会给我带来大约五分之二的问题,但是这段代码在程序过程中运行了 6 次,而且每次几乎都会崩溃。它给了我错误消息:
IndexError:列表索引超出范围
有时:
值错误:0 不在列表中
我没有识别出任何错误消息,所以,当然,我在这里查找了它们。所有答案似乎都不适用于我的问题,并且调试实际上没有任何作用。它似乎只是随机损坏,我不知道为什么,但它发生得太频繁,不容忽视。
如果有人有任何想法,请告诉我,我已经快要完成这个项目了。
假设您正在尝试实现类似于 wordle 的功能,则问题是由您替换
word
和 guess
列表中的字符的方法引起的。当您在第一个代码块中设置 word[y] = 1
和 guess[y] = 0
时,您正在更改原始列表。因此,在后续迭代中,条件 word.count(character_x) > 0
可能会失败,因为 1
和 0
是原始单词中的无效字符(假设像 worldle 一样,该单词只包含英文字母 😀)
出现
IndexError: list index out of range
是因为 word.index(guess[y])
正在尝试查找已被 0
替换的字符的索引,而该字符可能不再存在于 word
中。同样,当在 ValueError: 0 is not in list
中找不到 0
(在之前的迭代中设置)时,就会发生 word
。
要解决此问题,您应该避免直接更改原始列表
word
和 guess
。相反,使用单独的列表来跟踪匹配的位置(绿色)或在单词的其他位置找到的位置(黄色)。尝试这样的事情:
matched
,长度与word
和guess
相同,填充为False
。matched
中的所有绿色位置(完全匹配)标记为True
。word
中对应 matched
值为 False
的字符。matched = [False] * len(word) # Initialize matched list
# Check for green letters
for y in range(len(guess)):
if guess[y] == word[y]:
results[y] = "Green"
matched[y] = True
# Check for yellow letters
for y in range(len(guess)):
if not matched[y] and guess[y] in word:
# Find the first unmatched occurrence in word
for w in range(len(word)):
if word[w] == guess[y] and not matched[w]:
results[y] = "Yellow"
matched[w] = True
break