与有关该主题的许多问题不同,我的不是作业。我构建了一个可以工作的Ghost机器人。我的最终目标是建立一个扑克机器人作为一种爱好,但 Ghost 似乎是一个更容易开始思考的游戏。
我有问题的代码如下:
def computer_prompt(playerName,word_string):
length_string = len(word_string)
for possibilities in wordlist:
if possibilities[:length_string].lower() == word_string:
if len(possibilities) > 3 and len(possibilities) % 2 != 0:
if check_game.is_valid_word(possibilities[length_string],wordlist):
if not check_game.word_formed(possibilities[:length_string + 1],wordlist):
print(possibilities)
return possibilities[:length_string + 1]
目前,我只想让计算机始终排在第二位,而人类始终排在第一位。问题是,虽然电脑几乎总是打败我,但有几次我仍然可以胜过他。例如,如果我弹“h”,那么他弹“a”,然后我弹“z”,然后他弹“a”,然后我弹“r”,那么他会抛出错误(因为他不认输:))。
在这种情况下,我怎样才能改变它,让他知道在我说“z”之后不要说“a”?显然我可以将此示例编码为异常,但我想知道这个问题的一般解决方案。一般来说,计算机现在打败了我,因为它会在决定选择哪个字母之前查找所有可能以我结尾的单词列表。但是在“危险”示例中,他只是被卡住了,我想让他知道他会在前几步被卡住,这样他就不会一开始就处于这个位置......
非常感谢提前!
添加于 9/27
对于任何感兴趣的人,下面的代码似乎比我以前的代码要好一些。虽然仍然不完美......:
def all_possibilities(word_string, length_string):
possibilities = []
for possibility in wordlist:
if possibility[:length_string].lower() == word_string:
possibilities.append(possibility)
return possibilities
def clear_loser(possibilities):
clear_losers = []
for item in possibilities:
if len(item) % 2 == 0:
clear_losers.append(item)
return clear_losers
def first_n_letters(sub_optimal_computer_possibilities, length_string):
first_n_Letters = []
for item in sub_optimal_computer_possibilities:
first_n_Letters.append(item[:length_string + 1])
return list(set(first_n_Letters))
def existing_Optimal_Move(FIRSTNLETTERS,first_letters_of_clear_losers):
length_sub_opt_list = len(FIRSTNLETTERS)
new_list = []
for item in FIRSTNLETTERS:
if not item in first_letters_of_clear_losers:
new_list.append(item)
return new_list
def computer_prompt(word_string):
length_string = len(word_string)
possibilities = all_possibilities(word_string, length_string)
clear_losers = clear_loser(possibilities) #Create list of words that will end on computer
sub_optimal_computer_possibilities = [x for x in possibilities if x not in clear_losers] #Create list of words that will end on human (including words that might be suboptimal for me because smart human will make it end on me before getting to this word
FIRSTNLETTERS = first_n_letters(sub_optimal_computer_possibilities, length_string)
first_letters_of_clear_losers = first_n_letters(clear_losers, length_string)
optimalMove = existing_Optimal_Move(FIRSTNLETTERS, first_letters_of_clear_losers)
if optimalMove:
print("OPTIMAL MOVE")
for item in optimalMove:
#print(optimalMove)
return item[:length_string + 1]
else:
for item in FIRSTNLETTERS:
#print(FIRSTNLETTERS)
return item[:length_string + 1]