Курс 3.5 · Раздел 12 · Урок 12.6

Перемещение кусочков

Преобразуем координаты кликов и организуем обмен двух выбранных частей карты.

Преобразуем координаты кликов и организуем обмен двух выбранных частей карты.
12.6 — Перемещение кусочков

Материал урока

Напишем код для обработки клика мышкой по окну программы. Нам нужно решить две задачи:

  1. преобразовать координаты клика в координаты двумерного списка, в котором хранятся индексы фрагментов карты, размещённых в окне;
  2. запомнить координаты первого клика, чтобы после второго клика поменять местами фрагменты карты.

Кроме того, после каждого перемещения нужно перерисовывать карту. Для этого процесс перерисовки удобно вынести в отдельную функцию draw_map().

Преобразование координат также вынесем в отдельную функцию recount(). Она будет принимать координаты клика (в системе координат окна программы) и возвращать координаты списка списков (предполагается, что пользователь кликает только по карте).

Функция recount

def recount(x, y):

    return int((x + WIDTH // 2) // side), int((HEIGHT // 2 - y) // side)

Переменная first_click будет хранить кортеж координат первого щелчка мышью. Изначально в ней будет значение None.

После каждого щелчка мы будем проверять содержимое переменной first_click:

  • Если это первый щелчок, то мы запоминаем координаты этого щелчка (пересчитываем их в координаты списка).
  • Если это второй щелчок, то мы меняем картинки с координатами текущего и предыдущего щелчков и перерисовываем карту.
def move(x, y):

    global first_click

    if first_click is not None:

        x1, y1 = first_click

        x2, y2 = recount(x, y)

        pic[y1][x1], pic[y2][x2] = pic[y2][x2], pic[y1][x1]

        first_click = None

        draw_map()

    else:

        first_click = recount(x, y)