2013-04-09 173 views
1

我得到了我第一次真正尝试在Python程序 - 一个字母猜谜游戏的大部分。python字母猜谜游戏

我有大头所做的工作,但我卡在最后一点点

我想要让这个游戏交替来回用户和AI之间转动,直到世界已经充分显现。我很好,直到这里。在这一点上,我想要让玩家正确地猜出最多的字母赢得一分。电脑版主挑选另一个字,然后重新开始。第一个到五点的玩家赢得比赛。

我有一个while循环在用户/ AI轮流之间交替,但是一旦这个词已经完全公开,我无法让它正常打破?之后,只需比较userCorrectLetters的数量和aiCorrectLetters的数量并使用它来确定谁赢得该回合的点数就相当简单。

然后我假设整个事情应该在一个while循环中进行,直到其中一个玩家达到5分才会休息。

我遇到的另一个问题是如何禁止用户重新猜测已经解决的字符位置。

import random 


#set initial values 
player1points= 0 
ai= 0 
userCorrectLetters= [] 
aiCorrectLetters=[] 
wrongLetters=[] 
wrongPlace= [] 
correctLetters = [] 
endGame = False 
allLetters = set(list('abcdefghijklmnopqrstuvwxyz')) 
alreadyGuessed = set() 
userGuessPosition = 0 
availLetters = allLetters.difference(alreadyGuessed) 


#import wordlist, create mask 
with open('wordlist.txt') as wordList: 
    secretWord = random.choice(wordList.readlines()).strip() 
print (secretWord) 
secretWordLength = len(secretWord) 








def displayGame(): 
    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 ('letters in word but not in correct location:', wrongPlace) 
    print ('letters not in word:', wrongLetters) 



    ##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') 

def userTurn(wrongLetters, wrongPlace, correctLetters): 
    print ('\n') 

    displayGame() 
    print ('which character place would you like to guess. Enter number?') 
    userGuessPosition = input() 
    if userGuessPosition not in ('123456789'): 
     print ('please enter a NUMBER') 
     userGuessPosition = input() 
    slice1 = int(userGuessPosition) - 1 


    ##player types in letter 
    guess = getUserGuess(wrongLetters + correctLetters) 
    if guess== (secretWord[slice1:int(userGuessPosition)]): 
     print ('you got it right! ') 
     correctLetters.append(guess) 
     userCorrectLetters.append(guess) 
     displayGame() 

    elif guess in secretWord: 
      wrongPlace.append(guess) 
      print ('that letter is in the word, but not in that position') 
      displayGame() 

    else: 
      wrongLetters.append(guess) 
      print ('nope. that letter is not in the word') 
      displayGame() 




def aiTurn(wrongLetters,wrongPlace, correctLetters): 
    print ('\n') 
    print ("it's the computers turn") 

    aiGuessPosition = random.randint(1, secretWordLength) 

    aiGuess=random.sample(availLetters, 1) 
    print ('the computer has guessed', aiGuess, "in position", + aiGuessPosition) 
    slice1 = aiGuessPosition - 1 
    if str(aiGuess) == (secretWord[slice1:userGuessPosition]): 
      correctLetters.append(aiGuess) 
      aiCorrectLetters.append(aiGuess) 
      print ('this letter is correct ') 
      return 
    elif str(aiGuess) in secretWord: 
      wrongPlace.append(aiGuess) 
      print ('that letter is in the word, but not in that position') 
      return 

    else: 
      wrongLetters.append(aiGuess) 
      print ('that letter is not in the word') 
      return 



wordSolved = False 
while wordSolved == False: 

    userTurn(wrongLetters, wrongPlace, correctLetters) 
    aiTurn(wrongLetters, wrongPlace, correctLetters) 
    if str(correctLetters) in secretWord: 
     break 
+0

是你要为worldSolved为真? – Gareth 2013-04-09 18:51:51

+0

刚试过,仍然没有正确地打破。我认为这是因为str(correctLetters)和secretWord之间的比较存在问题? – jamyn 2013-04-09 18:55:49

+0

你想在'secretWord'的'str(correctLetters)中做什么? – 2013-04-09 18:59:49

回答

2

的问题是在这里:

if str(correctLetters) in secretWord: 

你可能想到的是str(['a', 'b', 'c'])返回 'ABC',但事实并非如此。它返回"['a', 'b', 'c']"。 您应该替换该行:

if "".join(correctLetters) in secretWord: 

还有更多的一个问题你的代码,除了这一个: 假设正确的词是foobar。如果用户猜测前5个字母,但是按相反顺序,correctLetters将为['a', 'b', 'o', 'o', 'f'],并且行if "".join(correctLetters) in secretWord:将评估为False,因为'aboof'不在'foobar'中。

您也可以用替换if "".join(correctLetters) in secretWord:解决这个问题:

if len(correctLetters) > 4: 

基本上,用户猜测正确的5封,这将尽快结束程序的执行。没有必要检查这些字母是否在secretWord中,因为您已在userTurn函数中执行该操作。

0

您正在比较列表correctLetters的字符串表示形式与字符串secretWord。例如:

>>> secretWord = 'ab' 
>>> correctLetters = ['a','b'] 
>>> str(correctLetters) 
"['a', 'b']" 
>>> str(correctLetters) in secretWord 
False 

尝试做出比较正确的字母来加密词的字符串:

>>> ''.join(correctLetters) == secretWord 
True