Некоторые проекты, несмотря на свою кажущуюся простоту, дают нам возможность углубиться в важные основные концепции програ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_results
num_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_diagram
dice_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}")