Python 使用ai提高在绞刑架上获胜的几率

Python 使用ai提高在绞刑架上获胜的几率,python,artificial-intelligence,Python,Artificial Intelligence,我是python新手(对于stack overflow,这是我问过的第一个问题),我自学了几周。当我决定制作一个刽子手ai时,我正在做一些初学者项目 #importing import random import time import sys from collections import Counter #---------------------------------------------------------------------------------------------

我是python新手(对于stack overflow,这是我问过的第一个问题),我自学了几周。当我决定制作一个刽子手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\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个元音之前,游戏就结束了。