{"id":20095240,"url":"https://github.com/konyshevartem/saber-interactive-task","last_synced_at":"2025-06-25T07:35:01.488Z","repository":{"id":111154991,"uuid":"210897479","full_name":"KonyshevArtem/saber-interactive-task","owner":"KonyshevArtem","description":"Тестовое задание Saber Interactive на должность Gameplay Programmer","archived":false,"fork":false,"pushed_at":"2019-09-27T19:54:44.000Z","size":108,"stargazers_count":1,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-02T16:23:44.141Z","etag":null,"topics":["behaviour-tree","c-sharp","deserialization","linked-list","list","saber-interactive","serialization"],"latest_commit_sha":null,"homepage":"https://saber3d.com/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KonyshevArtem.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-09-25T17:02:16.000Z","updated_at":"2024-09-13T12:39:15.000Z","dependencies_parsed_at":"2023-06-02T16:15:42.190Z","dependency_job_id":null,"html_url":"https://github.com/KonyshevArtem/saber-interactive-task","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/KonyshevArtem/saber-interactive-task","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KonyshevArtem%2Fsaber-interactive-task","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KonyshevArtem%2Fsaber-interactive-task/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KonyshevArtem%2Fsaber-interactive-task/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KonyshevArtem%2Fsaber-interactive-task/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KonyshevArtem","download_url":"https://codeload.github.com/KonyshevArtem/saber-interactive-task/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KonyshevArtem%2Fsaber-interactive-task/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261827574,"owners_count":23215771,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["behaviour-tree","c-sharp","deserialization","linked-list","list","saber-interactive","serialization"],"created_at":"2024-11-13T16:54:33.541Z","updated_at":"2025-06-25T07:35:01.469Z","avatar_url":"https://github.com/KonyshevArtem.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Тестовое задание Saber Interactive на должность Gameplay Programmer [![Build Status](https://travis-ci.com/KonyshevArtem/saber-interactive-task.svg?token=z3sjoAcC4HGWpiWtgTxy\u0026branch=master)](https://travis-ci.com/KonyshevArtem/saber-interactive-task)\n\n## Задание 1\n\nРеализуйте функции сериализации и десериализации двусвязного списка, заданного следующим образом:\n\n    class ListNode\n    {\n        public ListNode Prev;\n        public ListNode Next;\n        public ListNode Rand; // произвольный элемент внутри списка\n        public string Data;\n    }\n\n\n    class ListRand\n    {\n        public ListNode Head;\n        public ListNode Tail;\n        public int Count;\n\n        public void Serialize(FileStream s)\n        {\n        }\n\n        public void Deserialize(FileStream s)\n        {\n        }\n    }\n\nПримечание: сериализация подразумевает сохранение и восстановление полной структуры списка, включая взаимное соотношение его элементов между собой.  Формат сериализованного файла любой.\n* Нельзя изменять исходную структуру классов ListNode, ListRand.\n* **Алгоритмическая сложность решения должна быть меньше квадратичной.**\n* Для выполнения задания можно использовать любой общеиспользуемый язык.\n* Тест нужно выполнить без использования библиотек/стандартных средств сериализации.\n\n## Задание 2\n\nСоставить BehaviourTree (в виде схемы) для NPC, который:\n* в спокойном состоянии патрулирует территорию;\n* по окончанию каждого патруля (окончанием считается возвращение в стартовую точку) NPC может или заснуть на 2 минуты или продолжить патруль;\n* когда у NPC есть враг, он  атакует его, причем стрелять во врага может, только если у него есть патроны и враг на расстоянии меньше 30 метров;\n* если патронов нет, то NPC убегает от врага.\n\n![Image of Yaktocat](behaviour_tree.png)\n\n### Узлы\n\n#### LookForEnemy\nУзел, в котором выполняется проверка на наличие врага в поле зрения.\n* **success** - враг найден\n* **failure** - враг не найден\n\n#### Patrol\nУзел, в котором выполняется движения персонажа по маршруту патрулирования.\n* **running** - движение персонажа по маршруту\n* **success** - патруль закончен\n\n#### TryToSleep\nУзел, в котором принимается решение и выполняется сон.\n* **success** - персонаж засыпает\n* **running** - персонаж спит 2 минуты\n* **failure** - персонаж не засыпает\n\n#### CheckAmmo\nУзел, в котором происходит проверка наличия патронов.\n* **success** - есть патроны\n* **failure** - нет патронов\n\n#### RunAway\nУзел, в котором происходит движение персонажа в противоположную от противника сторону\n* **running** - движение персонажа\n\n#### CheckDistance\nУзел, в котором происходит проверка дистанции до противника.\n* **success** - дистанция меньше 30 метров\n* **failure** - дистанция больше 30 метров\n\n#### GetClose\nУзел, в котором происходит сближение персонажа с противником.\n* **running** - персонаж приближается в противнику\n\n#### Shoot\nУзел, в котором происходит стрельба по противнику.\n* **running** - стрельба по противнику\n\n### Порядок выполнения\n1. Если **LookForEnemy** = **failure**, то **Patrol**.\u003cbr\u003e\n1.1 Когда **Patrol** = **success**, то **TryToSleep**.\u003cbr\u003e\n2. Если **LookForEnemy** = **success**, то **CheckAmmo**\u003cbr\u003e\n2.1 Если **CheckAmmo** = **failure**, то **RunAway**, пока **LookForEnemy** = **success** или **CheckAmmo** = **failure**\u003cbr\u003e\n3. Если **CheckAmmo** = **success**, то **CheckDistance**\u003cbr\u003e\n3.1 Если **CheckDistance** = **failure**, то **GetClose**, пока **LookForEnemy** = **success** и **CheckAmmo** = **success** и **CheckDistance** = **failure**\n4. Если **CheckDistance** = **sucess**, то **Shoot**, пока **LookForEnemy** = **success** и **CheckAmmo** = **success** и **СheckDistance** = **success**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkonyshevartem%2Fsaber-interactive-task","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkonyshevartem%2Fsaber-interactive-task","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkonyshevartem%2Fsaber-interactive-task/lists"}