python - 使用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”的位置。尤其是当你没有足够的猜测来猜出每个单词时,这样的策略可能会帮助你在已有的猜测中找出更多的单词。
推荐阅读
- javascript - 无法从 content.js 文件向浏览器注入代码
- php - 如何在 AJAX 响应中重新初始化 DataTable
- mysql - 如何将一列添加到 SQL 表中,该列是其他两列的乘积?
- javascript - Vue.js;设置间隔在方法中不起作用
- mongodb - 我试过放松,但它没有返回任何东西
- kotlin - Kotlin 继承和变量可见性
- javascript - ReactJs 中的 Firebase 错误
- cmake - 交叉编译ROS节点的Catkin和CMake集成问题
- java - Java继承:创建子类实例时如何调用超类方法?
- apache-kafka-streams - Kafka Streams 减少与抑制