Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 3, 2022 13:31:03

devilvplashe
Зарегистрирован: 2022-05-20
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Ход шахматной фигуры

Создайте функцию, которая принимает имя шахматной фигуры, ее положение и целевую позицию. Функция должна возвращать True, если фигура может двигаться к цели, и False, если она не может этого сделать.
Возможные входные данные - “пешка”, “конь”, “слон”, “Ладья”, “Ферзь” и “ король”.

Пример:
canMove(“Rook”, “A8”, “H8”) ➞ True

canMove(“Bishop”, “A7”, “G1”) ➞ True

canMove(“Queen”, “C4”, “D6”) ➞ False

Офлайн

#2 Июнь 8, 2022 21:36:59

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Ход шахматной фигуры

ну такое наколенное

 # примерно так думется игровое поле
# 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))
# вот ... а дальше ...
# считаете растояние до цели на старте
# потом растояние после
# проверяете (хз какой у вас критерий ближе дальше)



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#3 Июнь 8, 2022 23:31:53

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ход шахматной фигуры

AD0DE412
оххх…, было бы это тестовым заданием, я бы его не принял

1. нафига в теле функции создавать статический словарь? Он же не изменяется от вызова к вызову, правильно?

_abc = {'a': 1
2. abc? Abstract Base Class?
3.
 usr_input = [decode_abc(pos[0]), int(pos[1])]
return {'h': [usr_input[1], usr_input[0]], 'w': usr_input}
это бред какой-то, я не понял глубины мысли. Зачем вы создаете этот идиотский список из двух переменных? что это за ‘h’ и ‘w’, начерта они нужны?
4.
 dig * -1
это вы так -dig сделали? вам наверное хотелось вообще abc(dig) сделать по всей видимости


AD0DE412
а как это работать может вообще? Ну теоретически, у шахматной фигуры может быть любое правило определяющее правильность хода. При чем тут какое-то расстояние на которое вы ссылаетесь? То есть не опеределив правила для всех фигур, эту задачу нельзя решить



Офлайн

#4 Июнь 9, 2022 08:29:37

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Ход шахматной фигуры

FishHook
было бы это тестовым заданием, я бы его не принял
и правильно сдела ли бы. эт так … сок мозга … мысли в слух эээ черновой вариант
просто чебы идею передать но много лишнего и не по делу

ну идея в общем ежеле словами такая эээ определить растояние от одной точки в координатах xy
код выше (ну да такой код) и дальше (этого кода нет) после хода опредилить ближе или дальше стала фигура (тут критерии нужны хз чето в вроде круга наверное эээ вернее квадрата скоре но тут еще раз повторюсь - непнятно)
1. decode_abc(abc) ну это кабы буквы преобразует в цифры для сетки координат
2. с неймингом да косяк это да
3. эээ вот тут да нужно переделать кнешно тут запутаный код в формате мои намериния менялись в процессе написания (ну сами понимаете что из этого выйдет)
4. э ну я хочу получить полжительные числа же и всегда (ага вроде есть для этого в math чето, но так проще)

зы ага вроде работает т.е. вычисляет растояние по координатам в положительных числах
 pos1 = 'a1'
pos2 = 'b3'
[2, 1]



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Июнь 9, 2022 08:53:04)

Офлайн

#5 Июнь 9, 2022 10:17:43

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ход шахматной фигуры

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)

Офлайн

#6 Июнь 9, 2022 17:46:14

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Ход шахматной фигуры

ок у меня ошибка в понимании задания
почему то показалось что нужно определить стала ли при перемещении фигура ближе к цели …
ну эээ
хз не знаю нужно не нужно короче вот

 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))
что касается задания (ну теперь понятого … вроде) то это что типа напишите мне игру шахматы … сильно
зы впервые вижу в коде что бы при создании класса использовали шаблоны (ну т.е. встречалось где то в книгах - статьях но не в коде)



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version