Алгоритм Python - для игры «Призрак» - нужен способ интеллектуально отыскивать все «выигрышные» перестановки букв - PullRequest
1 голос
/ 28 января 2011

Я пишу компьютерную программу для игры в слова «Призрак»

Вот как работают текущие программы:

- пользователь выбирает букву(сейчас он работает только в том случае, если пользователь двигается первым)

- Компьютер имеет список всех возможных нечетных слов в своем словаре (это так, что пользователь должен будет завершить каждое слово и, следовательно, потерять).После каждой буквы, которую выбирает пользователь, список слов, которые есть на компьютере, обрезается с помощью этого цикла:

 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()

Ответы [ 2 ]

1 голос
/ 28 января 2011

Вы хотите, чтобы компьютер смотрел в будущее, и все же выбирал случайно? : -)

Эта игра достаточно предсказуема и проста для того, чтобы компьютер всегда побеждал, если хотите. На самом деле, вы можете предварительно генерировать деревья стратегий, чтобы гарантировать победу. Они даже не такие большие , вы можете выучить их наизусть, если хотите.

Если вы не хотите этого, вы должны смотреть только на один раунд вперед. В вашем примере с делом один раунд на голове показал бы, что противник может добиться победы в одном раунде, поэтому он избежал бы "де". Но это не позволило бы избежать чего-то, что привело бы к потере в двух раундах.

Но для этого вам нужно пройти через все возможности. Затем вы можете случайным образом выбрать один из оставшихся вариантов.

0 голосов
/ 28 января 2011

Чтобы программа не проиграла, необходимо также сохранить список четных слов ( о, сначала не заметил)

Когдавыбирая следующую букву, она должна сначала обратиться к списку четных (проигрышных) слов.Если существует n + 2 (4 для n = 1, 6 для n = 3 и т. Д., n - текущий буквенный индекс) длинных слов, то ему не следует использовать букву в позиции n из этих символов.

Итак, используя пример "deed":

  1. Пользователь вводит "d"
  2. Программа видит, что есть 1 слово, которое начинается с "d" и имеет длину 4 символа: "deed".
  3. Добавляет «deed» [1] в список «запрещенных» букв
  4. Сканирует список «выигрышных» слов, игнорируя те, которые начинаются с «de» иполучает список «доступных» символов.
  5. Он случайным образом выбирает символ из списка и отображает его пользователю.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...