letter/word guessing game in python
背景
我正在尝试用python编写一个基本的字母游戏。在游戏中,计算机主持人从可能的单词列表中选择一个单词。每个播放器(计算机人工智能和人类)显示一系列空白,每个字对应一个空白。然后,每个玩家猜测一个字母和一个位置,并被告知以下内容之一:
那封信属于那个位置(最好的结果)那封信在字面上,但不是在那个位置上那封信不在剩下的空白处当这个词被完全揭穿后,猜对大多数字母的玩家将赢得一分。计算机主持人选择另一个词并重新开始。先得五分的选手获胜。在基本游戏中,两个玩家共享相同的空白区域,因此他们从彼此的工作中受益。
问题
我现在正在研究计算机的人工智能部分(代码的底部)。我想让它从一个尚未猜到的字母列表中选择一个随机字母。最好的方法是什么?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | 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) |
使用pythons集合,保留一个包含所有26个字母和一组猜测的字母的集合,只需询问大集合中不在大集合中的元素http://docs.python.org/2/library/sets.html…然后从结果中随机选择
1 2 3 | 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 |
为了把布景打印得很好,你可以这样做
1 | print sorted(availletters) |
号
或
1 | print ', '.join(sorted(availletters)) |
下面是一个快速的例子来回答你关于增加猜测的后续行动。
1 2 3 4 5 6 | 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) |
。
您也可以只列出一个列表,并根据猜测减去字母,例如:
1 2 3 4 | allletters = set(list('abcdefghijklmnopqrstuvwxyz')) while( len(usedletters) != len(allletters) ): guessedletter = raw_input("pick a letter") allletters.difference_update(guessedletter) |