Python - палач - PullRequest
       18

Python - палач

0 голосов
/ 26 апреля 2020

Я только что написал работающую программу для игры в Hangman, но меня беспокоит одна проблема, которую я не смог выяснить.

Программа правильно определяет, присутствует ли выбранный персонаж в слове. быть угаданным, а также его положение в слове (даже если символ появляется более одного раза). Тем не менее, когда вы играете в игру, требуется на один ход больше, чем нужно, чтобы оценить, полностью ли вы угадали слово, или у вас не осталось жизней.

Скажем, к примеру, вам нужно угадать слово "привет" , Я ожидаю, что программа будет работать так:

Поворот 1: 'h'. Поворот 2: «е». Поворот 3: «Я». Поворот 4: «о». Программа должна остановиться здесь, но ей нужен другой персонаж (любой), чтобы признать, что игра завершена.

Вот мой код:

def play_game():

    # Pick word randomly from list
    random_num = random.randint(0, (len(words_list) - 1))
    current_word = list(words_list[random_num].upper())
    print(current_word)
    print('The word has', str(len(current_word)), 'characters')

    current_letter = input('Pick a letter: ').upper() #User input
    picked_letters = []
    correct_ones = []
    for i in range(len(current_word)):
        correct_ones.append('_ ')

    lifes = 3
    while lifes != 0:

        # Check if all characters have been already guessed
        if current_word == correct_ones:
            print('You won!')
            break

        # Check if character has already been chosen
        elif current_letter in picked_letters:
            print('You already chose this letter!')
            current_letter = input('Pick another letter: ').upper()
            continue

        # Check if character is in word
        if current_letter in current_word:
            index_list = []
            for i in range(len(current_word)): #Get indexes of character in word
                if current_word[i] == current_letter:
                    index_list.append(i)

            picked_letters.append(current_letter) #Append to keep track of chosen characters         
            for i in index_list:
                correct_ones[i] = current_letter.upper() #Append to correct position

            print('Correct!')
            for i in correct_ones:
                print(i + ' ', end='')
            current_letter = input('Pick another letter: ').upper()

        # Incorrect character
        else:
            picked_letters.append(current_letter)
            lifes -= 1
            print('Incorrect')
            print('You have', str(lifes), 'lifes left')
            current_letter = input('Pick another letter: ').upper()
            continue


play_game()

Если вы видите какую-либо плохую практику в моем код не стесняйтесь сказать мне об этом!

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Я сделал несколько изменений в вашем коде. Теперь все работает как положено.

def play_game():

    # Pick word randomly from list
    random_num = random.randint(0, (len(words_list) - 1))
    current_word = list(words_list[random_num].upper())
    print(current_word)
    print('The word has', str(len(current_word)), 'characters')

    picked_letters = []
    correct_ones = []
    for i in range(len(current_word)):
        correct_ones.append('_ ')

    lifes = 3
    while lifes != 0:

        # Check if all characters have been already guessed
        if current_word == correct_ones:
            print('You won!')
            break

        current_letter = input('Pick a letter: ').upper()

        # Check if character has already been chosen
        if current_letter in picked_letters:
            print('You already chose this letter!')
            continue

        # Check if character is in word
        if current_letter in current_word:
            index_list = []
            for i in range(len(current_word)):  # Get indexes of character in word
                if current_word[i] == current_letter:
                    index_list.append(i)

            picked_letters.append(current_letter)  # Append to keep track of chosen characters
            for i in index_list:
                correct_ones[i] = current_letter.upper()  # Append to correct position

            print('Correct!')
            for i in correct_ones:
                print(i + ' ', end='')

        # Incorrect character
        else:
            picked_letters.append(current_letter)
            lifes -= 1
            print('Incorrect')
            print('You have', str(lifes), 'lifes left')
            continue


play_game()
1 голос
/ 26 апреля 2020

Вы просите пользователя ввести в конце вашего l oop. Поэтому, когда вы вводите последний правильный символ, вы снова запрашиваете у пользователя ввод:

print('Correct!')
for i in correct_ones:
    print(i + ' ', end='')
current_letter = input('Pick another letter: ').upper()

Чтобы исправить это, вы можете переместить проверку, которую вы делаете в начале своей l oop, прямо туда. Поскольку в начале игры не было введено никаких данных, поэтому слово никогда не следует правильно угадывать (кроме случаев, когда истинное слово пустое, но этого не должно происходить!). И поскольку только угадывание правильного персонажа может принести вам победу, проверка на это имеет смысл. Надеюсь, это поможет, весело провести время:)

...