Значение строки не обновляется - PullRequest
0 голосов
/ 24 августа 2018

Итак, я работал над переработкой Hangman в Python и столкнулся с проблемой. Вывод не обновляется вообще. Он всегда остается сеткой подчеркивания, хотя другие части кода, такие как уменьшение количества попыток или добавление использованных букв в список used, работают безупречно.

Вот код:

# IMPORT GUARDS
from random import choice
from os import system
from time import sleep

# DECLARATIONS
wordList = ["apple", "pear"]
gameWord = choice(wordList)

strList = list(gameWord)
strOut = "_" * len(gameWord)

tries = 5
used = []

alphabet = "abcdefghijklmnopqrstuvwxyz"

while True:

    system ("cls")
    print (strOut + "\n")
    print ("Tries Left:", str(tries))
    print ("Letters Used:", used)

    Ltr = input ("Letter: ")

    # INPUT CHECK
    if len(Ltr) != 1 and Ltr.lower() in alphabet:
        print ("Input is of incorect size.")
        sleep(0.5)

    elif len(Ltr) == 0 and Ltr.lower() in alphabet:
        print ("No input value given.")
        sleep(0.5)

    if len(Ltr) == 1 and Ltr.lower() not in alphabet:
        print ("Invalid character input.")
        sleep(0.5)

    if len(Ltr) != 1 and Ltr.lower() not in alphabet:
        print ("Input is both too large and contains invalid characters.")
        sleep(0.5)

    # CORRECT INPUT
    if len(Ltr) == 1 and Ltr.lower() in alphabet:

        ltrPos = ( [pos for pos, char in enumerate(gameWord) if char == Ltr.lower])

        # DECLARATIONS
        Counter = 0
        strcounter = 0

        # CHECKING THE NUM OF TIMES THE INPUT APPEARS IN THE WORD
        while Counter < len(strList):
            if gameWord[Counter].lower() == Ltr.lower():
                strcounter += 1
            Counter += 1

        # INPUT DOES APPEAR
        if strcounter != 0:
            strcounter -= 1
            strOut = list(strOut)

            for i in ltrPos:
                strOut[ltrPos[strcounter]] = Ltr.upper()
                strcounter += 1

            strOut = "".join(strOut)

        # INPUT DOES NOT APPEAR AND/OR IS USED
        elif strcounter == 0:
            if Ltr not in used:
                print ("Letter not in word.")
                used.append(Ltr.lower())
                tries -= 1
            else:
                print ("Letter Already Used.")
                sleep(0.5)

        # OUT OF TRIES
        if tries == 0:
            system("cls")
            print ("Game Over. \nWord: " + gameWord)
            break

        # VICTORY
        if "_" not in strOut:
            system("cls")
            print ("Congratulations!")
            break

system ("pause")

Весь совет приветствуется. Заранее спасибо.

1 Ответ

0 голосов
/ 24 августа 2018

Основная проблема в том, что вы забыли вызвать функцию lower в одном месте:

    ltrPos = [pos for pos, char in enumerate(gameWord) if char == Ltr.lower()]

Но это еще не все. Во-первых, вы можете упростить расчет от strCounter до

    strcounter = len(ltrPos)

Или просто отметьте if ltrPos: вместо if strcounter != 0:. Также вы можете использовать else вместо elif.

Следующая проблема - strOut[ltrPos[strcounter]]. Здесь вы пытаетесь получить доступ к lrtPos[strcounter], что приведет к ошибке индекса при уменьшении strcounter только один раз, вместо того, чтобы вернуть его в ноль. Вместо этого просто итерируйте индексы в ltrPos напрямую:

        for i in ltrPos:
            strOut[i] = Ltr.upper()

Также обратите внимание, что вы добавляете букву в список used, только если в слове это , а не .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...