首页 > 解决方案 > 使用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

虽然效果很好,但有时会输,我可以添加什么来增加获胜的机会?谢谢!

标签: pythonartificial-intelligence

解决方案


您的两个过滤步骤是一个好的开始。您可以采取几个不同的步骤来尝试改进。让我们将到目前为止符合标准的单词称为候选单词。

第一步是分析所有候选词并找出候选词中出现频率最高的字母。(不计算多次重复的字母。)该字母将是一个很好的下一个猜测。

稍微复杂一点的方法是从猜测中获取信息。也就是说,可能有一半的候选词有一个's',但所有这些词都以's'结尾。带有“t”的候选词可能会稍微少一些,但“t”可以出现在单词的任何位置。因此,当您猜“t”时,您实际上会获得更多关于该词可能是什么的信息,因为当您猜对时,您会看到“t”的位置。尤其是当你没有足够的猜测来猜出每个单词时,这样的策略可能会帮助你在已有的猜测中找出更多的单词。


推荐阅读