В игре участвуют два игрока, у обоих есть колода карт ранга от 0 до 4, в которой находится по четыре карты каждого ранга.
Перед началом игры колода каждого игрока перемешивается случайным образом и трансформируется в очередь.
Далее, каждый игрок достаёт три карты из очереди и выкладывает их на стол рубашкой вниз. Это 'защита' каждого из игроков.
Затем, с помощью жребия определяется очерёдность хода. Игрок, который ходит, считается атакующим.
Во время хода атакующий игрок достаёт карту из очереди и, сравнивая её ранг с картами из 'защиты' оппонента бьёт любую карту с меньшим рангом.
Ход продолжается, пока у защищающегося игрока есть непобитые карты защиты или очередная карта атакующего не смогла побить карту защищающегося.
В конце хода атакующий игрок забирает себе все побитые карты защиты, а защищающийся - карту атакующего, которая не смогла пробить его защиту (в случае неудачной атаки). Полученные карты добавляются в колоду каждого из игроков по правилам очереди.
В случае, если защита была полностью пробита - защищающийся получает штрафное очко.
Перед каждым новым ходом игроки восстанавливают свою защиту доставая карты из своей колоды (очереди). После каждого хода игроки меняются ролями.
Проигравшим считается тот, кто не сможет сделать очередной ход или тот, кто первым получит заранее установленное количество штрафных очков (переменное значение).
Правила боя карт:
- Бой карт происходит сравнением их рангов: чей ранг выше, так карта и сильнее, с одним исключением: карту ранга 4 может побить только карта ранга 0;
- При одинаковом ранге карт атакующий игрок помещает свою карту в очередь и достаёт оттуда новую;
Задача была написана на Node.js последней версии.
Очередь (как структура данных) представлена в виде собственного класса. Основные сущности игроков (Человек и Компьютер) представлены в виде классов, унаследованных от общего класса Игрок, выступающего в качестве своебразного интерфейса, но с уже реализованными общими для обоих дочерних классов методами.
Алгоритм боя карт реализован по всем правилам, указанным выше. Атака компьютера основана на выборе из карт защиты карты с минимальным значением и её последующей попытки атаки.
Из замеченных странностей/минусов - компьютер хоть и может выиграть, но с малой вероятностью ввиду упрощённости его искусственного интеллекта
Для запуска потребуется установленная Node.js, а также пакет "prompt-sync".
https://github.com/w1ldy0uth/Relex_test_task.git
cd Relex_test_task
npm install prompt-sync
node index.js
cd Relex_test_task
npm test