【问题标题】:hangman in python using only while loopspython中的hangman仅使用while循环
【发布时间】:2016-05-28 05:32:13
【问题描述】:

我正在尝试仅使用 while 循环创建一个刽子手游戏:

我正在尝试显示一个秘密单词的破折号,或者如果该字母已被猜到并且是可变的正确字母,则在正确的位置显示正确的字母,其余的将是破折号 - 全部使用 while 循环。

但是,如果字符串正确的字母为空,因为它将在游戏开始时显示破折号。

我不允许使用 for 循环或 in,只能使用 while 循环,目前遇到以下错误:

tmp_letter = p_correct_letters[count]
IndexError: string index out of range

我的代码:

from hangman_lib import HANGMAN
import hangman_lib
import random


words = ["ant","baboon","zebra"]

def main():
    game_over = False
    correct_letters = ""
    incorrect_letters = ""

    secret_word = get_word()
    print("Welcome to Hangman!")
    print(secret_word) # For testing purposes only

    while not game_over:
        display_board(secret_word, correct_letters, incorrect_letters)

        guess = get_guess(correct_letters + incorrect_letters)

        if found_letter(guess, secret_word):
            correct_letters = correct_letters + guess
        else:
            incorrect_letters = incorrect_letters + guess

        game_over = has_won(secret_word, correct_letters)

        if not game_over:
            game_over = has_lost(incorrect_letters)

        if game_over:
            display_board(secret_word, correct_letters, incorrect_letters)


''' Non temlate Code starts here '''

# Function returns random word from list of words
def get_word():
    return random.choice(words)

def display_board(p_secret_word, p_correct_letters, p_incorrect_letters):
    print(HANGMAN[len(p_incorrect_letters)])
    print("\n")

    print ("Guess a letter... ")

    word_length = len(p_secret_word)
    underscore = "_ "
    to_display = ""

    display_underscore = underscore * word_length
    print(display_underscore)

    print("\n")
    print("Incorrect letters:", p_incorrect_letters)

    index = 0
    current_letter =""
    tmp_letter =""
    correct_length = len(p_correct_letters)


    while index < word_length:
        current_letter = p_secret_word[index]
        count = 0

        while count < correct_length:
            tmp_letter = p_correct_letters[count]

            if current_letter == tmp_letter:
                to_display = to_display[count] + current_letter + " "
            else:
                to_display = underscore + " "

        count = count + 1

    index = index + 1

    print(to_display, end = "")

    # return current print statement 

    main()

【问题讨论】:

  • 你的。缩进。已。走了。 野生.
  • 更重要的是,您不能“返回当前打印语句”。
  • 我会编写我自己的函数来模拟 forwhile 方面,然后使用它。真的,禁止for 对任何事情都毫无用处,但会让您意识到for 的用处。
  • 您可以使用 for 循环编写解决方案,然后用 while 循环机械地替换每个 for 循环

标签: python python-3.5


【解决方案1】:

在 python 中,in 有两个主要用途,遍历可迭代对象,以及确定列表或集合中的成员资格。

第一个用例(迭代)可以用另一个循环结构代替,比如while,你已经完成了。

第二个用例(成员资格测试)可以使用嵌套循环或使用setslists 上的内置成员资格方法之一来完成。

例如,在您的 display_board 函数中,底部的 while 循环看起来像是在尝试显示秘密单词,正确的猜测打印字母,未猜到的字母打印有下划线。您收到的错误是迭代超过 correct_letters 列表末尾的结果。

为此,您需要:

  1. 遍历密码中的每个字母。
  2. 对于秘密单词中的每个字母,测试该字母是否是正确猜测之一。如果是正确的猜测,显示字母,如果不是,显示下划线。

第一步可以通过while 循环来完成。

i = 0
while i < len(word):
   # do stuff
   i += 1

第二步可以通过多种方式完成,但我认为最简单和最直接的方法是使用内置成员测试方法之一,例如list.count(或可能是list.index)和set.intersection .

word = 'magic'
correct_letters = set(['a', 'b', 'c'])

while i < len(word):
    letter = word[i]

    if correct_letters.intersection(letter)
        print (letter)
    else:
        print ('_')

    i += 1

我认为sets 在这里效果更好,但如果保持猜测字母的顺序很重要,您也可以使用lists

correct_letters = ['a', 'b', 'c']

if correct_letters.count(letter)
    print (letter)
else:
    print ('_')

【讨论】:

  • 缩进太疯狂了!我正在粘贴我的代码,并且必须手动添加额外的空格,以便它显示在此处。 ;(
  • 我已经更新了我的代码,它现在什么也不打印了,即使我在正确的字母列表中添加了 a,e,i,o,u :(
  • 您对代码进行了哪些更新?你有没有尝试过我提供的任何建议?看起来您仍在使用字符串来存储正确的字母,而不是一组。而且您仍在错误地迭代正确的字母(迭代结束)。
  • 我刚刚更新,抱歉在我完成代码编辑之前发布了 cmets
  • 在每次迭代中,您可能应该使用to_display += ,而不是每次都重新定义。
猜你喜欢
  • 1970-01-01
  • 2014-11-02
  • 2016-12-31
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多