Я пишу компьютерную программу для игры в слова «Призрак»
Вот как работают текущие программы:
- пользователь выбирает букву(сейчас он работает только в том случае, если пользователь двигается первым)
- Компьютер имеет список всех возможных нечетных слов в своем словаре (это так, что пользователь должен будет завершить каждое слово и, следовательно, потерять).После каждой буквы, которую выбирает пользователь, список слов, которые есть на компьютере, обрезается с помощью этого цикла:
wordList = [w for w in wordList if w.startswith(currentWord)]
, чтобы в его «списке слов» были только те слова, которые соответствуют текущему слову, которое совместнопишется.
- Компьютер затем случайным образом выбирает слово из своего текущего списка слов и возвращает соответствующую букву слова через. Затем он обновляет свой список, чтобы включить букву, выбранную в этом примере кода:
randomnumber = random.randint(0, len(wordList)-1)
currentWord+=wordList[randomnumber][len(currentWord)]
wordList = [w for w in wordList if w.startswith(currentWord)]
- Это продолжается до тех пор, пока пользователь не произнесет слово и оно не будет обнаружено с помощью функции checkLoss, или если компьютер не сможет продолжить слово без потери и не вызовет функцию checkBluff.Функция checkBluff требует, чтобы пользователь записал, какое слово он думает, чтобы убедиться, что он его не придумывает.
- * ЗДЕСЬ ПРОБЛЕМА: * очевидно, потому что компьютер случайным образом выбирает, какой символ выбрать, есть определенные слова, которые приведут к потере.Например, если первый игрок выбирает слово «d», существует очень высокая вероятность того, что компьютер выберет «e», потому что существует так много слов, которые имеют «de» и самое начало.Однако, если пользователь на третьем ходу выбирает букву «e» так, что текущее написание «dee», у компьютера нет слов в списке (в английском языке есть только одно слово, которое соответствует этой форме: «deed»)и он чётный и, следовательно, проигрывает), поэтому функция блефа срабатывает, и компьютер проигрывает, когда пользователь обнаруживает, что думает о реальном слове «поступок».
ТАК, я бы хотелалгоритм, заставляющий компьютер думать заранее, так что он никогда не выбирает последующую букву, для которой первый игрок может принести убыток. Итак, если выбрано «d», компьютер никогда не должен выбирать«е», потому что это приведет к потере с последующим е.Точно так же, если пользователь выбирает «h», компьютер никогда не должен следовать с «o», потому что пользователь может сказать «c», что заставляет «k» произносить слово «скакать».
Я не могупридумать способ сделать это.
При необходимости, вот программа в ее полном воплощении:
import os, random, sys, math, string
def checkBluff(currentWord, choice, fullList):
if choice.startswith(currentWord):
#print "this is accurate"
for line in fullList:
if line == choice:
return 1
return 0
def checkLoss(currentWord, fullList):
for line in fullList:
if currentWord == line:
return 1
return 0
def instantiateWordList(dictionary, wordList):
for line in dictionary:
wordList.append(line.strip())
return wordList
def main():
fullDict = open("wordlist.txt", "r") #fullDict contains all possible words
winFirst = open("firstwin.txt", "r") #winFirst contains all odd-numbered words
winSecond = open("secondwin.txt", "r")#winSecond contains all even-numbered words
turn = "Human"
currentWord = ""
wordList = []
fullList= []
bluff = ""
#Instantiates a list with every word for use in evaluating win/loss
for line in fullDict:
fullList.append(line.strip())
#Decide who goes first
choice = raw_input("1. I will go first \n2. I will go second\n>>")[0]
if choice == "1":
wordList = instantiateWordList(winSecond, wordList)
turn == "Human"
else:
wordList = instantiateWordList(winFirst, wordList)
turn == "Computer"
while True:
if turn == "Human":
choice = raw_input("Choose a letter: ")[0]
currentWord+=choice
if checkLoss(currentWord, fullList) == 1:
print "You have lost by spelling the word "+ currentWord
break
print "**Current Word**"+ currentWord
wordList = [w for w in wordList if w.startswith(currentWord)]
turn = "Computer"
if turn == "Computer":
try:
randomnumber = random.randint(0, len(wordList)-1)
currentWord+=wordList[randomnumber][len(currentWord)]
print "I am thinking of the word: "+ str(wordList[randomnumber])
wordList = [w for w in wordList if w.startswith(currentWord)]
print "**Current word**: "+ currentWord
print "length: "+ str(len(wordList))
turn = "Human"
except StandardError:
bluff = raw_input("I call bluff. What word were you thinking of?\n>>")
if checkBluff(currentWord, bluff, fullList) == 1:
print "You actually won!"
break
else:
print "You lost. You lying son of a bitch."
break
if __name__ == "__main__":
main()