#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. Метод абсолютных значений является лучшим!