2013-04-05 2 views
3

фонебуква/слова угадать игру в питоне

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

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

вопрос

Я работаю на компьютере AI часть прямо сейчас (в нижней части кода). Я хочу, чтобы он выбрал случайную букву из списка писем, которые НЕ были догаданы. Каков наилучший способ сделать это?

import random 

#set initial values 
player1points= 0 
ai= 0 
userCorrectLetters= '' 
aiCorrectLetters='' 
wrongPlace='' 
wrongLetters='' 
correctLetters = '' 
notInWord = '' 
endGame = False 
alreadyGuessed = 'a' 
userGuessPosition = 0 

###import wordlist, create mask 
with open('/Users/jamyn/Documents/workspace/Lab3/Lab3/wordlist.txt') as wordList: 
    secretWord = random.choice(wordList.readlines()).strip() 

print (secretWord) 
mask = '_' * len(secretWord) 
for i in range (len(secretWord)): 
    if secretWord[i] in correctLetters: 
     mask = mask[:i] + secretWord[i] + mask [i+1:] 
for letter in mask: 
    print (letter, end='') 
    print() 

print() 


def addAlreadyGuessed(): 
    alreadyGuessed= userCorrectLetters + aiCorrectLetters + wrongLetters + correctLetters 

def displayGame(): 
    print ('letters are in word but not in correct location:', wrongPlace) 
    print ('letters not in word:', notInWord) 
    ##asks the user for a guess, assigns input to variable 
def getUserGuess(alreadyGuessed): 


    while True: 
     print ('enter your letter') 
     userGuess = input() 
     userGuess= userGuess.lower() 
     if len(userGuess) != 1: 
      print ('please enter only one letter') 
     elif userGuess in alreadyGuessed: 
      print ('that letter has already been guessed. try again') 
     elif userGuess not in 'abcdefjhijklmnopqrstuvwxyz': 
      print ('only letters are acceptable guesses. try again.') 
     else: 
      return userGuess 

def newGame(): 
    print ('yay. that was great. do you want to play again? answer yes or no.') 
    return input().lower().startswith('y') 


userTurn=True  
while userTurn == True: 
    print ('which character place would you like to guess. Enter number?') 
    userGuessPosition = int(input()) 

    slice1 = userGuessPosition - 1 
    print (secretWord) 


    ##player types in letter 
    guess = getUserGuess(wrongLetters + correctLetters) 
    if guess== (secretWord[slice1:userGuessPosition]): 
     correctLetters = correctLetters + guess 
     print ('you got it right! ') 
     break 
    elif guess in secretWord: 
      userCorrectLetters = userCorrectLetters + guess 
      correctLetters = correctLetters + guess 
      print ('that letter is in the word, but not in that position') 
      break 
    else: 
      wrongLetters = wrongLetters + guess 
      print ('nope. that letter is not in the word') 
      break 

print ('its the computers turn') 

aiTurn=True 

while aiTurn == True: 
    aiGuess=random.choice('abcdefghijklmnopqrstuvwxyz') 
    print (aiGuess) 
+0

Мне нужно выяснить, как вычитать буквы из списка каждый раз, когда угадываемая буква является частью слова. IE, начните со списка как [abcdefghiklmnopqrstuvwxyz], и если пользователь угадает «a», тогда список будет изменен для чтения [bcdefg .... и т. Д.]. Тогда я должен иметь возможность использовать random.choice, чтобы AI выбрал его предположение из этого списка. – jamyn

ответ

5

использование питоны набор, сохранить набор, содержащий все 26 букв, и набор из них догадывались, и просто попросить элементы в большом наборе, которые не в большем наборе http://docs.python.org/2/library/sets.html ... затем потяните ваш случайный выбор из этого результата

allletters = set(list('abcdefghijklmnopqrstuvwxyz')) 
usedletters = set() # update this as you go 
availletters = allletters.difference(usedletters) #s - t new set with elements in s but not in t 

печатать наборы из хорошо, вы можете сделать

print sorted(availletters) 

или

print ', '.join(sorted(availletters)) 

ответить на ваш Followup на добавление догадок, вот быстрый пример

allletters = set(list('abcdefghijklmnopqrstuvwxyz')) 
usedletters = set() # update this as you go 
while(len(usedletters) != len(allletters)): 
    guessedletter = raw_input("pick a letter") 
    availletters = allletters.difference(usedletters) 
    usedletters.update(guessedletter) 

вы также можете просто иметь один список и вычитать буквы, как они были догадались, такие как:

allletters = set(list('abcdefghijklmnopqrstuvwxyz')) 
while(len(usedletters) != len(allletters)): 
    guessedletter = raw_input("pick a letter") 
    allletters.difference_update(guessedletter) 
+0

hmm ... Я получаю сообщение об ошибке --- «set object не поддерживает индексирование» – jamyn

+0

и как бы вы предложили обновить набор доступных чисел, как я иду? – jamyn

+0

вправо, если вы хотите индексировать, вам нужно вернуть его обратно в список. 'list (myset)' – pyInTheSky

Смежные вопросы