Python 使用ai提高在绞刑架上获胜的几率
我是python新手(对于stack overflow,这是我问过的第一个问题),我自学了几周。当我决定制作一个刽子手ai时,我正在做一些初学者项目Python 使用ai提高在绞刑架上获胜的几率,python,artificial-intelligence,Python,Artificial Intelligence,我是python新手(对于stack overflow,这是我问过的第一个问题),我自学了几周。当我决定制作一个刽子手ai时,我正在做一些初学者项目 #importing import random import time import sys from collections import Counter #---------------------------------------------------------------------------------------------
#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\u guess
相同。
然后通过检查letters\u尝试
,过滤掉任何包含错误猜测的字母的单词
然后它会过滤掉所有字母与word\u guess
不匹配的单词
if word_guess[i] != "_":
if word[i] != word_guess[i]:
append = False
break
虽然效果很好,但有时会失败,我可以添加什么来增加获胜的机会?
谢谢大家! 您的两个筛选步骤是一个良好的开始。你可以采取几个不同的步骤来改善情况。让我们把目前为止符合条件的词称为候选词 第一步是分析所有候选词,找出候选词中出现频率最高的字母。(不包括多次重复的字母)那封信将是一个很好的下一个猜测
一个稍微复杂一点的方法是从猜测中获取信息。也就是说,可能有一半的候选词有“s”,但所有这些词都以“s”结尾。带“t”的候选词可能会稍微少一些,但“t”可以出现在单词中的任何位置。所以,当你猜对“t”时,你实际上得到了更多关于这个词可能是什么的信息,因为当你猜对它时,你会看到“t”的位置。特别是当你没有足够的猜测来猜出每个单词时,这种策略可能会帮助你在猜测中找出更多的单词。要增加获胜的机会,请增加允许的错误猜测次数。该代码只允许5次错误猜测。一个典型的游戏允许6次(甚至更多)错误猜测。人类的一个典型策略是先猜元音。因此,像“fly”这样的单词几乎肯定会失败,只有5次猜测,因为在玩家知道单词中没有5个元音之前,游戏就结束了。