Загрузка данных


"""
Игра "Виселица"
Программа загадывает слово, пользователь должен его угадать по буквам или целиком.
За каждую ошибку добавляется часть тела повешенного.
"""

import random

# Глобальный список слов для игры
word_list = [
    "ПИТОН", "ПРОГРАММИРОВАНИЕ", "КОМПЬЮТЕР", "АЛГОРИТМ", "РАЗРАБОТЧИК",
    "ФУНКЦИЯ", "ПЕРЕМЕННАЯ", "ЦИКЛ", "СПИСОК", "СЛОВАРЬ", "МОДУЛЬ",
    "ВИСЕЛИЦА", "УГАДАЙКА", "ПОЛЬЗОВАТЕЛЬ", "ИНТЕРФЕЙС"
]

# Категории слов с подсказками
words_with_hints = {
    "ПИТОН": "Язык программирования",
    "ПРОГРАММИРОВАНИЕ": "Процесс создания компьютерных программ",
    "КОМПЬЮТЕР": "Электронное устройство для обработки данных",
    "АЛГОРИТМ": "Последовательность действий для решения задачи",
    "РАЗРАБОТЧИК": "Специалист, создающий программное обеспечение",
    "ФУНКЦИЯ": "Блок кода, который можно вызывать многократно",
    "ПЕРЕМЕННАЯ": "Именованная область памяти для хранения данных",
    "ЦИКЛ": "Управляющая конструкция для повторения действий",
    "СПИСОК": "Упорядоченная коллекция элементов",
    "СЛОВАРЬ": "Структура данных для хранения пар ключ-значение",
    "МОДУЛЬ": "Файл с кодом Python для импорта",
    "ВИСЕЛИЦА": "Название этой игры",
    "УГАДАЙКА": "Игра на отгадывание слов",
    "ПОЛЬЗОВАТЕЛЬ": "Человек, взаимодействующий с программой",
    "ИНТЕРФЕЙС": "Способ взаимодействия между компонентами"
}


def get_word():
    """Возвращает случайное слово из списка word_list в верхнем регистре"""
    return random.choice(word_list)


def get_hint(word):
    """Возвращает подсказку для слова, если она есть"""
    return words_with_hints.get(word, "Подсказка отсутствует")


def display_hangman(tries):
    """Возвращает текущее состояние виселицы в зависимости от количества попыток"""
    stages = [  # финальное состояние: голова, торс, обе руки, обе ноги
        '''
           --------
           |      |
           |      O
           |     \\|/
           |      |
           |     / \\
           -
        ''',
        # голова, торс, обе руки, одна нога
        '''
           --------
           |      |
           |      O
           |     \\|/
           |      |
           |     / 
           -
        ''',
        # голова, торс, обе руки
        '''
           --------
           |      |
           |      O
           |     \\|/
           |      |
           |      
           -
        ''',
        # голова, торс и одна рука
        '''
           --------
           |      |
           |      O
           |     \\|
           |      |
           |     
           -
        ''',
        # голова и торс
        '''
           --------
           |      |
           |      O
           |      |
           |      |
           |     
           -
        ''',
        # голова
        '''
           --------
           |      |
           |      O
           |    
           |      
           |     
           -
        ''',
        # начальное состояние
        '''
           --------
           |      |
           |      
           |    
           |      
           |     
           -
        '''
    ]
    return stages[tries]


def display_word_with_hint(word_completion, word):
    """Отображает текущее состояние слова с первой и последней буквой (если есть)"""
    # Находим первую и последнюю букву оригинального слова
    first_letter = word[0]
    last_letter = word[-1] if len(word) > 1 else word[0]
    
    print(f"\nПодсказка: первая буква '{first_letter}', последняя буква '{last_letter}'")
    print(f"Загаданное слово: {word_completion}")


def play(word):
    """Основная логика игры"""
    word_completion = '_' * len(word)  # строка, содержащая символы _ на каждую букву
    guessed = False  # сигнальная метка
    guessed_letters = []  # список уже названных букв
    guessed_words = []  # список уже названных слов
    tries = 6  # количество попыток
    
    print("\n" + "="*50)
    print("Давайте играть в угадайку слов!")
    print("="*50)
    
    # Показываем подсказку
    print(f"\nПодсказка по категории: {get_hint(word)}")
    
    # Основной игровой цикл
    while not guessed and tries > 0:
        # Отображаем текущее состояние
        print(display_hangman(tries))
        display_word_with_hint(word_completion, word)
        print(f"\nИспользованные буквы: {', '.join(sorted(guessed_letters)) if guessed_letters else 'пока нет'}")
        print(f"Осталось попыток: {tries}")
        
        # Запрашиваем ввод
        user_input = input("\nВведите букву или слово целиком: ").strip().upper()
        
        # Защита от пустого ввода
        if not user_input:
            print("Вы ничего не ввели! Попробуйте снова.")
            continue
        
        # Защита от небуквенных символов
        if not user_input.isalpha():
            print("Можно вводить только буквы русского алфавита!")
            continue
        
        # Если пользователь ввел слово целиком
        if len(user_input) > 1:
            if user_input in guessed_words:
                print(f"Вы уже пробовали слово '{user_input}'. Попробуйте другое!")
                continue
            
            guessed_words.append(user_input)
            
            if user_input == word:
                guessed = True
                word_completion = word
                print(display_hangman(tries))
                print(f"\nЗагаданное слово: {word_completion}")
                print("Поздравляем, вы угадали слово! Вы победили!")
                break
            else:
                print(f"Слово '{user_input}' неверно!")
                tries -= 1
                continue
        
        # Если пользователь ввел одну букву
        if len(user_input) == 1:
            if user_input in guessed_letters:
                print(f"Вы уже называли букву '{user_input}'. Попробуйте другую!")
                continue
            
            guessed_letters.append(user_input)
            
            if user_input in word:
                print(f"\nОтлично! Буква '{user_input}' есть в слове!")
                # Обновляем word_completion
                for i in range(len(word)):
                    if word[i] == user_input:
                        word_completion = word_completion[:i] + user_input + word_completion[i+1:]
            else:
                print(f"\nУвы! Буквы '{user_input}' нет в слове!")
                tries -= 1
            
            # Проверяем, угадано ли слово полностью
            if '_' not in word_completion:
                guessed = True
                print(display_hangman(tries))
                print(f"\nЗагаданное слово: {word_completion}")
                print("Поздравляем, вы угадали слово! Вы победили!")
                break
    
    # Если попытки закончились
    if tries == 0:
        print(display_hangman(tries))
        print(f"\nВы проиграли! Загаданное слово было: {word}")
        print("Попробуйте в следующий раз!")


def main():
    """Основной цикл программы"""
    print("\n" + "="*50)
    print("ДОБРО ПОЖАЛОВАТЬ В ИГРУ 'ВИСЕЛИЦА'")
    print("="*50)
    print("Правила:")
    print("- Программа загадывает слово, вы должны его угадать")
    print("- Можно называть буквы или слово целиком")
    print("- За каждую ошибку рисуется часть висельника")
    print("- У вас 6 попыток")
    print("="*50)
    
    while True:
        # Генерируем случайное слово
        word = get_word()
        
        # Запускаем игру
        play(word)
        
        # Спрашиваем, хочет ли пользователь сыграть еще раз
        while True:
            play_again = input("\nХотите сыграть еще раз? (да/нет): ").strip().lower()
            if play_again in ['да', 'yes', 'y', 'д']:
                print("\n" + "="*50)
                print("НОВАЯ ИГРА!")
                print("="*50)
                break
            elif play_again in ['нет', 'no', 'n', 'н']:
                print("\nСпасибо за игру! До свидания!")
                return
            else:
                print("Пожалуйста, введите 'да' или 'нет'")


# Запуск программы
if __name__ == "__main__":
    main()