/
maksud31
/
IT_TOP_PRACTICA
Обзор
Документация
Войти
/
maksud31
/
IT_TOP_PRACTICA
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
tests/ui.py
176 строк
7 KB
maksud31
загрузка тестирования проекта
25 дек 2025, 14:24
25 дек 2025, 14:24
0305b8c
Код
Авторство
О чём код?
#!/usr/bin/env python3 """ Модуль пользовательского интерфейса. """ import os import sys from typing import List, Dict, Optional class ConsoleUI: """Класс для работы с консольным интерфейсом.""" def __init__(self): pass def clear_screen(self): os.system('cls' if os.name == 'nt' else 'clear') def display_main_menu(self, current_player: Optional[str] = None): self.clear_screen() print("=" * 50) print(" ИГРА 'ВИСЕЛИЦА'") print("=" * 50) if current_player: print(f"Текущий игрок: {current_player}") else: print("Текущий игрок: не выбран") print("\nМЕНЮ:") print("1. Новая игра") print("2. Моя статистика") print("3. Таблица рекордов") print("4. Сменить игрока") print("5. Выход") print() def display_game_state(self, state: Dict): self.clear_screen() print("=" * 50) print(" ИГРА ВИСЕЛИЦА") print("=" * 50) print(state['gallows_state']) print(f"\nСлово: {state['display_word']}") print(f"\nОшибок: {state['errors_count']}/{state['remaining_attempts'] + state['errors_count']}") if state['wrong_letters']: print(f"Неверные буквы: {', '.join(state['wrong_letters'])}") if state['guessed_letters']: print(f"Угаданные буквы: {', '.join(state['guessed_letters'])}") print("-" * 50) def display_player_statistics(self, stats: Dict): self.clear_screen() print("=" * 50) print(f" СТАТИСТИКА ИГРОКА: {stats['name']}") print("=" * 50) print(f"\nОбщая статистика:") print(f" Всего игр: {stats['total_games']}") print(f" Побед: {stats['wins']}") print(f" Поражений: {stats['losses']}") print(f" Процент побед: {stats['win_rate']}%") if stats['best_time']: print(f" Лучшее время: {stats['best_time']}") if stats['guessed_words']: print(f"\nПоследние угаданные слова:") for word in stats['guessed_words'][:5]: print(f" - {word}") if stats['last_game']: print(f"\nПоследняя игра:") game = stats['last_game'] result = "Победа" if game['result'] == 'win' else "Поражение" print(f" Дата: {game['date']}") print(f" Слово: {game['word']}") print(f" Результат: {result}") print(f" Время: {game['time_seconds']} сек.") print(f" Ошибок: {game['errors_count']}") print("\n" + "=" * 50) input("\nНажмите Enter для возврата в меню...") def display_leaderboard(self, leaderboard: List[Dict], title: str): self.clear_screen() print("=" * 60) print(f" {title}") print("=" * 60) if not leaderboard: print("\nТаблица рекордов пуста!") print("Сыграйте хотя бы одну игру, чтобы попасть в таблицу.") else: print("\n№ Имя игрока Побед Игр % побед Лучшее время") print("-" * 60) for i, player in enumerate(leaderboard, 1): name = player['name'][:18].ljust(18) wins = str(player['wins']).rjust(4) total = str(player['total_games']).rjust(4) win_rate = f"{player['win_rate']:6.1f}%" best_time = '--:--' if player['best_time'] is not None: minutes = player['best_time'] // 60 seconds = player['best_time'] % 60 best_time = f"{minutes:02d}:{seconds:02d}" print(f"{i:<2} {name} {wins} {total} {win_rate} {best_time}") print("\n" + "=" * 60) input("\nНажмите Enter для возврата в меню...") def display_leaderboard_menu(self): self.clear_screen() print("=" * 50) print(" ТАБЛИЦА РЕКОРДОВ") print("=" * 50) print("\nВыберите критерий сортировки:") print("1. По количеству побед") print("2. По проценту побед") print("3. По лучшему времени") print("0. Вернуться в главное меню") print() def get_menu_choice(self, valid_choices: Optional[List[str]] = None): if valid_choices is None: valid_choices = ['1', '2', '3', '4', '5'] while True: try: choice = input("Выберите действие: ").strip() if choice in valid_choices: return choice else: print(f"Неверный выбор! Допустимые значения: {', '.join(valid_choices)}") except: sys.exit(0) def get_letter_input(self): while True: try: letter = input("\nВведите букву: ").strip().upper() if letter in ['ВЫХОД', 'EXIT', 'QUIT']: raise KeyboardInterrupt return letter except: raise def get_player_name(self, prompt: str): while True: try: name = input(prompt).strip() if name and len(name) <= 20: return name else: print("Имя не должно быть пустым и не должно превышать 20 символов!") except: raise def display_message(self, message: str): print(f"\n{message}") def display_error(self, error_message: str): print(f"\n[ОШИБКА] {error_message}") input("\nНажмите Enter для продолжения...") def pause(self, seconds: int = 1): import time time.sleep(seconds)