用 ai 提高在刽子手获胜的几率
Improve the odds of winning at hangman with ai
我是 python 的新手(关于堆栈溢出,这是我问过的第一个问题),我已经自学了几个星期。当我决定制作一个刽子手 ai 时,我正在做一些初学者项目。
#importing
import random
import time
import sys
from collections import Counter
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#defining some variables
list_of_words = open("dictionary.txt", "r")
list_of_words = list_of_words.read().split()
SYMBOL = "abcdefghijklmnopqrstuvwxyz"
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#main game loop
def main():
while True:
print("\nGenerating word...")
word = list_of_words[random.randint(0, len(list_of_words) - 1)].lower()
word_guess = []
wrong_attempts = 0
wrong_letters = []
game_state = True
for symbol in word:
if symbol in SYMBOL:
word_guess.append("_")
else:
word_guess.append(symbol)
word_show = " ".join(word_guess)
word = list(word)
while game_state != False:
print("\n" + word_show)
print("\nWrong attempts [{0}/5]" .format(wrong_attempts))
if len(wrong_letters) > 0:
print("\nLetters guessed [{0}]" .format(", ".join(wrong_letters)))
letter = "-"
while letter not in SYMBOL or letter == "" or len(letter) > 1:
try:
letter = input("\nGuess a letter or enter 0 to call the ai: ")
except:
print("\nUnexpected error ocurred, try again")
if letter == "0":
correct_letters = [letter for letter in word_guess if letter in SYMBOL]
letter = ai_solver(wrong_letters, word_guess)
elif letter in wrong_letters or letter in word_guess:
print("\nYou already guessed letter [{0}]" .format(letter))
letter = ""
if letter in word:
for i in range(len(word)):
if letter == word[i]:
word_guess[i] = letter
else:
wrong_letters.append(letter)
wrong_attempts += 1
word_show = " ".join(word_guess)
if "".join(word_guess) == "".join(word):
print("\nYou won!")
game_state = False
elif wrong_attempts == 5:
print("\nYou lost!")
print("The word was [{0}]" .format("".join(word)))
game_state = False
option = input("\nWant to play again?[Y/N]: ")
if option.lower().startswith("n"):
sys.exit(0)
def ai_solver(letters_attempted, word_guess):
letters_attempted = letters_attempted if len(letters_attempted) != 0 else ""
available_words = []
for word in list_of_words:
append = False
if len(word) == len(word_guess):
append = True
for i in range(len(word_guess)):
if word[i] in letters_attempted:
append = False
break
if word_guess[i] != "_":
if word[i] != word_guess[i]:
append = False
break
if append == True:
print("[{0}]" .format(word))
available_words.append(word)
common_letters = [letter for letter in "".join(available_words) if letter not in word_guess]
common_letters = Counter("".join(common_letters)).most_common(1)
return common_letters[0][0]
main()
我试图做的是,过滤所有可能与 word_guess
具有相同长度的单词。
然后通过检查 letters_attempted
过滤掉任何包含被猜错的字母的单词。
然后它会过滤掉所有字母与 word_guess
不匹配的单词。
if word_guess[i] != "_":
if word[i] != word_guess[i]:
append = False
break
虽然很好用,但有时会输,请问加点什么可以增加赢的机率?
谢谢!
您的两个过滤步骤是一个良好的开端。您可以采取几个不同的步骤来尝试改进。到目前为止,我们将符合条件的单词称为 候选 个单词。
第一步是分析所有候选词,找出候选词中出现频率最高的字母。 (不计算多次重复的字母。)该字母可以很好地进行下一次猜测。
稍微复杂一点的方法是查看从猜测中获得的信息。也就是说,可能有一半的候选词有 's',但所有这些词都以 's' 结尾。带有 't' 的候选词可能会稍微少一些,但是 't' 可以出现在词的任何地方。因此,当您猜测 't' 时,您实际上会获得有关该词可能是什么的更多信息,因为当您猜对时,会显示 't' 的位置。特别是当你没有足够的猜测来弄清楚每个单词时,这样的策略可能会帮助你在你有的猜测中找出更多的单词。
我是 python 的新手(关于堆栈溢出,这是我问过的第一个问题),我已经自学了几个星期。当我决定制作一个刽子手 ai 时,我正在做一些初学者项目。
#importing
import random
import time
import sys
from collections import Counter
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#defining some variables
list_of_words = open("dictionary.txt", "r")
list_of_words = list_of_words.read().split()
SYMBOL = "abcdefghijklmnopqrstuvwxyz"
#---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#main game loop
def main():
while True:
print("\nGenerating word...")
word = list_of_words[random.randint(0, len(list_of_words) - 1)].lower()
word_guess = []
wrong_attempts = 0
wrong_letters = []
game_state = True
for symbol in word:
if symbol in SYMBOL:
word_guess.append("_")
else:
word_guess.append(symbol)
word_show = " ".join(word_guess)
word = list(word)
while game_state != False:
print("\n" + word_show)
print("\nWrong attempts [{0}/5]" .format(wrong_attempts))
if len(wrong_letters) > 0:
print("\nLetters guessed [{0}]" .format(", ".join(wrong_letters)))
letter = "-"
while letter not in SYMBOL or letter == "" or len(letter) > 1:
try:
letter = input("\nGuess a letter or enter 0 to call the ai: ")
except:
print("\nUnexpected error ocurred, try again")
if letter == "0":
correct_letters = [letter for letter in word_guess if letter in SYMBOL]
letter = ai_solver(wrong_letters, word_guess)
elif letter in wrong_letters or letter in word_guess:
print("\nYou already guessed letter [{0}]" .format(letter))
letter = ""
if letter in word:
for i in range(len(word)):
if letter == word[i]:
word_guess[i] = letter
else:
wrong_letters.append(letter)
wrong_attempts += 1
word_show = " ".join(word_guess)
if "".join(word_guess) == "".join(word):
print("\nYou won!")
game_state = False
elif wrong_attempts == 5:
print("\nYou lost!")
print("The word was [{0}]" .format("".join(word)))
game_state = False
option = input("\nWant to play again?[Y/N]: ")
if option.lower().startswith("n"):
sys.exit(0)
def ai_solver(letters_attempted, word_guess):
letters_attempted = letters_attempted if len(letters_attempted) != 0 else ""
available_words = []
for word in list_of_words:
append = False
if len(word) == len(word_guess):
append = True
for i in range(len(word_guess)):
if word[i] in letters_attempted:
append = False
break
if word_guess[i] != "_":
if word[i] != word_guess[i]:
append = False
break
if append == True:
print("[{0}]" .format(word))
available_words.append(word)
common_letters = [letter for letter in "".join(available_words) if letter not in word_guess]
common_letters = Counter("".join(common_letters)).most_common(1)
return common_letters[0][0]
main()
我试图做的是,过滤所有可能与 word_guess
具有相同长度的单词。
然后通过检查 letters_attempted
过滤掉任何包含被猜错的字母的单词。
然后它会过滤掉所有字母与 word_guess
不匹配的单词。
if word_guess[i] != "_":
if word[i] != word_guess[i]:
append = False
break
虽然很好用,但有时会输,请问加点什么可以增加赢的机率? 谢谢!
您的两个过滤步骤是一个良好的开端。您可以采取几个不同的步骤来尝试改进。到目前为止,我们将符合条件的单词称为 候选 个单词。
第一步是分析所有候选词,找出候选词中出现频率最高的字母。 (不计算多次重复的字母。)该字母可以很好地进行下一次猜测。
稍微复杂一点的方法是查看从猜测中获得的信息。也就是说,可能有一半的候选词有 's',但所有这些词都以 's' 结尾。带有 't' 的候选词可能会稍微少一些,但是 't' 可以出现在词的任何地方。因此,当您猜测 't' 时,您实际上会获得有关该词可能是什么的更多信息,因为当您猜对时,会显示 't' 的位置。特别是当你没有足够的猜测来弄清楚每个单词时,这样的策略可能会帮助你在你有的猜测中找出更多的单词。