59 lines
3.0 KiB
Markdown
59 lines
3.0 KiB
Markdown
# chess-web — шахматы в браузере
|
||
|
||
Браузерные шахматы на **React + TypeScript** с движком правил **chess.js** и простым ИИ (minimax + alpha-beta).
|
||
|
||
## Что уже работает
|
||
|
||
- Рендер доски 8×8 с координатами, подсветкой выбора, легальных ходов и последнего хода.
|
||
- Ходы кликом (выбрать фигуру → нажать целевую клетку).
|
||
- Все правила: рокировка (обе), эн-пан, превращение пешки, шах/мат/пат, определение ничьей.
|
||
- Режим **Hotseat** (два игрока за экраном) и **против ИИ** (ход белых или чёрных).
|
||
- История ходов в SAN-нотации с навигацией назад/вперёд.
|
||
- Отмена хода, переворот доски (заглушка в `Controls`, логика в `Board`), новая игра.
|
||
- Индикатор «ИИ думает…», статус партии.
|
||
|
||
## Структура
|
||
|
||
```
|
||
chess-web/
|
||
├── src/
|
||
│ ├── main.tsx # точка входа React
|
||
│ ├── App.tsx # состояние партии, связующее звено
|
||
│ ├── styles.css
|
||
│ ├── chess/
|
||
│ │ ├── useChess.ts # оборотка chess.js, statusInfo
|
||
│ │ └── board.ts # Position, pieces, legalMoves
|
||
│ ├── ai/
|
||
│ │ └── minimax.ts # minimax + alpha-beta, depth=3
|
||
│ └── components/
|
||
│ ├── Board.tsx
|
||
│ ├── MoveHistory.tsx
|
||
│ ├── Controls.tsx
|
||
│ └── pieces.tsx # Unicode-символы фигур
|
||
```
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
npm install
|
||
npm run dev # http://localhost:5173
|
||
npm run build # production-сборка в dist/
|
||
npm run preview # превью собранного
|
||
```
|
||
|
||
## Дедлайны / следующие шаги
|
||
|
||
- [ ] Реальный drag-and-drop вместо клика.
|
||
- [ ] Подтверждение превращения (выбор фигуры: ферзь/ладья/конь/слон).
|
||
- [ ] Ограничение времени на ход, таймер.
|
||
- [ ] Отмена хода в режиме против ИИ должна откатывать 2 хода (ход игрока + ход ИИ).
|
||
- [ ] Убрать заглушку `onFlip` в `Controls` — передать флаг переворота в `Board`.
|
||
- [ ] Анимации ходов, звуковое сопровождение, тема.
|
||
|
||
## Заметки по chess.js v1.x
|
||
|
||
- `move()` принимает **SAN-строку** (`'e4'`, `'O-O'`, `'Qxf7#'`), а не `{from, to}`.
|
||
- Рокировка короткая — `O-O`, длинная — `O-O-O`.
|
||
- Эн-пан: пешка переходит на клетку **за** взятой (`dxc5`, не `d6`).
|
||
- Проверки: `isCheckmate()`, `isStalemate()`, `isDrawByFiftyMoves()`, `isThreefoldRepetition()`.
|