Форум сайта python.su
Создайте функцию, которая принимает имя шахматной фигуры, ее положение и целевую позицию. Функция должна возвращать True, если фигура может двигаться к цели, и False, если она не может этого сделать.
Возможные входные данные - “пешка”, “конь”, “слон”, “Ладья”, “Ферзь” и “ король”.
Пример:
canMove(“Rook”, “A8”, “H8”) ➞ True
canMove(“Bishop”, “A7”, “G1”) ➞ True
canMove(“Queen”, “C4”, “D6”) ➞ False
Офлайн
ну такое наколенное
# примерно так думется игровое поле # board_tabl = {'board_h_mode': [i+1 for i in range(8)], # 'board_w_mode': [i+1 for i in range(8)]} def decode_abc(abc): _abc = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8} return _abc.get(abc) def place(pos): # работает но кажется нужно переосмыслить детали т.с. концепта usr_input = [decode_abc(pos[0]), int(pos[1])] return {'h': [usr_input[1], usr_input[0]], 'w': usr_input} def different_pos(in_pos, out_pos): # работает но чет не очень мож кто покузявей замутит _in = place(in_pos) _out = place(out_pos) h = _in['h'][0] - _out['h'][0] w = _in['w'][0] - _out['w'][0] def num(dig): return dig if dig >= 0 else dig * -1 return [num(h), num(w)] pos1 = 'a1' pos2 = 'b3' print(different_pos(pos1, pos2)) # вот ... а дальше ... # считаете растояние до цели на старте # потом растояние после # проверяете (хз какой у вас критерий ближе дальше)
Офлайн
AD0DE412
оххх…, было бы это тестовым заданием, я бы его не принял
1. нафига в теле функции создавать статический словарь? Он же не изменяется от вызова к вызову, правильно?
_abc = {'a': 1
usr_input = [decode_abc(pos[0]), int(pos[1])] return {'h': [usr_input[1], usr_input[0]], 'w': usr_input}
dig * -1
Офлайн
FishHookи правильно сдела ли бы. эт так … сок мозга … мысли в слух эээ черновой вариант
было бы это тестовым заданием, я бы его не принял
pos1 = 'a1' pos2 = 'b3' [2, 1]
Отредактировано AD0DE412 (Июнь 9, 2022 08:53:04)
Офлайн
AD0DE412а разве этого требует задание? Насколько я понял, нужно для любой фигуры определить, разрешено ли для нее то или иное перемещение. Ладья ходит строго по горизонтали, поэтому для неё ход А1=А8 разрешен, а слона - нет, потому что слон ходит по диагоналям. Расстояние вам понадобится для фигур пешка и король. Задание вообще идиотское, потому что в реальных шахматах правила сложнее. Король, например, не всегда перемещается на одну клетку, как и пешка. Но, я думаю, этим можно пренебречь, как и направлением перемещения пешек. Итак, дано задание - “есть шахматные фигуры…”. Дальше можно не читать, мы должны начать описывать фигуры в коде. Не какие-то литералы “h” и “w” понятные только автору изобретать, не странные структуры, не понятно на кой нужные вообще, а описывать нашу предметную область.
опредилить ближе или дальше стала фигура
from abc import ABC, abstractmethod from dataclasses import dataclass @dataclass class CellDelta: x: int y: int @dataclass class Cell: x: int y: str def difference(self, another: "Cell") -> CellDelta: return CellDelta(abs(self.x - another.x), abs(ord(self.y) - ord(another.y))) @classmethod def form_string(cls, s: str) -> "Cell": y, x = s[0].lower(), int(s[1]) return cls(x, y) class BaseFigure(ABC): def __init__(self, cell: Cell): self.cell = cell @abstractmethod def can_move(self, cell: Cell) -> bool: pass class Rook(BaseFigure): def can_move(self, cell: Cell) -> bool: diff = self.cell.difference(cell) return diff.x == 0 or diff.y == 0 class Bishop(BaseFigure): def can_move(self, cell: Cell) -> bool: diff = self.cell.difference(cell) return diff.x == diff.y print(Bishop(Cell.form_string("a1")).can_move(Cell.form_string("a2"))) print(Bishop(Cell.form_string("a1")).can_move(Cell.form_string("b2")))
Отредактировано FishHook (Июнь 9, 2022 10:18:14)
Офлайн
ок у меня ошибка в понимании задания
почему то показалось что нужно определить стала ли при перемещении фигура ближе к цели …
ну эээ
хз не знаю нужно не нужно короче вот
def decode_abc(abc): _abc = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8} return _abc.get(abc) def place(pos): usr_input = [decode_abc(pos[0]), int(pos[1])] return usr_input def different_pos(in_pos, out_pos): _in = place(in_pos) _out = place(out_pos) def num(dig): return dig if dig >= 0 else dig * -1 return [num(_in[0] - _out[0]), num(_in[1] - _out[1])] pos1 = 'a1' pos2 = 'b3' print(different_pos(pos1, pos2))
Офлайн