Покращення #2

Покращення #1: Шахматы, реализация правил игры

Парсер ходов

Доданий Андрій Севастьянов about 6 years назад. Оновлений about 6 years назад.

Статус:Закрита Початок:2011-12-01
Пріоритет:Нормальний Дата виконання:
Призначена до:Андрій Севастьянов % зроблено:

100%

Категорія:- Витрачений час: 8.00 годин(и)
Target version:-

Опис

Поскольку ходы передаются в виде строки, то необходим их парсер. Его и надо реализовать.

Структура хода и функция, навскидку, видится так:

struct chess_move                 
{                                 
  int piece, from, to, passant; // Фигура (-1 не указана), откуда, куда
  uint64_t from_mask, to_mask;  // Битовые маски откуда и куда  
  int castle;                   // Рокировка? -1 нет, 0 на королевский фланг, 1 на ферзевый
  int check;                    // Шах? 0 нет, 1 обычный, 2 двойной                   
  int checkmate;                // Мат?  
  int is_draw;                  // Предложение/фиксация ничьи?  
  int is_resign;                // Сдача  
};                        

void parse_move(struct chess_move* move, const char* move);   

Історія

Updated by Андрій Севастьянов about 6 years ago

Какой формат ходов будет поддерживаться? Конечно, это стандарт из PGN + полная нотация + несколько русских символов

  ; Фигуры
  Nf3
  Ng1-f3
  Ngf3
  N1f3
  Ng1f3

  ; Взятия
  Nxf3
  Ng1 x f3
  Ngxf3
  N1xf3

  ; Пешки, везде возможно в конце превращение =QRBN
  d4
  d2 - d4

  ; Взятия, везде возможно указание взятия на проходе (p)
  cxd6
  c5 x d6
  cd
  cd6

  ; Рокировки
  O-O
  O-O-O
  0-0
  0-0-0  

Updated by Андрій Севастьянов about 6 years ago

  • Статус changed from На опрацюванні to Вирішено
  • % зроблено changed from 0 to 100

Updated by Андрій Севастьянов about 6 years ago

  • Статус changed from Вирішено to Закрита

В итоге получилось

struct chess_move                   
{                                   
  int piece, from, to;      // Фигура, откуда, куда (-1 если не задано)              
  uint64_t bb_from, bb_to;  // Битовые маски откуда и куда         

  int taking;               // Взятие (-1 не указано, 0 простой ход, 1 взятие)                      
  int promotion;            // Превращение (фигура)
  int castle;               // Рокировка (1 на королевский фланг, 2 на ферзевый)        
  int passant;              // Взятие на проходе 0/1        
  int check;                // Шах? Не указан, обычный, двойной 0/1/2        
  int checkmate;            // Мат? Не указан, да 0/1        
  int is_draw;              // Предложение/фиксация ничьи 0/1
  int is_resign;            // Сдача 0/1
};                                  

Експортувати в Atom PDF