Некоторые проекты, несмотря на свою кажущуюся простоту, дают нам возможность углубиться в важные основные концепции програdммирования и отточить базовые навыки. Создание симулятора игральных костей — отличный способ прокачать начинающим навыки работы с вводом данных, генерацией случайных чисел и манипуляцией строками в Python. Итак, какой план?
num_dice_input = input("Сколько кубиков бросить? [1-6] ")def parse_input(input_string):
    """Возвращает `input_string` как целое число от 1 до 6.
    Проверяет, является ли input_string целым числом между 1 и 6.
    Если да, возвращает целое число. В противном случае сообщает
    пользователю о необходимости ввести корректное число и завершает программу.
    """
    if input_string.strip() in {"1", "2", "3", "4", "5", "6"}:
        return int(input_string)
    else:
        print("Пожалуйста, введите число от 1 до 6.")
        raise SystemExit(1)num_dice_input = input("Сколько костей бросить? [1-6] ")
num_dice = parse_input(num_dice_input)
print(f"Бросили костей: {num_dice}.")import random
def roll_dice(num_dice):
    """Возвращает список целых чисел длиной num_dice.
    
    Каждое целое число в возвращаемом списке представляет собой
    случайное число от 1 до 6 включительно.
    """
    roll_results = []
    for _ in range(num_dice):
        roll = random.randint(1, 6)
        roll_results.append(roll)
    return roll_resultsnum_dice_input = input("Сколько костей бросить? [1-6] ")
num_dice = parse_input(num_dice_input)
roll_results = roll_dice(num_dice)
print(roll_results)DICE_ART = {
    1: (
        "┌─────────┐",
        "│         │",
        "│    ●    │",
        "│         │",
        "└─────────┘",
    ),
    2: (
        "┌─────────┐",
        "│  ●      │",
        "│         │",
        "│      ●  │",
        "└─────────┘",
    ),
    3: (
        "┌─────────┐",
        "│  ●      │",
        "│    ●    │",
        "│      ●  │",
        "└─────────┘",
    ),
    4: (
        "┌─────────┐",
        "│  ●   ●  │",
        "│         │",
        "│  ●   ●  │",
        "└─────────┘",
    ),
    5: (
        "┌─────────┐",
        "│  ●   ●  │",
        "│    ●    │",
        "│  ●   ●  │",
        "└─────────┘",
    ),
    6: (
        "┌─────────┐",
        "│  ●   ●  │",
        "│  ●   ●  │",
        "│  ●   ●  │",
        "└─────────┘",
    ),
}def generate_dice_faces_diagram(dice_values):
    """Возвращает ASCII-диаграмму граней костей из dice_values.
    Возвращаемая строка содержит ASCII-представление каждой кости.
    """
    dice_faces = [DICE_ART[value] for value in dice_values]
    diagram_rows = []
    for row_index in range(5):
        row_components = [face[row_index] for face in dice_faces]
        diagram_rows.append(" ".join(row_components))
    width = len(diagram_rows[0])
    diagram_header = " РЕЗУЛЬТАТЫ ".center(width, "~")
    dice_faces_diagram = "\n".join([diagram_header] + diagram_rows)
    return dice_faces_diagramdice_face_diagram = generate_dice_faces_diagram(roll_results)
print(f"\n{dice_face_diagram}")Сколько костей бросить? [1-6] 6
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ РЕЗУЛЬТАТЫ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│  ●      │ │  ●   ●  │ │  ●   ●  │ │  ●      │ │  ●   ●  │ │  ●      │
│         │ │  ●   ●  │ │  ●   ●  │ │         │ │  ●   ●  │ │    ●    │
│      ●  │ │  ●   ●  │ │  ●   ●  │ │      ●  │ │  ●   ●  │ │      ●  │
└─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘def _get_dice_faces(dice_values):
    """Возвращает список ASCII-представлений для значений костей."""
    return [DICE_ART[value] for value in dice_values]
def _generate_diagram_rows(dice_faces):
    """Генерирует строки диаграммы из ASCII-представлений костей."""
    dice_faces_rows = []
    for row_idx in range(5):
        row_components = [die[row_idx] for die in dice_faces]
        row_string = " ".join(row_components)
        dice_faces_rows.append(row_string)
    return dice_faces_rows
def generate_dice_faces_diagram(dice_values):
    """Возвращает ASCII-диаграмму граней костей из dice_values.
    Возвращаемая строка содержит ASCII-представление каждой кости.
    """
    dice_faces = _get_dice_faces(dice_values)
    dice_faces_rows = _generate_diagram_rows(dice_faces)
    
    width = len(dice_faces_rows[0])
    diagram_header = " РЕЗУЛЬТАТЫ ".center(width, "~")
    
    return "\n".join([diagram_header] + dice_faces_rows)import random
DICE_ART = {
    1: (
        "┌─────────┐",
        "│         │",
        "│    ●    │",
        "│         │",
        "└─────────┘",
    ),
    2: (
        "┌─────────┐",
        "│  ●      │",
        "│         │",
        "│      ●  │",
        "└─────────┘",
    ),
    3: (
        "┌─────────┐",
        "│  ●      │",
        "│    ●    │",
        "│      ●  │",
        "└─────────┘",
    ),
    4: (
        "┌─────────┐",
        "│  ●   ●  │",
        "│         │",
        "│  ●   ●  │",
        "└─────────┘",
    ),
    5: (
        "┌─────────┐",
        "│  ●   ●  │",
        "│    ●    │",
        "│  ●   ●  │",
        "└─────────┘",
    ),
    6: (
        "┌─────────┐",
        "│  ●   ●  │",
        "│  ●   ●  │",
        "│  ●   ●  │",
        "└─────────┘",
    ),
}
def parse_input(input_string):
    """Возвращает input_string как целое число от 1 до 6.
    Проверяет, является ли input_string целым числом между 1 и 6.
    Если да, возвращает целое число. В противном случае сообщает
    пользователю о необходимости ввести корректное число и завершает программу.
    """
    if input_string.strip() in {"1", "2", "3", "4", "5", "6"}:
        return int(input_string)
    else:
        print("Пожалуйста, введите число от 1 до 6.")
        raise SystemExit(1)
def roll_dice(num_dice):
    """Возвращает список целых чисел длиной num_dice.
    
    Каждое целое число в возвращаемом списке представляет собой
    случайное число от 1 до 6 включительно.
    """
    roll_results = []
    for _ in range(num_dice):
        roll = random.randint(1, 6)
        roll_results.append(roll)
    return roll_results
def _get_dice_faces(dice_values):
    """Возвращает список ASCII-представлений для значений костей."""
    return [DICE_ART[value] for value in dice_values]
def _generate_diagram_rows(dice_faces):
    """Генерирует строки диаграммы из ASCII-представлений костей."""
    dice_faces_rows = []
    for row_idx in range(5):
        row_components = [die[row_idx] for die in dice_faces]
        row_string = " ".join(row_components)
        dice_faces_rows.append(row_string)
    return dice_faces_rows
def generate_dice_faces_diagram(dice_values):
    """Возвращает ASCII-диаграмму граней костей из dice_values.
    Возвращаемая строка содержит ASCII-представление каждой кости.
    """
    dice_faces = _get_dice_faces(dice_values)
    dice_faces_rows = _generate_diagram_rows(dice_faces)
    
    width = len(dice_faces_rows[0])
    diagram_header = " РЕЗУЛЬТАТЫ ".center(width, "~")
    
    return "\n".join([diagram_header] + dice_faces_rows)
num_dice_input = input("Сколько костей бросить? [1-6] ")
num_dice = parse_input(num_dice_input)
roll_results = roll_dice(num_dice)
dice_face_diagram = generate_dice_faces_diagram(roll_results)
print(f"\n{dice_face_diagram}")