用Python编写的字母/单词猜测游戏

3

背景

我正在尝试用Python编写一个基本的文字游戏。在游戏中,计算机会从可能的单词列表中选择一个单词作为答案。每个玩家(包括计算机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) 

我需要找出如何从列表中减去字母,每次猜测的字母是单词的一部分。例如,以列表[abcdefghiklmnopqrstuvwxyz]开始,如果用户猜测了一个"a",那么列表将被修改为[bcdefg....等]。然后,我应该能够使用random.choice从这个列表中选择AI的猜测。 - jamyn
1个回答

5
使用Python中的集合(set),创建一个包含所有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))

回答您关于添加猜测的后续问题,这里有一个快速示例。
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)

嗯...我遇到了一个错误---“set对象不支持索引”。 - jamyn
你会怎样建议我在进行时如何更新可用数字的集合? - jamyn
如果您想要索引,需要将其转换回列表。'list(myset)' - pyInTheSky
1
@John,你在引用什么可用数字集合(你指的哪个变量?)……一般来说,你可以使用'.update'和'.difference_update'作为就地操作,添加或删除集合中的元素。 - pyInTheSky
感谢你的帮助 @pyInTheSky。我明白你的方法,但是我似乎不能再使用random.choice从那个列表中选择了。 - jamyn
#当你进行选择时,需要将集合转换为列表:>>> a = set( list('abcde') )
random.choice(list(a)) 'e'
- pyInTheSky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接