Диагональный слон движется по шахматной доске с помощью python

#python #math #chess

#python #математика #шахматы

Вопрос:

У меня следующая проблема

В шахматах слон ходит по диагонали, на любое количество клеток. Учитывая две разные клетки шахматной доски, определите, может ли слон перейти с первой на вторую за один ход.

Программа получает в качестве входных данных четыре числа от 1 до 8, указывающие номера столбцов и строк начального квадрата, а также номера столбцов и строк конечного квадрата. Программа должна выдать «ДА», если слон может перейти с первой клетки на вторую за один ход, или «НЕТ» в противном случае.

Например:

Ввод: 2 3 5 6

Выходной сигнал:

ДА

Предполагается, что ячейки пронумерованы слева направо и снизу вверх, т.Е. Нижняя левая ячейка имеет номер столбца 1 и номер строки 1, а нижняя правая ячейка имеет номер столбца 8 и номер строки 1.

Как далеко я продвинулся?

Мне удалось проверить, двигался ли слон по диагонали, но он может двигаться по любой диагонали, так что это неверно. Может кто-нибудь дать мне несколько советов?

мой код

 
initial_coord_x=int (input('enter the initial x'))
initial_coord_y=int (input('enter the initial y'))
final_coord_x=int (input('enter the final x'))
final_coord_y=int (input('enter the final y'))
if final_coord_x<=8 and final_coord_y<=8:
  if final_coord_x < initial_coord_x and final_coord_y > initial_coord_y:
    print ('you moved legally')
  elif final_coord_x < initial_coord_x and final_coord_y < initial_coord_y:
    print ('you moved legally')
  elif final_coord_x > initial_coord_x and final_coord_y > initial_coord_y:
    print ('you moved legally')
  elif final_coord_x > initial_coord_x and final_coord_y < initial_coord_y:
    print ('you moved legally')
  else:
    print ('no!')


else:
  print ('illegal move, you moved outside the chessboard')

 

Комментарии:

1. Что значит «он может двигаться по любой диагонали»?

2. Обратите внимание, что существует только два возможных направления диагонали, и они имеют математические уравнения y = x k и y = -x k ; каждое значение k приводит к отдельной параллельной диагонали. Два квадрата (x1,y1) и (x2,y2), которые находятся на одной диагонали, будут удовлетворять уравнению для одного и того же значения k . Поскольку значение k может быть получено путем переписывания двух возможных уравнений в виде k = y-x и k = y x соответственно, окончательный вывод таков: (x1, y1) и (x2, y2) находятся на одной диагонали тогда и только тогда, когда x1 y1 = x2 y2 или x1-y1 = x2-y2.

3. См. Также Этот связанный вопрос о chess.stackexchange.com : Как можно узнать, где пересекаются две диагональные линии?

Ответ №1:

Чтобы проверить возможность перемещения слона (на существующих ячейках), достаточно проверить, равно ли абсолютное значение горизонтального смещения абсолютному значению вертикального смещения (поэтому обе позиции лежат на одной диагонали)

 dx = abs(final_coord_x - initial_coord_x)
dy = abs(final_coord_y - initial_coord_y)
if (dx == dy) and (dx > 0):
     legal move 
 

Комментарии:

1. Метод абсолютных значений является лучшим!