7. Игра "Бейглз".

(открыть в новой вкладке)

Условие:

Необходимо по подсказкам угадать секретное число из трёх цифр, которое загадает компьютер.
В ответ на ваши попытки угадать игра выдаёт одну из трёх подсказок:
- "Близко", если вы угадали правильную цифру на неправильном месте;
- "Совпадение", если в вашей догадке есть правильная цифра на правильном месте;
- "Мимо", если в догадке не содержится правильных цифр.
На угадывание секретного числа у вас десять попыток.

Код:

"""Игра Бейглз.
Необходимо по подсказкам угадать секретное число из трёх цифр.
В ответ на ваши попытки угадать игра выдаёт одну из трёх подсказок:
- "Близко", если вы угадали правильную цифру на неправильном месте;
- "Совпадение", если в вашей догадке есть правильная цифра на правильном месте;
- "Мимо", если в догадке не содержится правильных цифр. 
На угадывание секретного числа у вас десять попыток."""


import random


def get_clues(guess, secret_num):                                                                                                           # функция возвращает значения проверки догадки
    if guess == secret_num:
        return 'Число угадано'
    clues = []
    for i in range(len(guess)):
        if guess[i] == secret_num[i]:
            clues.append('Совпадение')
        elif guess[i] in secret_num:
            clues.append('Близко')
    if len(clues) == 0:
        return 'Мимо'
    else:
        clues.sort()                                                                                                                        # используем метод сортировки, чтобы исключить читерство
        return ' '.join(clues)                                                                                                              # создадим из списка подсказок одну строку


def get_secret_num():                                                                                                                       # функция возвращает сгенерированное число   
    numbers = list('0123456789')  
    random.shuffle(numbers)                                                                                                                 # перемешаем цифры в списке
    return numbers[0:3]                                                                                                                     # возвращаем первые три цифры в списке


def main():
    print()
    print("%50s" % "Игра Бейглз.\n")
    print(f"""Условие игры:
    - компьютер загадывает трехзначное число;
    - у пользователя будет {MAX_GUESSES} попыток отгадать его;
    - компьютер отвечает "Близко", если вы угадали правильную цифру на неправильном месте;
    - компьютер отвечает "Совпадение", если в вашей догадке есть правильная цифра на правильном месте;
    - компьютер отвечает "Мимо", если в догадке не содержится правильных цифр.
    """)

    while (answer := input('Желаете играть? y/n: ')) == 'y':                                                                                # основной цикл игры        
        secret_num = get_secret_num()                                                                                                       # секретная переменная, кот. генерирует отдельная функция               
        print('Число загадано.')       
        print()
        num_guesses = 1                                                                                                                     # счётчик догадок, который будем копить в цикле
        while num_guesses <= MAX_GUESSES:                                                                                                   # цикл, который переберает все попытки
            guess = ''
            while len(guess) != NUM_DIGITS or not guess.isdecimal():                                                                        # цикл проверяет на ввод догадку, сколько символов в ней и состоит ли догадка из цифр
                guess = input(f'Попытка {num_guesses}: ')
            print(get_clues(guess, secret_num))           
            num_guesses += 1
            if [i for i in guess] == secret_num:                                                                                            # условие прерывания цикла со счётчиком догадок
                print(f"""
Победа!!!
""")
                break  
            if num_guesses > MAX_GUESSES:
                print(f"""
Game over.
Вы исчерпали все попытки.
Вы не угадали число {"".join(secret_num)}.                      
""")


NUM_DIGITS = 3                                                                                              # количество цифр в числе
MAX_GUESSES = 10                                                                                            # количество попыток

if __name__ == '__main__':
    main()