Files

59 lines
3.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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()`.