Игра в виселицу — это классическая настольная игра, в которой игроки пытаются угадать слово, по одной букве за раз, прежде чем допустят слишком много ошибок. Создание такой игры является отличным упражнением для изучения Python, так как включает в себя работу с логикой, обработку ввода/вывода и практику написания чистого и структурированного кода.
Необходимые технологии и библиотеки
Для реализации игры в виселицу нам понадобятся:
- Python 3: Используем стандартную библиотеку Python.
- PEP 8: Будем следовать стандартам форматирования кода PEP 8, чтобы поддерживать читаемость и качество кода.
Подготовка рабочего окружения
Установка Python
- Скачайте установочную версию Python с официального сайта python.org.
- Следуйте инструкциям для вашей операционной системы.
- Проверьте установку, выполнив в терминале:
python --version
Создание структуры проекта
- Создайте новую директорию для проекта:
sh
mkdir hangman
cd hangman - Создайте виртуальное окружение и активируйте его:
sh
python -m venv venv
source venv/bin/activate # Для Windows: venv\Scripts\activate
hangman/
│
├── venv/
│
├── main.py
│
├── words.txt
Основные компоненты игры
Генерация случайного слова
Для генерации случайного слова будем использовать модуль random
.
import random
from typing import List
def load_words(filepath: str) -> List[str]:
"""Загружает слова из файла и возвращает их в виде списка"""
with open(filepath, 'r') as file:
words = file.read().splitlines()
return words
def choose_random_word(words: List[str]) -> str:
"""Возвращает случайно выбранное слово из списка"""
return random.choice(words)
words = load_words('words.txt')
secret_word = choose_random_word(words)
print(f"Секретное слово: {secret_word}")
Логика игры
Создадим функции для управления логикой игры.
def display_current_state(secret_word: str, guessed_letters: List[str]) -> None:
"""Отображает текущее состояние угадывания"""
displayed_word = ''.join([letter if letter in guessed_letters else '_' for letter in secret_word])
print(f"Текущее состояние: {displayed_word}")
def is_word_guessed(secret_word: str, guessed_letters: List[str]) -> bool:
"""Проверяет, угадано ли слово полностью"""
return all(letter in guessed_letters for letter in secret_word)
def update_guessed_letters(guessed_letters: List[str], new_letter: str) -> None:
"""Добавляет новую букву к списку уже угаданных букв"""
guessed_letters.append(new_letter)
# Инициализация игры
guessed_letters = []
mistakes = 0
max_mistakes = 6
while mistakes < max_mistakes and not is_word_guessed(secret_word, guessed_letters):
display_current_state(secret_word, guessed_letters)
guess = input("Введите букву: ").lower()
if guess in secret_word:
update_guessed_letters(guessed_letters, guess)
else:
mistakes += 1
print(f"Неправильно! Осталось попыток: {max_mistakes - mistakes}")
if is_word_guessed(secret_word, guessed_letters):
print(f"Поздравляем! Вы угадали слово: {secret_word}")
else:
print(f"Вы проиграли! Секретное слово было: {secret_word}")
Создание пользовательского интерфейса
Консольный интерфейс
Мы уже реализовали основной вывод состояния игры в консоль. Следует убедиться, что код форматирован в соответствии с PEP 8 и снабжен комментариями.
def display_current_state(secret_word: str, guessed_letters: List[str]) -> None:
"""
Отображает текущее состояние угадывания
:param secret_word: Секретное слово.
:param guessed_letters: Список угадываемых букв.
"""
displayed_word = ''.join([letter if letter in guessed_letters else '_' for letter in secret_word])
print(f"Текущее состояние: {displayed_word}")
Дополнительные возможности
Можно добавить подсказки или уровни сложности. Пример функции, дающей подсказку игроку:
def provide_hint(secret_word: str, guessed_letters: List[str]) -> str:
"""Предоставляет подсказку, возвращая одну из неугаданных букв"""
remaining_letters = [letter for letter in secret_word if letter not in guessed_letters]
return random.choice(remaining_letters)
hint = provide_hint(secret_word, guessed_letters)
print(f"Подсказка: {hint}")
Тестирование кода
Тестирование помогает убедиться в корректности работы программы. Рассмотрим примеры юнит-тестов с использованием библиотеки unittest
.
import unittest
class TestHangman(unittest.TestCase):
def test_load_words(self):
words = load_words('words.txt')
self.assertGreater(len(words), 0)
def test_choose_random_word(self):
words = ["apple", "banana", "cherry"]
word = choose_random_word(words)
self.assertIn(word, words)
def test_is_word_guessed(self):
self.assertTrue(is_word_guessed("apple", ["a", "p", "l", "e"]))
self.assertFalse(is_word_guessed("banana", ["a", "n"]))
if __name__ == "__main__":
unittest.main()
Оптимизация и улучшение кода
Оптимизация включает улучшение производительности и читаемости кода. Пример улучшения производительности:
@lru_cache(maxsize=None) # Используем кэширование для ускорения повторных вычислений
def compute_heavy_function(param: int) -> int:
# Некоторая тяжелая функция
pass
Для улучшения читаемости кода используйте аннотации типов и комментарии.
Выводы
Создание игры в виселицу — это отличная практика для изучения Python. Вы познакомились с генерацией случайных чисел, логикой игры, обработкой строк и консольным интерфейсом. Эта практика помогает улучшить навыки написания чистого и структурированного кода.