Найти в Дзене
Время кода

Конь, кнопки и шахматная магия: создаём игру с customtkinter

Шахматы — это игра королей, но что, если мы сосредоточимся только на одном персонаже? В этом уроке мы научимся создавать игру "Конь в шахматах", где игроку предстоит путешествовать по доске, заполняя все клетки. А чтобы всё выглядело стильно, мы воспользуемся библиотекой customtkinter. Готовы оседлать коня? Тогда в путь! Перед началом работы убедитесь, что у вас установлен customtkinter. Если его нет, установите с помощью команды: pip install customtkinter Первым делом нам нужны инструменты: import customtkinter as ctk
from tkinter import messagebox customtkinter — это такой "кастомизированный" tkinter, который делает интерфейс более современным и удобным. messagebox пригодится для дружелюбных (и не очень) всплывающих сообщений. Создадим стильный тёмный интерфейс, ведь шахматы — это интеллектуальный бой, а не цирковое представление. ctk.set_appearance_mode("dark") # Тёмная тема
ctk.set_default_color_theme("green") # Зелёная цветовая схема Главное окно — это как шахматная арена, где
Оглавление

Введение

Шахматы — это игра королей, но что, если мы сосредоточимся только на одном персонаже? В этом уроке мы научимся создавать игру "Конь в шахматах", где игроку предстоит путешествовать по доске, заполняя все клетки. А чтобы всё выглядело стильно, мы воспользуемся библиотекой customtkinter. Готовы оседлать коня? Тогда в путь!

Установка customtkinter

Перед началом работы убедитесь, что у вас установлен customtkinter. Если его нет, установите с помощью команды:

pip install customtkinter

Шаг 1: Импорт библиотек

Первым делом нам нужны инструменты:

import customtkinter as ctk
from tkinter import messagebox

customtkinter — это такой "кастомизированный" tkinter, который делает интерфейс более современным и удобным. messagebox пригодится для дружелюбных (и не очень) всплывающих сообщений.

Шаг 2: Настройка приложения

Создадим стильный тёмный интерфейс, ведь шахматы — это интеллектуальный бой, а не цирковое представление.

ctk.set_appearance_mode("dark") # Тёмная тема
ctk.set_default_color_theme("green") # Зелёная цветовая схема

Шаг 3: Создание основного окна

Главное окно — это как шахматная арена, где будет происходить вся магия.

root = ctk.CTk()
root.title("Конь в шахматах")

Шаг 4: Инициализация переменных

Конь без правил — это просто беспорядок. Нам нужны переменные для контроля игры:

size = 8 # Размер доски
btns = [] # Кнопки-клетки
count = 0 # Счётчик ходов
old_decor = [] # Координаты предыдущего хода
remaining_moves = size * size # Оставшиеся ходы
empty_cells = size * size # Пустые клетки

Шаг 5: Функция хода

Конь ходит буквой "Г", и нам нужно это учесть.

def play(row, col):
global count, old_decor, remaining_moves, empty_cells
if count == 0:
count = 1
btns[row][col].configure(text='🐴', text_color='red')
old_decor.extend([row, col])
remaining_moves -= 1
empty_cells -= 1
else:
x1, y1 = old_decor
x2, y2 = row, col
if (abs(x1 - x2) == 1 and abs(y1 - y2) == 2) or (abs(x1 - x2) == 2 and abs(y1 - y2) == 1):
btns[row][col].configure(text='🐴', text_color='red')
btns[x1][y1].configure(text_color='black')
old_decor[:] = [row, col]
remaining_moves -= 1
empty_cells -= 1
else:
messagebox.showinfo("Ошибка", "Недопустимый ход!")
return
moves_label.configure(text=f"Осталось ходов: {remaining_moves}")
if empty_cells == 0:
messagebox.showinfo("Победа!", "Вы заполнили всю доску!")
root.quit()
elif remaining_moves == 0:
messagebox.showinfo("Проигрыш", f"Ходы закончились! Осталось пустых клеток: {empty_cells}")
root.quit()

Шаг 6: Переключение темы

Настроение бывает разное: иногда хочется светлую тему.

def toggle_theme():
if ctk.get_appearance_mode() == "dark":
ctk.set_appearance_mode("light")
theme_button.configure(text="Тёмная тема")
else:
ctk.set_appearance_mode("dark")
theme_button.configure(text="Светлая тема")

Шаг 7: Изменение цветовой схемы

Кому-то зелёный, кому-то синий — добавим выбор.

def change_color_theme(theme):
ctk.set_default_color_theme(theme)
for row in btns:
for btn in row:
btn.configure(fg_color='gray' if (btns.index(row) + row.index(btn)) % 2 else ctk.ThemeManager.theme["CTkButton"]["fg_color"])

Шаг 8: Создание шахматной доски

Настало время оживить кнопки и расставить их по местам.

for row in range(size):
line = []
for col in range(size):
btn = ctk.CTkButton(root, text=' ', font=('arial', 20), width=50, height=50, command=lambda r=row, c=col: play(r, c))
if (row + col) % 2:
btn.configure(fg_color='gray')
btn.grid(row=row, column=col)
line.append(btn)
btns.append(line)

Шаг 9: Панель управления

Добавим кнопки для удобства.

control_frame = ctk.CTkFrame(root)
control_frame.grid(row=size, column=0, columnspan=size, pady=10)

theme_button = ctk.CTkButton(control_frame, text="Светлая тема", command=toggle_theme)
theme_button.pack(side="left", padx=10)

color_themes = ["green", "blue", "dark-blue"]
theme_selector = ctk.CTkOptionMenu(control_frame, values=color_themes, command=change_color_theme)
theme_selector.pack(side="left", padx=10)

moves_label = ctk.CTkLabel(control_frame, text=f"Осталось ходов: {remaining_moves}", font=("arial", 14))
moves_label.pack(side="left", padx=10)

Шаг 10: Запуск игры

Наконец, запускаем всё это дело.

root.mainloop()

Заключение

Поздравляю! Теперь у вас есть игра, в которой можно почувствовать себя шахматным рыцарем. Можно добавить уровни сложности, поддержку сохранений или даже искусственный интеллект для анализа ходов. Главное — экспериментируйте и не бойтесь учиться новому!

поддержать автора