Разработать симулятор броска кубиков
Итак, сегодня вечер настольных ролевых игр, и у всех есть свои мешки с игральными костями, а вы достаете — свой ноутбук? Что ж, сейчас самое время продемонстрировать симулятор броска кубиков, который вы создали на Python. Этот проект для начинающих должен научить вас основам бросков кубиков и рандомизации.
Настройка нашего проекта
Это будет довольно простая установка. Я уже описал, как мы настроили Visual Studio для написания кода на Python, поэтому мы воспользуемся этим для нашей базовой настройки. Мы сделаем это как можно проще, поэтому начнем с импорта:
импортировать tkinter как tk
из tkinter импортировать ttk
импортировать случайный
Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)
Раньше мы использовали Tkinter, когда создавали простой трекер расходов; в данном случае это самое легкое решение. Библиотека позволяет нам создать простой, современный и стильный графический интерфейс. Библиотека случайных чисел дает нам возможность рандомизировать числа между двумя значениями, что и составляет суть броска кубика. Давайте сделаем вещи немного красивее.
Соображения дизайна с нашими игральными гранями
Мы собираемся смоделировать набор игральных костей в ролевой игре. Для стилистического чутья я сделал четырехгранный кубик (d4) и шестигранный кубик (d6) немного необычными, чтобы продемонстрировать обработку изображений ASCII с помощью Tkinter.
def __init__(я, корень):
self.root = корень
self.root.title(“Симулятор игры в кости”)
self.root.geometry(“400×500”)
self.d4_faces = {
1: ” ╱▲╲\n ╱ 1 ╲\n╱ ╲\n‾‾‾‾‾‾‾”,
2: ” ╱▲╲\n ╱ 2 ╲\n╱ ╲\n‾‾‾‾‾‾‾”,
3: ” ╱▲╲\n ╱ 3 ╲\n╱ ╲\n‾‾‾‾‾‾‾”,
4: ” ╱▲╲\n ╱ 4 ╲\n╱ ╲\n‾‾‾‾‾‾‾”
}
self.d6_faces = {
1: “┌─────────┐\n│ │\n│ ● │\n│ │\n└────────┘”,
2: “┌─────────┐\n│ ● │\n│ │\n│ ● │\n└────────┘”,
3: “┌─────────┐\n│ ● │\n│ ● │\n│ ● │\n└────────┘”,
4: “┌─────────┐\n│ ● ● │\n│ │\n│ ● ● │\n└────────┘”,
5: “┌─────────┐\n│ ● ● │\n│ ● │\n│ ● ● │\n└─────────┘”,
6: “┌─────────┐\n│ ● ● │\n│ ● ● │\n│ ● ● │\n└────────┘”
}
Я выбрал это, потому что чувствовал, что графический интерфейс будет намного более заманчивым. Когда мы создавали приложение-викторину, мы придерживались терминала, но мне хотелось бы немного изюминки в этом приложении. Не беспокойтесь об этом фрагменте кода. Все, что он делает, это отображает наш d6 с лицом, похожим на настоящий d6, и то же самое для d4. Это также начало нашего графического интерфейса с названием приложения «Симулятор игры в кости» в верхней части окна. Давайте посмотрим, как мы собираемся вводить данные.
Нам нужно, чтобы пользователь мог ввести количество и тип игральных костей, которые он хочет бросить. Для простоты мы будем максимально увеличивать количество кубиков до пяти, так что с чем-то большим мы не справимся. Таким образом, наш пользовательский интерфейс будет иметь селектор кубика (для типа кубика) и несколько записей кубика, если мы бросаем более одного.
Я также хочу реализовать систему истории для наших бросков, поэтому я помещу ее внизу и буду обновлять ее каждый раз, когда мы бросаем новый набор кубиков. Наш фрагмент кода должен выглядеть примерно так:
self.main_frame = ttk.Frame(self.root, padding=”10″)
self.main_frame.grid(строка=0, столбец=0, липкий=(tk.W, tk.E, tk.N, tk.S))
ttk.Label(self.main_frame, text=”Количество кубиков:”).grid(row=0, columns=0,pady=5)
self.num_dice = ttk.Spinbox(self.main_frame, from_=1, to=5, width=5)
self.num_dice.set(1)
self.num_dice.grid(строка=0, столбец=1, пади=5)
ttk.Label(self.main_frame, text=”Тип кубика:”).grid(строка=1, столбец=0, пади=5)
self.dice_type = ttk.Combobox(self.main_frame,values=[“d4”, “d6”, “d8”, “d12”, “d20”]ширина=5)
self.dice_type.set(“d6”)
self.dice_type.grid(строка=1, столбец=1, пади=5)
self.roll_button = ttk.Button(self.main_frame, text=”Бросать кости!”, команда=self.roll_dice)
self.roll_button.grid(строка=2, столбец=0, диапазон столбцов=2, пади=10)
self.result_text = tk.Text(self.main_frame, высота=15, ширина=40, шрифт=('Курьер', 10))
self.result_text.grid(строка=3, столбец=0, диапазон столбцов=2, пади=10)
ttk.Label(self.main_frame, text=”История прокрутки:”).grid(row=4,column=0, columnspan=2,pady=5)
self.history_text = tk.Text(self.main_frame, высота=5, ширина=40)
self.history_text.grid(строка=5, столбец=0, диапазон столбцов=2, пади=5)
self.roll_history = []
self.main_frame = ttk.Frame(self.root, padding=”10″)
self.main_frame.grid(строка=0, столбец=0, липкий=(tk.W, tk.E, tk.N, tk.S))
ttk.Label(self.main_frame, text=”Количество кубиков:”).grid(row=0, columns=0,pady=5)
self.num_dice = ttk.Spinbox(self.main_frame, from_=1, to=5, width=5)
self.num_dice.set(1)
self.num_dice.grid(строка=0, столбец=1, пади=5)
ttk.Label(self.main_frame, text=”Тип кубика:”).grid(строка=1, столбец=0, пади=5)
self.dice_type = ttk.Combobox(self.main_frame,values=[“d4”, “d6”, “d8”, “d12”, “d20”]ширина=5)
self.dice_type.set(“d6”)
self.dice_type.grid(строка=1, столбец=1, пади=5)
self.roll_button = ttk.Button(self.main_frame, text=”Бросать кости!”, команда=self.roll_dice)
self.roll_button.grid(строка=2, столбец=0, диапазон столбцов=2, пади=10)
self.result_text = tk.Text(self.main_frame, высота=15, ширина=40, шрифт=('Курьер', 10))
self.result_text.grid(строка=3, столбец=0, диапазон столбцов=2, пади=10)
ttk.Label(self.main_frame, text=”История прокрутки:”).grid(row=4,column=0, columnspan=2,pady=5)
self.history_text = tk.Text(self.main_frame, высота=5, ширина=40)
self.history_text.grid(строка=5, столбец=0, диапазон столбцов=2, пади=5)
self.roll_history = []
Это дает нам базовую настройку пользовательского интерфейса для нашего приложения для игры в кости. Перейдем к моделированию роллов.
Бросок игральных костей через компьютер
Если вы когда-либо играли в видеоигру в жанре ролевой игры, вы сталкивались с симуляцией бросков кубиков. Кости определяют ход настольных ролевых игр, их приливы и отливы и то, что происходит с персонажами. Бросок кубика — это случайное число, полученное между двумя значениями: минимальным и максимальным. В Python мы можем использовать библиотеку случайных чисел для имитации этих бросков. Вот наш код:
defroll_single_die(сам, стороны):
“””Имитация броска одной игральной кости с заданным количеством сторон.”””
вернуть случайный.randint(1, стороны)
def get_dice_face(self, value, dice_type):
“””Получить ASCII-изображение лица штампа.”””
если тип_игры == 4:
вернуть self.d4_faces.get(значение, str(значение))
элиф dice_type == 6:
return self.d6_faces.get(значение, str(значение))
вернуть ул (значение)
защитаroll_dice(self):
“””Обработка броска кубиков и обновление отображения.”””
пытаться:
num_dice = int(self.num_dice.get())
dice_type = int(self.dice_type.get()[1:])
self.result_text.delete(1.0, tk.END)
рулоны = [self.roll_single_die(dice_type) for _ in range(num_dice)]
итог = сумма (роллы)
если dice_type в [4, 6]:
для рулонов:
self.result_text.insert(tk.END, self.get_dice_face(roll, dice_type) + “\n”)
еще:
roll_str = “, “.join(str(roll) для рулонов)
self.result_text.insert(tk.END, f”Роллы: {roll_str}\n”)
self.result_text.insert(tk.END, f”\nИтого: {total}”)
roll_record = f”{num_dice}d{dice_type}: {rolls} = {total}”
self.roll_history.append(roll_record)
если len(self.roll_history) > 5:
self.roll_history.pop(0)
self.history_text.delete(1.0, tk.END)
для записи в self.roll_history:
self.history_text.insert(tk.END, запись + “\n”)
кроме ValueError:
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, «Пожалуйста, введите действительные числа»)
Это дает нам базовый код для моделирования бросков кубиков. Чтобы программа заработала, нам просто нужно вызвать нашу основную функцию:
если __name__ == “__main__”:
корень = тк.Тк()
приложение = DiceSimulator (корень)
корень.mainloop()
И это должно сработать. Теперь у нас есть симулятор броска кубиков!
Предложения по обновлениям и обновлениям
Запустив приложение, вы должны увидеть что-то вроде этого:
У приложения есть несколько ограничений, которые я намеренно упустил, чтобы предложить вам возможность расширить приложение. Нет поддержки d10 или d100 (которые можно смоделировать, прокрутив 2d10 или прокрутив 1d100). Вы можете добавить их самостоятельно, если хотите расширить приложение. Кроме того, вы можете расширить это до сетевого ролика игральных костей и сделать пользовательский интерфейс немного красивее с помощью некоторых скинов. Как обычно, весь код этого приложения доступен на моем GitHub. Любые комментарии по поводу кода или моего подхода всегда приветствуются.
Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)