Консольные «крестики-нолики» на Rust: человек против компьютера. Учебный проект —
порт классического примера из Python на идиоматичный Rust, чтобы разобраться с
enum, сопоставлением с образцом (match), срезами и вводом-выводом.
enum Cell { Empty, X, O }— клетка как перечисление, а не «магическая» строка. Компилятор гарантирует, что клетка всегда в одном из трёх состояний.enum Outcome { Win(Cell), Tie, Ongoing }— исход партии одним типом (перечисление с данными), вместо строк-сентинелов вроде"nobody".type Board = [Cell; 9]— доска это массив фиксированного размера (Copy), без аллокаций в куче.impl Display for Cell— как научить свой тип печататься через{}.matchиmatches!— разбор исхода и проверки «может ли кто-то выиграть».
Нужен установленный Rust (rustc + cargo).
cargo runСборка релизной версии:
cargo build --release
./target/release/ticktacktoe-
Программа спросит, хотите ли вы ходить первым (
y/n). -
Клетки пронумерованы от 0 до 8:
0 | 1 | 2 --------- 3 | 4 | 5 --------- 6 | 7 | 8 -
На свой ход введите номер свободной клетки и нажмите Enter.
Первый игрок ходит крестиками (X), второй — ноликами (O).
Соперник не использует полный minimax — логика простая и предсказуемая
(do_computer_move):
- если есть ход, которым можно выиграть прямо сейчас — сделать его;
- иначе, если следующим ходом выиграет человек — заблокировать эту клетку;
- иначе занять лучшую свободную клетку в порядке приоритета
[4, 0, 2, 6, 8, 1, 3, 5, 7](центр → углы → края).
Такой ИИ невозможно обыграть, но можно свести партию вничью.
src/main.rs вся игра (одним файлом)
Cargo.toml манифест пакета
cargo build # компиляция
cargo clippy # линтер (проходит без замечаний)
cargo fmt # форматирование