Як навчити штучну нейронну мережу грати в Diablo 2 за допомогою візуального введення?


139

Наразі я намагаюся отримати АНН, щоб грати у відеоігри, і я сподівався отримати допомогу чудового співтовариства тут.

Я зупинився на Diablo 2. Гра, таким чином, відбувається в режимі реального часу і з ізометричної точки зору, при цьому гравець управляє одним аватаром, на якому орієнтована камера.

Щоб зробити конкретні речі, завдання полягає в тому, щоб отримати ваш персонаж x очок досвіду, не знижуючи його здоров’я до 0, де точка досвіду отримується вбивством монстрів. Ось приклад ігрового процесу:

тут

Тепер, оскільки я хочу, щоб мережа працювала виключно на інформації, яку вона отримує з пікселів на екрані, вона повинна навчитися дуже багатому представленню, щоб грати ефективно, оскільки це, ймовірно, вимагає від неї знати (принаймні неявно), як розділити ігровий світ вгору на об’єкти та способи взаємодії з ними.

І всю цю інформацію треба якось викладати в мережу. Я не можу за все життя думати, як навчити цю справу. Моя єдина ідея - створити окрему програму візуально витягнути з екрану щось внутрішньо добре / погано (наприклад, здоров’я, золото, досвід), а потім використати цю статтю в навчальній процедурі підкріплення. Я думаю, що це буде частиною відповіді, але я не думаю, що цього буде достатньо; є занадто багато рівнів абстракції від необробленого візуального введення до орієнтованої на ціль поведінки для такого обмеженого зворотного зв'язку, щоб тренувати мережу протягом мого життя.

Отже, моє запитання: які ще способи ви можете придумати, щоб навчити мережу робити хоч якусь частину цього завдання? бажано без створення тисяч мічених прикладів.

Ще трішки для іншого напрямку: я шукаю інші джерела вивчення підкріплення та / або будь-які непідконтрольні методи вилучення корисної інформації в цьому налаштуванні. Або контрольований алгоритм, якщо ви можете придумати спосіб вилучення маркованих даних із ігрового світу без необхідності вручну маркувати їх.

ОНОВЛЕННЯ (27.04.12):

Як не дивно, я все ще працюю над цим і, здається, прогресую. Найбільший секрет для отримання контролера ANN для роботи - це використання найсучасніших архітектур ANN, відповідних цьому завданню. Отже, я використовував мережу з глибокими переконаннями, що складається з факторних умовних обмежених автоматів Больцмана, які я тренувався без нагляду (на відео про мене, що грає в гру) перед тонкою настройкою із тимчасовою різницею зворотного поширення (тобто підкріплення навчання зі стандартними подання АНН).

Але все ж шукаю більш цінний вклад, особливо щодо проблеми вибору дій у режимі реального часу та способів кодування кольорових зображень для обробки ANN :-)

ОНОВЛЕННЯ (21.10.2015):

Тільки що згадав, що я задав це запитання заднім днем, і подумав, що слід зазначити, що це вже не шалена ідея. З мого останнього оновлення DeepMind опублікував їхній природознавчий документ про отримання нейронних мереж для гри в ігри Atari з візуальних входів . Дійсно, єдине, що заважає мені використовувати їх архітектуру для гри, обмежений підмножина, Diablo 2 - це відсутність доступу до базового ігрового двигуна. Подання на екран та перенаправлення його в мережу є занадто повільним, щоб тренуватися за розумну кількість часу. Таким чином, ми, швидше за все, не побачимо подібного роду бота, що грає в Diablo 2, але тільки тому, що він буде грати щось або з відкритим кодом, або з доступом API до цілі візуалізації. (Можливо, Quake?)


1
Ознайомтеся з цим документом. : D ri.cmu.edu/pub_files/pub2/pomerleau_dean_1992_1/…
zergylord

Велика різниця між проблемою водіння в папері та грі полягає в тому, що в проблемі з керуванням автомобілем візуальне введення є достатньо повним представленням стану: якщо є перешкода праворуч - поверніть ліворуч, якщо є перешкода зліва - поверніть правильно. Однак у грі вам часто доводиться приймати рішення на основі речей, які не відображаються на екрані. Щоразу, коли ви заходите в магазин, це може виглядати однаково, але вам потрібно купувати різні предмети.
Дон Реба

1
Для найкращого мого спогаду Diablo 2 використовує легко витягнуті спрайтові аркуші. Пов’язати об'єкти (гравця, ворогів тощо ...) слід досить просто до списку пов'язаних спрайтів. Це не вирішує проблему затьмарення один одного об'єктами, але це початок.
Райан Дженкінс

@zergylord Це допоможе, якщо ви можете сказати, наскільки твердо ви хочете дотримуватися своїх критеріїв: a) Відтворення Diablo 2 і b) використання пікселів, намальованих на екрані, як вашого єдиного джерела вводу. Якщо ви хочете полегшити собі справу, я думаю, вам доведеться трохи розслабити одного (або обох) тих - чи готові ви це зробити?
Stompchicken

1
Голосування про закриття як занадто широке.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Відповіді:


54

Я можу бачити, що ви переживаєте, як навчати ANN, але цей проект приховує складність, про яку ви, можливо, не знаєте. Розпізнавання об'єктів / символів на комп'ютерних іграх за допомогою обробки зображень - це дуже складне завдання (не скажімо, божевільне для FPS та RPG ігор). Я не сумніваюся у ваших навичках, і я також не кажу, що цього не можна зробити, але ви можете легко витратити 10 разів більше часу на розпізнавання речей, ніж на реалізацію самого ANN (якщо припустити, що у вас вже є досвід роботи з цифровими технологіями обробки зображень ).

Я думаю, що ваша ідея дуже цікава, а також дуже амбітна . На даний момент ви можете переглянути його. Я відчуваю, що цей проект - це те, що ви плануєте для університету, тож якщо фокус роботи справді ANN, вам, мабуть, слід вибрати іншу гру, щось більш просте.

Я пам’ятаю, що ще не так давно хтось шукав поради щодо іншого, але якось подібного проекту . Варто це перевірити.

З іншого боку, можуть бути кращі / простіші підходи до ідентифікації об'єктів у грі, якщо ви приймаєте пропозиції. Але спочатку давайте назвемо цей проект таким, яким ви хочете, щоб він був: розумний бот .

Один із способів реалізації ботів отримує доступ до пам’яті ігрового клієнта для пошуку відповідної інформації, наприклад, розташування персонажа на екрані та його здоров’я. Читання комп'ютерної пам’яті є тривіальним, але з'ясувати, де саме в пам’яті шукати, немає. Для цього можуть бути дуже корисні сканери пам'яті, як Cheat Engine .

Інший метод , який працює в грі, передбачає маніпулювання візуалізацією інформації. Усі об’єкти гри повинні бути виведені на екран. Це означає, що місця розташування всіх 3D-об’єктів з часом будуть відправлені на відеокарту для обробки. Будьте готові до серйозної налагодження.

У цій відповіді я коротко описав 2 способи досягнення того, що ви хочете, обробляючи зображення. Якщо вас цікавлять, ви можете дізнатись більше про них про використання онлайн-ігор (глава 6), відмінну книгу на цю тему.


43

ОНОВЛЕННЯ 2018-07-26: Це все! Зараз ми наближаємось до того, коли ця гра буде вирішуваною! Використовуючи OpenAI та грунтуючись на грі DotA 2, команда могла скласти AI, який може перемогти напівпрофесійних геймерів у грі 5v5 . Якщо ви знаєте DotA 2, ви знаєте, що ця гра в механіці досить схожа на ігри, подібні до Diablo, але можна стверджувати, що вона є ще складнішою через гру команду.

Як і очікувалося, цього вдалося досягти завдяки останнім досягненням у навчанні посиленого навчання з глибоким навчанням та використанням відкритих ігрових рамок, таких як OpenAI, що полегшує розвиток AI, оскільки ви отримуєте акуратний API, а також тому, що ви можете прискорити гру (AI грав еквівалент 180 років геймплею проти себе щодня!).

5 серпня 2018 року (через 10 днів!) Планується прокласти цей AI проти топ-геймерів DotA 2. Якщо це вийде, очікуйте великої революції, можливо, не настільки опосередковану, як рішення гри Go, але, тим не менш, це буде величезною віхою для ігор AI!

ОНОВЛЕННЯ 2017-01: Поле рухається дуже швидко з моменту успіху AlphaGo, і з’являються нові рамки для полегшення розробки алгоритмів машинного навчання на іграх майже кожні місяці. Ось список останніх я знайшов:

  • Всесвіт OpenAI : платформа для гри практично в будь-яку гру за допомогою машинного навчання . API знаходиться в Python, і він запускає ігри за середовищем віддаленого робочого столу VNC, щоб він міг знімати зображення будь-якої гри! Ви можете, можливо, використовувати Всесвіт для відтворення Diablo II через алгоритм машинного навчання!
  • Тренажерний зал OpenAI : Подібно до Всесвіту, але спеціально орієнтований на алгоритми навчання посилення (тому це свого роду узагальнення фреймворку, який використовується AlphaGo, але для набагато більшої кількості ігор). Існує курс на Udemy, який стосується застосування машинного навчання до ігор, таких як breakout або Doom, використовуючи OpenAI Gym.
  • TorchCraft : міст між Torch (рамки машинного навчання) та StarCraft: Brood War.
  • pyGTA5 : проект по створенню автомобілів, що керують власними рухами в GTA5, використовуючи лише знімки екрана (з великою кількістю відео в Інтернеті ).

Дуже хвилюючі часи!

ВАЖЛИВО ОНОВЛЕННЯ (2016-06): Як зазначає ОП, зараз проблема підготовки штучних мереж до гри в ігри з використанням лише візуальних входів вирішується декількома серйозними установами з досить перспективними результатами, такими як DeepMind Deep-Qlearning-Network (DQN ) .

А тепер, якщо ви хочете прийняти виклик наступного рівня, ви можете скористатися однією з різних платформ розвитку ігор AI vision, таких як ViZDoom , високооптимізована платформа (7000 кадрів в секунду), щоб навчити мережі грати в Doom, використовуючи лише візуальні входи. :

ViZDoom дозволяє розробляти AI-боти, які відтворюють Doom, використовуючи лише візуальну інформацію (буфер екрану). Він в першу чергу призначений для досліджень у машинному візуальному навчанні та зокрема для глибокого підкріплення. ViZDoom заснований на ZDoom для надання ігрової механіки.

А результати надзвичайно дивовижні, дивіться відео на їх веб-сторінці та чудовий підручник (на Python) тут!

Існує також подібний проект для Quake 3 Arena під назвою Quagents , який також забезпечує простий доступ API до базових ігрових даних, однак ви можете це заблокувати і просто використовувати скріншоти та API лише для контролю свого агента.

Чому така платформа корисна, якщо ми використовуємо лише скріншоти? Навіть якщо ви не маєте доступу до базових даних гри, така платформа забезпечує:

  • високопродуктивна реалізація ігор (ви можете генерувати більше даних / ігор / навчальних поколінь за менший час, щоб ваші алгоритми навчання могли швидше зближуватися!).
  • простий і чуйний API для управління вашими агентами (тобто, якщо ви намагаєтеся використовувати людські ресурси для управління грою, деякі ваші команди можуть бути втрачені, тому ви також матимете справу з ненадійністю своїх результатів ...).
  • простота налаштування користувацьких сценаріїв .
  • настроюється візуалізація (може бути корисною для "спрощення" зображень, які ви отримуєте, щоб полегшити обробку)
  • синхронізована ("покрокова") гра (так що спочатку вам не потрібен алгоритм для роботи в режимі реального часу, це величезне зниження складності).
  • додаткові функції зручності, такі як сумісність з кросплатформою, ретросумісність (ви не ризикуєте, щоб ваш бот більше не працював з грою, коли з'являється нове оновлення гри) тощо

Підводячи підсумок, велика річ у цих платформах полягає в тому, що вони полегшують більшу частину попередніх технічних проблем, з якими вам довелося мати справу (як маніпулювати ігровими входами, як налаштовувати сценарії тощо), так що вам просто доведеться мати справу з алгоритмом навчання. себе.

Отже, приступайте до роботи та робіть нас найкращим візуальним ботом AI;)


Стара публікація, в якій описуються технічні проблеми розробки ІС, покладаючись лише на візуальні дані:

На відміну від деяких моїх колег вище, я не вважаю цю проблему нерозв'язною. Але це, безумовно, здорово!

Перша проблема, як зазначено вище, полягає в представленні стану гри : ви не можете представляти повний стан лише одним зображенням, вам потрібно підтримувати якесь запам'ятовування(здоров'я, але також обладнані предмети та предмети, доступні для використання, квести та цілі тощо). Для отримання такої інформації у вас є два способи: або шляхом прямого доступу до даних гри, що є найбільш надійним і простим; або ви можете створити абстрактне представлення цієї інформації, застосовуючи кілька простих процедур (відкрити інвентар, зробити знімок екрана, витягнути дані). Звичайно, вилучення даних із скріншоту доведеться або вводити в якусь контрольовану процедуру (яку ви визначаєте повністю), або без нагляду (через алгоритм машинного навчання, але тоді це значно збільшить складність ...). Для машинного навчання без нагляду вам потрібно буде використовувати досить недавній вид алгоритмів, званих структурними алгоритмами навчання (які вивчають структуру даних, а не як їх класифікувати чи прогнозувати значення).http://techtalks.tv/talks/54422/

Потім, ще одна проблема полягає в тому, що навіть коли ви зібрали всі необхідні вам дані, гра лише спостерігається частково . Таким чином, вам потрібно ввести абстрактну модель світу та подати її оброблюваною інформацією з гри, наприклад, місцем розташування вашого аватара, а також розташуванням предметів квесту, цілей та ворогів поза екраном. Ви можете, можливо, заглянути для цього фільтри частинок суміші Vermaak 2003.

Також вам потрібно мати автономного агента , динамічно генерується цілі . Відома архітектура, яку ви можете спробувати, - це агент BDI, але вам, мабуть, доведеться налаштувати її, щоб ця архітектура працювала у вашому практичному випадку. В якості альтернативи також існує рекурсивна мережа Петрі, яку ви, ймовірно, можете поєднувати з різними варіаціями мереж Петрі, щоб досягти бажаного, оскільки це дуже добре вивчена та гнучка рамка, з великими процедурами формалізації та доказування.

І нарешті, навіть якщо ви будете робити все вищезазначене, вам знадобиться знайти спосіб емуляції гри з прискореною швидкістю (використання відео може бути приємним, але проблема полягає в тому, що ваш алгоритм буде дивитися лише без контролю та вміння намагатися для себе дуже важливо для навчання). Дійсно, загальновідомо, що сучасний сучасний алгоритм потребує набагато більше часу, щоб вивчити те саме, чого може навчитися людина (тим більше, що це навчання з підкріпленням), таким чином, якщо він не може прискорити процес ( тобто якщо ви не можете пришвидшити час гри), ваш алгоритм навіть не зблизиться протягом одного життя ...

На закінчення, те, що ви хочете досягти тут, знаходиться на межі (а може бути, трохи вище) сучасних найсучасніших алгоритмів . Я думаю, що це можливо, але навіть якщо це так, ви збираєтеся витратити привіт багато часу , тому що це не теоретична проблема, а практична проблема, до якої ви наближаєтесь, і, таким чином, вам потрібно багато втілити і об'єднати різних підходів AI з метою її вирішення.

Кількох десятиліть досліджень з цілою командою, яка працює над цим, може бути недостатньо, тому, якщо ви один і працюєте над ним неповний робочий день (як ви, мабуть, маєте на життя на життя), ви можете провести ціле життя, не доходячи ніде поблизу робоче рішення.

Тож моя найважливіша порада тут полягає в тому, щоб ви знизили свої очікування і намагалися зменшити складністьвашої проблеми, використовуючи всю інформацію, яку ви можете, і уникайте якнайбільше покладаючись на скріншоти (тобто спробуйте підключити безпосередньо до гри, шукайте введення DLL) та спростіть деякі проблеми, застосовуючи контрольовані процедури, не дозволяйте алгоритм вивчить усе (тобто покинути обробку зображень на даний момент якомога більше і покладатися на внутрішню інформацію про ігри; згодом, якщо ваш алгоритм працює добре, ви можете замінити деякі частини програми AI на обробку зображень, таким чином, грубо досягаючи своєї повної мети, наприклад, якщо ви можете змусити щось працювати досить добре, ви можете спробувати ускладнити свою проблему і замінити контрольовані процедури та дані гри в пам'ять на непідконтрольні алгоритми машинного навчання на скріншотах).

Удачі, і якщо це спрацює, обов’язково опублікуйте статтю, ви можете неодмінно славитись за вирішення такої важкої практичної проблеми!


27

Проблема, яку ви переслідуєте, нерозв'язна в тому, як ви її визначили. Зазвичай помилкою є думка, що нейронна мережа "магічно" навчиться багатого представлення проблеми. Хороший факт, який слід пам’ятати, вирішуючи, чи ANN є правильним інструментом для завдання, - це метод інтерполяції. Подумайте, чи можете ви поставити свою проблему як пошук апроксимації функції, де у вас є багато пунктів від цієї функції та багато часу для проектування мережі та її навчання.

Пропонована вами проблема не проходить цей тест. Управління іграми не є функцією зображення на екрані. Є багато інформації, яку повинен зберігати плеєр в пам'яті. Для простого прикладу часто буває вірно, що кожен раз, коли ви входите в магазин в грі, екран виглядає однаково. Однак те, що ви купуєте, залежить від обставин. Незалежно від того, наскільки складна мережа, якщо пікселі екрану є її входом, вона завжди виконує ту саму дію при вході в магазин.

Крім того, існує проблема масштабу. Завдання, яке ви пропонуєте, просто надто складне, щоб навчитися за будь-яку розумну кількість часу. Ви повинні побачити aigamedev.com про те, як працює гра AI. Artitificial Neural Networks успішно використовуються в деяких іграх, але дуже обмежено. Ігровий інтелект розробити складно і часто дорого. Якби існував загальний підхід до побудови функціональних нейронних мереж, галузь, швидше за все, захопила б це. Я рекомендую почати з набагато простіших прикладів, таких як тик-нок.


Досить справедливо. Ви можете назвати більшість, що нагадує мережу ANN, але це навряд чи може призвести до суттєвої дискусії. :)
Дон Реба

Хе так ... я мав би пояснити мотивацію більш глибоко. Я знаю, що є кращі способи зробити ігрові ІІ, але я роблю це, щоб просунути межі тренажера ANN, який я модернізував. Дивіться: stanford.edu/group/pdplab/pdphandbook
zergylord

1
У будь-якому випадку, Дон Реба має рацію, я теж не думаю, що було б доцільно вивчити стратегію для чогось подібного до Diablo, не включаючи багато попередніх знань та витягаючи корисні функції, на яких може базуватися підсилюючий підхід. Просто навчатись із відеовведення буде надзвичайно важко, якщо не неможливо, використовуючи сучасні комп’ютери.
ахан

18

Схоже, в центрі цього проекту вивчається те, що можливо з ANN, тому я б запропонував вибрати гру, де вам не доведеться мати справу з обробкою зображень (що з відповідей інших тут, здається, справді непросте завдання в гра в режимі реального часу). Ви можете використовувати API Starcraft для створення свого бота, він надає вам доступ до всіх відповідних ігрових станів.

http://code.google.com/p/bwapi/


2

В якості першого кроку ви можете подивитися на різницю послідовних кадрів. Ви повинні розрізняти фонові та фактичні спрайти монстрів. Я думаю, світ також може містити анімацію. Для того, щоб знайти тих, я б змусив персонажа рухатися навколо і збирати все, що рухається разом із світом, у велике фонове зображення / анімацію.

Ви могли виявляти та ідентифікувати ворогів із кореляцією (використовуючи FFT). Однак якщо анімації повторюють точну піксель, швидше буде переглянути лише кілька піксельних значень. Вашим головним завданням буде написати надійну систему, яка буде ідентифікувати, коли на екрані з'явиться новий об’єкт, і поступово всі кадри спрайт-кадру до бази даних. Ймовірно, вам доведеться будувати і моделі для ефектів зброї. Їх можна відняти так, щоб вони не захаращували вашу базу даних опонента.


2
Ознайомившись з грою Diablo II, я можу сказати, що вона використовує 256 кольорів (якщо в деяких режимах не використовується високий або справжній колір). Він також широко використовує спрайт для відображення різних об'єктів. Якщо ви в змозі витягти деякі спрайти (навіть із скріншоту), ви можете навчити свій інструмент розпізнавати об'єкти на основі спрайту (наприклад, випадене «Незначне цілюще зілля» завжди буде виглядати однаково). Якщо я заглиблююсь у конкретні речі Diablo II, то виникатимуть і більше питань. Удачі
Івайло Славов

1

Добре припускаючи, що в будь-який момент ви можете створити набір "результатів" (може включати ймовірності) з набору всіх можливих "рухів", і що в грі є якесь поняття послідовності (наприклад, ви можете грати на рівні X знову і знову знову), ви можете почати з N нейронних мереж із випадковими вагами і змусити кожного з них грати в гру наступним чином:

1) Для кожного можливого "ходу" сформуйте список можливих "результатів" (з пов'язаними з ними ймовірностями) 2) Для кожного результату використовуйте свою нейронну мережу, щоб визначити пов'язаний "вартості" (оцінка) результату (наприклад, число від -1 до 1, 1 - найкращий можливий результат, -1 - найгірший) 3) Виберіть "ходу", що веде до найвищої оцінки * 4) Якщо хід призвів до "виграшу" або "програшу", зупинити, інакше поверніться до кроку 1.

Через певний проміжок часу (або «виграти» / «програти») оцініть, наскільки близька нейрональна мережа була до «мети» (це, ймовірно, передбачає певні знання про домен). Потім викиньте 50% (або якийсь інший відсоток) NN, які були найдалі від мети, зробіть кросовер / мутацію верхніх 50% та запустіть новий набір NN знову. Продовжуйте працювати, поки не вийде задовільний NN.


Ах, додавання GA у суміш, цікаво. На жаль, оскільки у мене в мережі фактично надсилаються натискання клавіш / рухів миші як дії, мені знадобиться один фізичний комп'ютер на мережу>. <Ще одна проблема полягає в тому, що простір стану середовища не дискретний (добре це технічно, але в дуже дрібне зерно). Наприклад, уявіть можливий результат, пов’язаний з натисканням миші: персонаж, який знаходиться під управлінням мережі, може рухатися або атакувати, але вороги можуть бути переміщені також, і в оточенні виникнуть піксельні відмінності від таких речей, як тіні та погодні ефекти .
zergylord

Ну, з моєї точки зору, з нейронної сітки можна зробити лише стільки, що можна зробити. Здається, у кращому випадку це може бути використано як евристична функція, що засвоюється деяким поняттям дискретного простору стану. Щоб включити мінливість супротивника, вам, ймовірно, доведеться використовувати якусь іншу евристику, тоді ви могли б використовувати це для створення набору можливих станів результату за ходу із пов'язаними ймовірностями. Крім того, доки існує статичне поняття початкової та кінцевої конфігурації, ви можете просто запускати кожну нейронну мережу по одному.
tstramer

1

Я думаю, що найкращим варіантом буде складна архітектура, що включає декілька мереж / можливостей: наприклад, розпізнавання та реагування на товари, одна для магазину, одна для бою (можливо, тут вам знадобиться одна для розпізнавання ворога, одна для атак) тощо .

Потім спробуйте придумати найпростіший можливий геймплей Diablo II, напевно, варвар. Тоді будьте спочатку прості, як і у I акті, лише перша область.

Тоді я здогадуюсь, що цінними «цілями» були б зникнення ворожих предметів і зменшення штанги здоров’я (забито зворотно).

Після того, як у вас будуть вирішені ці "простіші" завдання, ви можете скористатись "master" ANN, щоб вирішити, який суб-ANN активувати.

Що стосується тренувань, я бачу лише три варіанти: ви можете використовувати описаний вище еволюційний метод, але тоді вам потрібно вручну вибрати "переможців", якщо ви не кодуєте цілу окрему програму для цього. У вас може бути мережа "дивитися", щоб хтось грав. Тут вони навчаться наслідувати гравця або групу стилю гравця. Мережа намагається передбачити наступну дію гравця, підкріплюється для правильної здогадки і т. Д. Якщо ви насправді отримуєте АНН, ви хочете, що це можна зробити за допомогою відеоігра, немає необхідності в реальному геймплейному режимі. Нарешті, ви можете дозволити мережі грати в гру, маючи смерть противника, підвищуючи рівень здоров'я, відновившись здоров'я тощо, як позитивне підкріплення та смерть гравця, втрата здоров'я тощо, як негативне підкріплення. Але бачачи, як навіть для простої мережі потрібні тисячі конкретних навчальних кроків, щоб навчитися навіть простим завданням,

Загалом ваш проект дуже амбітний. Але я вважаю, що це "теоретично можна зробити", давши достатньо часу.

Сподіваюся, це допомагає і удачі!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.