Добавление полных правил шахмат (как ходят все фигуры, шахи, маты) и рокировки превращает простую визуализацию в полноценный шахматный движок. Чтобы код оставался понятным, компактным и умещался в один скрипт, мы добавим базовую валидацию ходов для каждой фигуры и логику рокировки (короткой и длинной).
Рокировка будет выполняться автоматически: если вы перетаскиваете Короля на две клетки влево или вправо, программа сама проверит условия и передвинет соответствующую Ладью.
Полный код шахмат с правилами и рокировкой
import sys
import pygame
# Инициализация Pygame
pygame.init()
# Константы графики
CELL_SIZE = 80
BOARD_SIZE = CELL_SIZE * 8
WINDOW_SIZE = BOARD_SIZE + 40
OFFSET = 20
# Цвета (RGB)
COLOR_LIGHT = (240, 217, 181)
COLOR_DARK = (181, 136, 99)
COLOR_BG = (49, 46, 43)
COLOR_TEXT = (255, 255, 255)
COLOR_SELECTED = (130, 151, 105)
# Настройка окна
screen = pygame.display.set_mode((WINDOW_SIZE, WINDOW_SIZE + 40)) # Окно чуть выше для текста статуса
pygame.display.set_caption("Шахматы с правилами и рокировкой")
# Подключение шрифта
font_pieces = pygame.font.SysFont("arial", int(CELL_SIZE * 0.8))
font_labels = pygame.font.SysFont("arial", 16)
font_status = pygame.font.SysFont("arial", 20, bold=True)
# Коды фигур Юникод
white_pieces = {'R': '\u2656', 'N': '\u2658', 'B': '\u2657', 'Q': '\u2655', 'K': '\u2654', 'P': '\u2659'}
black_pieces = {'r': '\u265C', 'n': '\u265E', 'b': '\u265D', 'q': '\u265B', 'k': '\u265A', 'p': '\u265F'}
# Начальная расстановка
board = [
['r', 'n', 'b', 'q', 'k', 'b', 'n', 'r'],
['p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'],
['.', '.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.', '.'],
['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'],
['R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R']
]
# Переменные состояния
selected_cell = None
dragged_piece = None
drag_start_pos = None
white_turn = True
# Флаги для рокировки (двигались ли короли и ладьи)
moved_K = False
moved_R_left = False # Белая левая (a1)
moved_R_right = False # Белая правая (h1)
moved_k = False
moved_r_left = False # Черная левая (a8)
moved_r_right = False # Черная правая (h8)
def get_cell_from_pos(pos):
x, y = pos
col = (x - OFFSET) // CELL_SIZE
row = (y - OFFSET) // CELL_SIZE
if 0 <= col < 8 and 0 <= row < 8:
return row, col
return None
def is_path_clear(start, end):
"""Проверяет, свободны ли клетки между стартом и финишем по прямой/диагонали."""
sr, sc = start
er, ec = end
dr = 1 if er > sr else (-1 if er < sr else 0)
dc = 1 if ec > sc else (-1 if ec < sc else 0)
r, c = sr + dr, sc + dc
while (r, c) != (er, ec):
if board[r][c] != '.':
return False
r += dr
c += dc
return True
def is_valid_move(piece, start, end):
"""Базовая валидация ходов по правилам шахмат."""
sr, sc = start
er, ec = end
# Нельзя ходить туда же, где стоишь
if start == end:
return False
target = board[er][ec]
is_white = piece.isupper()
# Нельзя бить свои фигуры
if target != '.':
if is_white == target.isupper():
return False
dr = abs(er - sr)
dc = abs(ec - sc)
# ПЕШКА
if piece.lower() == 'p':
direction = -1 if is_white else 1
start_row = 6 if is_white else 1
# Ход вперед на 1 клетку
if sc == ec and target == '.' and (er - sr) == direction:
return True
# Ход вперед на 2 клетки со стартовой позиции
if sc == ec and target == '.' and sr == start_row and (er - sr) == 2 * direction:
return board[sr + direction][sc] == '.'
# Взятие по диагонали
if dc == 1 and (er - sr) == direction and target != '.':
return True
return False
# КОНЬ
elif piece.lower() == 'n':
return (dr == 2 and dc == 1) or (dr == 1 and dc == 2)
# СЛОН
elif piece.lower() == 'b':
if dr == dc:
return is_path_clear(start, end)
return False
# ЛАДЬЯ
elif piece.lower() == 'r':
if sr == er or sc == ec:
return is_path_clear(start, end)
return False
# ФЕРЗЬ
elif piece.lower() == 'q':
if (dr == dc) or (sr == er or sc == ec):
return is_path_clear(start, end)
return False
# КОРОЛЬ
elif piece.lower() == 'k':
# Обычный ход короля на 1 клетку в любую сторону
if dr <= 1 and dc <= 1:
return True
# ЛОГИКА РОКИРОВКИ
if dr == 0 and dc == 2:
# Белая рокировка
if is_white and not moved_K:
if ec == 6 and not moved_R_right and is_path_clear(start, (sr, 7)): # Короткая
return True
if ec == 2 and not moved_R_left and is_path_clear(start, (sr, 0)): # Длинная
return True
# Черная рокировка
elif not is_white and not moved_k:
if ec == 6 and not moved_r_right and is_path_clear(start, (sr, 7)): # Короткая
return True
if ec == 2 and not moved_r_left and is_path_clear(start, (sr, 0)): # Длинная
return True
return False
return False
def check_and_execute_castling(piece, start, end):
"""Если сделан ход рокировки, передвигает ладью автоматически."""
global moved_K, moved_R_left, moved_R_right, moved_k, moved_r_left, moved_r_right
sr, sc = start
er, ec = end
if piece == 'K' and sr == 7 and sc == 4:
if ec == 6: # Короткая белая
board[7][5] = 'R'
board[7][7] = '.'
elif ec == 2: # Длинная белая
board[7][3] = 'R'
board[7][0] = '.'
moved_K = True
elif piece == 'k' and sr == 0 and sc == 4:
if ec == 6: # Короткая черная
board[0][5] = 'r'
board[0][7] = '.'
elif ec == 2: # Длинная черная
board[0][3] = 'r'
board[0][0] = '.'
moved_k = True
def track_moved_pieces(piece, start):
"""Фиксирует, если ключевые фигуры сдвинулись с места (для запрета рокировки в будущем)."""
global moved_K, moved_R_left, moved_R_right, moved_k, moved_r_left, moved_r_right
sr, sc = start
if piece == 'K': moved_K = True
elif piece == 'k': moved_k = True
elif piece == 'R' and sr == 7 and sc == 0: moved_R_left = True
elif piece == 'R' and sr == 7 and sc == 7: moved_R_right = True
elif piece == 'r' and sr == 0 and sc == 0: moved_r_left = True
elif piece == 'r' and sr == 0 and sc == 7: moved_r_right = True
def draw_board():
screen.fill(COLOR_BG)
# Отрисовка разметки (буквы и цифры)
letters = "ABCDEFGH"
for i in range(8):
lbl_num = font_labels.render(str(8 - i), True, COLOR_TEXT)
screen.blit(lbl_num, (5, OFFSET + i * CELL_SIZE + CELL_SIZE // 2 - 8))
lbl_let = font_labels.render(letters[i], True, COLOR_TEXT)
screen.blit(lbl_let, (OFFSET + i * CELL_SIZE + CELL_SIZE // 2 - 5, BOARD_SIZE + OFFSET + 2))
# Отрисовка клеток
for row in range(8):
for col in range(8):
x = OFFSET + col * CELL_SIZE
y = OFFSET + row * CELL_SIZE
if selected_cell == (row, col) or drag_start_pos == (row, col):
cell_color = COLOR_SELECTED
else:
is_light = (row + col) % 2 == 0
cell_color = COLOR_LIGHT if is_light else COLOR_DARK
pygame.draw.rect(screen, cell_color, (x, y, CELL_SIZE, CELL_SIZE))
# Рисуем статичные фигуры
cell_content = board[row][col]
if cell_content != '.' and (drag_start_pos != (row, col)):
draw_piece_at(cell_content, x + CELL_SIZE // 2, y + CELL_SIZE // 2)
# Отрисовка фигуры под курсором
if dragged_piece:
mouse_x, mouse_y = pygame.mouse.get_pos()
draw_piece_at(dragged_piece, mouse_x, mouse_y)
# Текст статуса игры (чей ход) внизу окна
turn_text = "Ход: БЕЛЫЕ" if white_turn else "Ход: ЧЕРНЫЕ"
status_surface = font_status.render(turn_text, True, COLOR_TEXT)
screen.blit(status_surface, (OFFSET, WINDOW_SIZE + 5))
def draw_piece_at(piece, center_x, center_y):
if piece.isupper():
char = white_pieces[piece]
p_color = (255, 255, 255)
else:
char = black_pieces[piece]
p_color = (0, 0, 0)
piece_surface = font_pieces.render(char, True, p_color)
p_rect = piece_surface.get_rect()
p_rect.center = (center_x, center_y)
screen.blit(piece_surface, p_rect)
# Главный цикл программы
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
cell = get_cell_from_pos(event.pos)
if cell:
row, col = cell
piece = board[row][col]
is_white_piece = piece.isupper()
correct_turn = (white_turn and is_white_piece) or (not white_turn and not is_white_piece and piece != '.')
if correct_turn:
selected_cell = cell
dragged_piece = piece
drag_start_pos = cell
else:
selected_cell = None
elif event.type == pygame.MOUSEBUTTONUP:
if event.button == 1 and dragged_piece:
cell = get_cell_from_pos(event.pos)
start_row, start_col = drag_start_pos
if cell:
end_row, end_col = cell
# Проверяем ход на соответствие правилам выбранной фигуры
if is_valid_move(dragged_piece, drag_start_pos, cell):
# Срабатывает, если ход был рокировкой (передвинет ладью)
check_and_execute_castling(dragged_piece, drag_start_pos, cell)
# Запоминаем, двигались ли ладьи или король для будущих рокировок
track_moved_pieces(dragged_piece, drag_start_pos)
# Перемещаем фигуру
board[end_row][end_col] = dragged_piece
board[start_row][start_col] = '.'
# Передаем ход
white_turn = not white_turn
# Сброс перетаскивания
dragged_piece = None
drag_start_pos = None
selected_cell = None
draw_board()
pygame.display.flip()
pygame.quit()
sys.exit()
### Реализованные правила шахмат и рокировки:
1. **Правила движения**:
* **Пешки** ходят на 1 клетку вперед (или на 2 со старта) и бьют по диагонали.
* **Кони** прыгают буквой «Г» и могут переступать другие фигуры.
* **Слоны, Ладьи, Ферзи** ходят по своим осям, но встроенная функция `is_path_clear` блокирует их, если на пути стоит любая другая фигура.
2. **Как сделать рокировку**:
* Выберите **Короля** (белого `E1` или черного `E8`) и перетащите его **на две клетки** в сторону ладьи (на `G1`/`C1` для белых или `G8`/`C8` для черных).
* Если между королем и ладьей пусто, а сами они ни разу за игру еще не ходили — программа одобрит ход и **сама перекинет ладью** на нужное место.
3. **Статус игры**: Снизу окна добавлена текстовая строка, которая наглядно показывает, чей сейчас ход.
*(Примечание: Для простоты и компактности кода здесь опущены шах, мат, взятие на проходе и превращение пешки при достижении края, так как полноценный просчет шахов требует сильного усложнения кода. Фигуры пока можно двигать свободно, если ход соответствует их паттерну).*
Если вы захотите сделать игру еще интереснее, напишите:
* Нужно ли добавить **превращение пешки** в ферзя, когда она доходит до противоположного конца доски?
* Хотите добавить **таймер времени** (часы) для каждого игрока?
Вот готовый и полностью рабочий код на Pygame, в котором реализована полноценная игра для двух игроков на одном экране.
В программу добавлены:
- Выделение клетки при нажатии.
- Перетаскивание фигур (Drag-and-Drop) мышкой.
- Ограничение по очереди ходов (белые и черные ходят строго по очереди, начиная с белых).
- Возврат фигуры, если ход был сделан на ту же самую клетку или за пределы доски.
Полный код игры
import sys
import pygame
# Инициализация Pygame
pygame.init()
# Константы графики
CELL_SIZE = 80
BOARD_SIZE = CELL_SIZE * 8
WINDOW_SIZE = BOARD_SIZE + 40 # Окно чуть больше доски для отступов под буквы/цифры
OFFSET = 20 # Отступ доски от края окна
# Цвета (RGB)
COLOR_LIGHT = (240, 217, 181) # Светлые клетки
COLOR_DARK = (181, 136, 99) # Темные клетки
COLOR_BG = (49, 46, 43) # Фон окна
COLOR_TEXT = (255, 255, 255) # Цвет текста разметки
COLOR_SELECTED = (130, 151, 105) # Цвет выделенной клетки (зеленоватый)
# Настройка окна
screen = pygame.display.set_mode((WINDOW_SIZE, WINDOW_SIZE))
pygame.display.set_caption("Шахматы для двух игроков")
# Подключение шрифта с поддержкой Юникода
font_pieces = pygame.font.SysFont("arial", int(CELL_SIZE * 0.8))
font_labels = pygame.font.SysFont("arial", 16)
# Словари с Юникод-кодами шахматных фигур
white_pieces = {'R': '\u2656', 'N': '\u2658', 'B': '\u2657', 'Q': '\u2655', 'K': '\u2654', 'P': '\u2659'}
black_pieces = {'r': '\u265C', 'n': '\u265E', 'b': '\u265D', 'q': '\u265B', 'k': '\u265A', 'p': '\u265F'}
# Начальная расстановка
board = [
['r', 'n', 'b', 'q', 'k', 'b', 'n', 'r'],
['p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'],
['.', '.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.', '.'],
['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'],
['R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R']
]
# Переменные состояния игры
selected_cell = None # Координаты (row, col) выбранной клетки
dragged_piece = None # Символ перетаскиваемой фигуры (например, 'P')
drag_start_pos = None # Откуда начали тащить (row, col)
white_turn = True # True - ходят белые, False - черные
def get_cell_from_pos(pos):
"""Определяет строку и столбец на доске по координатам мыши."""
x, y = pos
col = (x - OFFSET) // CELL_SIZE
row = (y - OFFSET) // CELL_SIZE
if 0 <= col < 8 and 0 <= row < 8:
return row, col
return None
def draw_board():
screen.fill(COLOR_BG)
# Отрисовка разметки (буквы и цифры)
letters = "ABCDEFGH"
for i in range(8):
lbl_num = font_labels.render(str(8 - i), True, COLOR_TEXT)
screen.blit(lbl_num, (5, OFFSET + i * CELL_SIZE + CELL_SIZE // 2 - 8))
lbl_let = font_labels.render(letters[i], True, COLOR_TEXT)
screen.blit(lbl_let, (OFFSET + i * CELL_SIZE + CELL_SIZE // 2 - 5, BOARD_SIZE + OFFSET + 2))
# Отрисовка клеток и статичных фигур
for row in range(8):
for col in range(8):
x = OFFSET + col * CELL_SIZE
y = OFFSET + row * CELL_SIZE
# Подсветка выделенной клетки или клетки, откуда тащат фигуру
if selected_cell == (row, col) or drag_start_pos == (row, col):
cell_color = COLOR_SELECTED
else:
is_light = (row + col) % 2 == 0
cell_color = COLOR_LIGHT if is_light else COLOR_DARK
pygame.draw.rect(screen, cell_color, (x, y, CELL_SIZE, CELL_SIZE))
# Рисуем фигуру (только если её сейчас не тащат мышкой)
cell_content = board[row][col]
if cell_content != '.' and (drag_start_pos != (row, col)):
draw_piece_at(cell_content, x + CELL_SIZE // 2, y + CELL_SIZE // 2)
# Отрисовка перетаскиваемой фигуры прямо под курсором мыши
if dragged_piece:
mouse_x, mouse_y = pygame.mouse.get_pos()
draw_piece_at(dragged_piece, mouse_x, mouse_y)
def draw_piece_at(piece, center_x, center_y):
"""Вспомогательная функция отрисовки фигуры по центру координат."""
if piece.isupper():
char = white_pieces[piece]
p_color = (255, 255, 255) # Белые фигуры
else:
char = black_pieces[piece]
p_color = (0, 0, 0) # Черные фигуры
piece_surface = font_pieces.render(char, True, p_color)
p_rect = piece_surface.get_rect()
p_rect.center = (center_x, center_y)
screen.blit(piece_surface, p_rect)
# Главный цикл программы
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1: # Левая кнопка мыши
cell = get_cell_from_pos(event.pos)
if cell:
row, col = cell
piece = board[row][col]
# Проверяем, принадлежит ли фигура игроку, который сейчас должен ходить
is_white_piece = piece.isupper()
correct_turn = (white_turn and is_white_piece) or (not white_turn and not is_white_piece and piece != '.')
if correct_turn:
selected_cell = cell
dragged_piece = piece
drag_start_pos = cell
else:
# Клик по пустой клетке или чужой фигуре сбрасывает выделение
selected_cell = None
elif event.type == pygame.MOUSEBUTTONUP:
if event.button == 1 and dragged_piece:
cell = get_cell_from_pos(event.pos)
start_row, start_col = drag_start_pos
if cell and cell != drag_start_pos:
end_row, end_col = cell
target_piece = board[end_row][end_col]
# Запрещаем бить свои же фигуры
is_destination_friendly = (white_turn and target_piece.isupper()) or (not white_turn and target_piece.islower() and target_piece != '.')
if not is_destination_friendly:
# Делаем ход
board[end_row][end_col] = dragged_piece
board[start_row][start_col] = '.'
white_turn = not white_turn # Передаем ход другому игроку
# Сбрасываем режим перетаскивания фигурки
dragged_piece = None
drag_start_pos = None
selected_cell = None
# Обновление графики
draw_board()
pygame.display.flip()
pygame.quit()
sys.exit()
Как играть (управление):
- Очередь ходов: Игра начинается с хода Белых. Черные фигуры взять или перетащить в первый ход не получится. После успешного переноса белой фигуры ход автоматически переходит к Черным.
- Перетаскивание (Drag-and-Drop): Зажмите фигуру левой кнопкой мыши (клетка подсветится зеленым), перетащите её на нужную позицию и отпустите кнопку.
- Правила взятия: Вы можете перемещать фигуры на пустые клетки или на клетки с фигурами соперника (в этом случае фигура соперника исчезнет). Поставить свою фигуру на свою же — программа не позволит.
Если вы хотите продолжить улучшение шахмат, дайте знать:
- Нужно ли добавить валидацию ходов по правилам шахмат (например, чтобы пешка ходила только вперед, конь буквой «Г» и т.д.)?
- Хотите ли вы добавить звук взятия фигур или анимацию?
- Нужно ли выводить на экран надпись, чей сейчас ход?
Да, вывести текстовые символы Юникода в графическое окно pygame можно. Для этого используется модуль pygame.font.
Основная хитрость заключается в том, что стандартный шрифт Pygame не всегда корректно поддерживает шахматные символы Юникода. Чтобы они гарантированно отображались, лучше использовать системный шрифт, который точно содержит эти символы (например, Arial, Segoe UI Symbol или DejaVu Sans).
Ниже представлен готовый скрипт, который создаёт графическое окно, рисует цветную шахматную сетку и поверх неё отрисовывает фигуры из кодов символов.
Готовый код на Pygame
import sys
import pygame
# Инициализация Pygame
pygame.init()
# Константы графики
CELL_SIZE = 80
BOARD_SIZE = CELL_SIZE * 8
WINDOW_SIZE = BOARD_SIZE + 40 # Окно чуть больше доски для отступов под буквы/цифры
OFFSET = 20 # Отступ доски от края окна
# Цвета (RGB)
COLOR_LIGHT = (240, 217, 181) # Светлые клетки
COLOR_DARK = (181, 136, 99) # Темные клетки
COLOR_BG = (49, 46, 43) # Фон окна
COLOR_TEXT = (255, 255, 255) # Цвет текста разметки
# Настройка окна
screen = pygame.display.set_mode((WINDOW_SIZE, WINDOW_SIZE))
pygame.display.set_caption("Шахматная доска на Pygame (Unicode)")
# Подключение шрифта с поддержкой Юникод-фигур
# SysFont автоматически подберет подходящий шрифт из системы (Arial обычно работает везде)
font_pieces = pygame.font.SysFont("arial", int(CELL_SIZE * 0.8))
font_labels = pygame.font.SysFont("arial", 16)
# Словари с Юникод-кодами шахматных фигур
white_pieces = {
'R': '\u2656', 'N': '\u2658', 'B': '\u2657',
'Q': '\u2655', 'K': '\u2654', 'P': '\u2659'
}
black_pieces = {
'r': '\u265C', 'n': '\u265E', 'b': '\u265D',
'q': '\u265B', 'k': '\u265A', 'p': '\u265F'
}
# Начальная расстановка
board = [
['r', 'n', 'b', 'q', 'k', 'b', 'n', 'r'],
['p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'],
['.', '.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '.', '.', '.', '.', '.'],
['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'],
['R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R']
]
def draw_board():
# Заливка фона
screen.fill(COLOR_BG)
# Отрисовка разметки (буквы и цифры)
letters = "ABCDEFGH"
for i in range(8):
# Цифры слева (8-1)
lbl_num = font_labels.render(str(8 - i), True, COLOR_TEXT)
screen.blit(lbl_num, (5, OFFSET + i * CELL_SIZE + CELL_SIZE // 2 - 8))
# Буквы снизу (A-H)
lbl_let = font_labels.render(letters[i], True, COLOR_TEXT)
screen.blit(lbl_let, (OFFSET + i * CELL_SIZE + CELL_SIZE // 2 - 5, BOARD_SIZE + OFFSET + 2))
# Отрисовка клеток и фигур
for row in range(8):
for col in range(8):
# Координаты левого верхнего угла клетки
x = OFFSET + col * CELL_SIZE
y = OFFSET + row * CELL_SIZE
# 1. Рисуем клетку доски
is_light = (row + col) % 2 == 0
cell_color = COLOR_LIGHT if is_light else COLOR_DARK
pygame.draw.rect(screen, cell_color, (x, y, CELL_SIZE, CELL_SIZE))
# 2. Рисуем фигуру, если она есть
cell_content = board[row][col]
if cell_content != '.':
# Определяем символ фигуры
if cell_content.isupper():
char = white_pieces[cell_content]
# Для белых фигур на светлом фоне можно задать черный контур,
# но Pygame рендерит Юникод-фигуры как обычный текст определенного цвета.
# Сделаем сами фигуры черными/белыми для контраста:
piece_color = (255, 255, 255) if cell_content.islower() else (255, 255, 255)
else:
char = black_pieces[cell_content]
# Рендерим символ в картинку (True включает сглаживание)
# Чтобы фигуры хорошо читались на любых клетках, черные сделаем черными, белые — белыми
p_color = (255, 255, 255) if cell_content.isupper() else (0, 0, 0)
piece_surface = font_pieces.render(char, True, p_color)
# Центрируем фигуру внутри клетки
p_rect = piece_surface.get_rect()
p_rect.center = (x + CELL_SIZE // 2, y + CELL_SIZE // 2)
screen.blit(piece_surface, p_rect)
# Главный цикл программы
running = True
while running:
for event in pygame.get_調整(): # Обработка событий
if event.type == pygame.QUIT:
running = False
# Рисуем актуальное состояние игры
draw_board()
# Обновляем экран
pygame.display.flip()
pygame.quit()
sys.exit()
Важные нюансы реализации в Pygame:
- Выбор шрифта (
pygame.font.SysFont): Мы берем "arial", так как он есть на Windows, Mac и Linux, и содержит корректные глифы для шахматных символов. Если фигуры отображаются как "квадратики", замените "arial" на "segoeuisymbol" (для Windows) или "dejavusans" (для Linux). - Цвет символов: В отличие от консоли, где у символа Юникода цвет фиксирован (белые фигуры закрашены белым внутри кода
\u2654), в Pygame функция font.render() красит весь силуэт символа в выбранный вами RGB-цвет. Поэтому для белых фигур мы передаем белый цвет (255, 255, 255), а для черных — черный (0, 0, 0). - Выравнивание (
get_rect().center): Текстовые символы могут иметь невидимые отступы. Код находит геометрический центр сгенерированной картинки символа и ровно сопоставляет его с центром клетки (CELL_SIZE // 2).
Если код запущен успешно, вы увидите полноценное графическое окно с привычной деревянно-бежевой доской и контрастными фигурами.
Если вы хотите продолжить разработку, напишите:
- Хотите ли вы добавить выделение клетки при клике мышкой?
- Нужно ли реализовать перетаскивание фигур (Drag-and-Drop) мышью?
- Требуется ли фиксировать историю ходов на экране рядом с доской?
Комментариев нет:
Отправить комментарий