我正在使用Python制作一个刽子手游戏,我认为跟踪当前单词的好方法是字典。每个字母都会被一个键捕获,其中布尔值表示玩家是否猜到了该字母。
为简单起见,我假设唯一允许的输入是猜测(即,即使玩家立刻知道这个词,他或她必须[正确]填写空白)。因此,每次猜测(如果该人尚未悬挂),我将检查字典值是否全部为True,在这种情况下玩家获胜。
两个问题:
上述表示听起来合理吗?
如果是这样,则存在生成密钥以解决重复字母的问题。我想过使用元组;例如,这是“编程”一词的初始表示
('p', 0) : False
('r', 0) : False
('o', 0) : False
('g', 0) : False
('r', 1) : False
('a', 0) : False
('m', 0) : False
('m', 1) : False
('i', 0) : False
('n', 0) : False
('g', 1) : False
该对中的第二项只是该字母出现的索引;因此,当我遍历单词时,第一项仍可用于标记正确猜测的字母。
给一个单词作为字符串,是否有一种紧凑的方式来创建如上所述的字典?我可以看到这样的事情:
word = "programming"
word_dict = { (letter, ???) : False for letter in word }
,哪里???是一些聪明的计数表达。或者我是否需要明确地执行此操作并在循环中跟踪事物?
答案 0 :(得分:2)
你的问题太复杂了;所有你真正需要的是一个包含True
和False
的字典;如果一封信重复或者没有重复,那么一旦玩家猜到了他们猜到该信的所有重复的信件。
创建字典很简单:
word_dict = dict.fromkeys(word, False)
这会创建一个字典,每个唯一字母都有一个键,每个字段默认为False
。
然后玩刽子手就像:
guessed = set()
misses = 0
while misses < 6:
if guess in guessed:
# already guessed at this before
# error message, user must try again
continue
guessed.add(guess)
if guess not in word_dict:
# wrong guess
# hang the user some more
misses += 1
else:
word_dict[guess] = True
display = ''.join([c if word_dict[c] else '_' for c in word])
print 'Guessed so far: {}'.format(display)
if all(word_dict.values()):
# guessed the whole word!
# show congratulations
break
else:
# player died, show commiserations
答案 1 :(得分:1)
>>> from collections import Counter
>>> word = 'programming'
>>> c = Counter(word)
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})
您可以使用它来执行类似
的操作dead = 5 # maximum number of incorrect guesses
missed = 0 # current number of incorrect guesses
while missed < dead:
guess = raw_input("guess a letter")
if c.get(guess):
# they guessed a correct letter, display something nice :)
# more importantly, keep track of how much of the word they correctly know
else:
missed += 1
print guess, "not a letter in the word"