Metadata-Version: 2.4
Name: crabot
Version: 0.1.0
Summary: Учимся программировать с крабиком: уровни с проверкой на вариантах и редактор уровней
License-Expression: MIT
Keywords: education,karel,kumir,robot,school,обучение,краб
Classifier: Programming Language :: Python :: 3
Classifier: Natural Language :: Russian
Classifier: Intended Audience :: Education
Classifier: Topic :: Education
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
License-File: crabot/assets/OFL.txt
Requires-Dist: pygame>=2.5; python_version < "3.14"
Requires-Dist: pygame-ce>=2.5; python_version >= "3.14"
Dynamic: license-file

# crabot 🦀

Учимся программировать с крабиком. Краб ходит по доске, красит клетки и ищет звезду,
а ребёнок управляет им программой на обычном Python. Всё, что ребёнок читает (задания,
подсказки, сообщения), на русском, а команды на английском: не нужно переключать раскладку.

```python
from crabot import *

level("corridor")

forward()
while left_is_blocked():
    paint()
    forward()
```

Главная фишка: **у уровня бывает несколько вариантов поля**, и программа проверяется
на всех сразу. Решение «в лоб», вида `forward()` пять раз подряд, пройдёт один
вариант. Все варианты пройдёт только настоящее решение с циклами и условиями.

## Установка

```bash
pip install crabot
```

Нужен Python 3.9+. Библиотека подтянет `pygame` (на Python 3.14 — `pygame-ce`).
Если `pygame` уже установлен, ничего нового не поставится.

## Команды краба

| Что делает | Команда |
|---|---|
| Шаг вперёд (туда, куда смотрит краб) | `forward()`, `forward(3)` |
| Повороты на месте | `turn_left()`, `turn_right()`, `turn_around()` |
| Закрасить клетку под собой | `paint()` |
| Можно ли пройти | `front_is_clear()`, `left_is_clear()`, `right_is_clear()` |
| Есть ли стена | `front_is_blocked()`, `left_is_blocked()`, `right_is_blocked()` |
| Клетка под крабом | `is_painted()`, `is_clean()`, `is_marked()` (на ней точка), `at_star()` |
| Сказать фразу (облачко) | `say("Привет!")` |

«Слева» и «справа» считаются от краба, а не от экрана.

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

## Уровни

`levels()` печатает список, `level("name")` загружает уровень, а
`level("maze", variant=2)` показывает конкретный вариант (удобно, чтобы разобраться, что пошло не так).

| Уровень | Чему учит | Вариантов |
|---|---|---|
| `first_steps` | линейная программа | 1 |
| `turns` | повороты | 1 |
| `line` | цикл `for` | 1 |
| `square` | цикл в цикле | 1 |
| `zigzag` | несколько команд в теле цикла | 1 |
| `to_the_wall` | `while` и последняя клетка | 4 |
| `corridor` | `while left_is_blocked()` | 4 |
| `stairs` | цикл с поворотами | 4 |
| `gap` | два цикла подряд | 4 |
| `dots` | `if` внутри цикла | 4 |
| `corner` | стена буквой Г, как в задании 15 ОГЭ | 4 |
| `frame` | обход по периметру | 3 |
| `fill` | змейка | 3 |
| `columns` | вложенные `while` | 3 |
| `maze` | лабиринт, правило правой руки | 4 |
| `find_star` | поиск с `at_star()` | 3 |
| `chess` | змейка с чередованием | 3 |

## Окно

После конца программы окно не закрывается: там итог проверки и кнопки
«Ещё раз» и «Показать вариант N» (если какой-то вариант не прошёл).

У уровней с несколькими вариантами над полем есть кнопки **1, 2, 3…**: нажми, и программа
запустится на этом варианте, даже посреди работы. После проверки пройденные варианты
подсвечиваются, непройденные становятся красными.

Клавиши: **T** — сменить тему, **+ / −** — скорость, **пробел** — пауза, **R** — ещё раз, **1–9** — вариант.

Прямо в программе можно задать `speed(8)` (0 — без анимации) и `theme("mint")`.
Темы: `warm`, `mint`, `dusk`.

## Редактор уровней

```bash
python -m crabot
```

Редактор можно открыть и из программы: `editor()`, `editor("my_maze")`.

- **Инструменты** слева (клавиши 1–6): стена, точка, закраска, звезда, краб, ластик.
  Стена ставится кликом в зазор между плитками, её можно «вести» мышкой.
  Повторный клик по крабу поворачивает его.
- **Варианты**: «+ вариант» делает копию текущего поля, в которой можно что-нибудь поменять.
- **Проверить**: пройти уровень самому стрелками, прежде чем давать его другим.
- **Ctrl+Z / Ctrl+Shift+Z** — отменить и вернуть, **Ctrl+S** — сохранить.
- Имя уровня пишется латиницей. Если набрать по-русски, оно само переведётся:
  «лабиринт» → `labirint`.

Уровни сохраняются в папку `levels` рядом с программой, и загружать их можно так же:
`level("my_maze")`. Встроенный уровень открывается копией, так что испортить его не получится.

Файл уровня — обычный текст, его можно поправить и руками:

```
task: Закрась точки и приди на звезду.

+---+---+---+---+
| >   .   .     |
+   +---+   +   +
|         # | * |
+---+---+---+---+
```

`> ^ < v` — краб и куда он смотрит, `.` — точка, `#` — закрашено с самого начала,
`*` — звезда, `---` и `|` — стены. Варианты идут друг за другом через пустую строку.

## Где работает

Проверено на macOS: запуск из терминала (PyCharm запускает программы так же).
IDLE и Thonny должны работать: окно остаётся после программы, пока его не закроют.
Там это ещё не проверено.

## Для взрослых

```bash
python -m unittest discover tests
```

- Эталонные решения всех уровней лежат в `tests/level_solutions.py`. Тесты гоняют их на всех вариантах.
- Встроенные уровни собирает `tools/make_levels.py`. Чтобы добавить уровень, допиши функцию туда
  и решение в `tests/level_solutions.py`, потом запусти генератор.

Лицензия MIT. Шрифт Nunito распространяется по SIL Open Font License.
