ساخت یک بازی رومیزی با TensorFlow Agents و Flutter

۱. قبل از شروع

پیشرفت شگفت‌انگیز AlphaGo و AlphaStar پتانسیل استفاده از یادگیری ماشینی را برای ساخت عامل‌های بازی در سطح ابرانسانی نشان داد. ساخت یک بازی کوچک مبتنی بر یادگیری ماشینی برای کسب مهارت‌های لازم برای ایجاد عامل‌های بازی قدرتمند، یک تمرین سرگرم‌کننده است.

در این آزمایشگاه کد، یاد می‌گیرید که چگونه با استفاده از موارد زیر یک بازی تخته‌ای بسازید:

  • عامل TensorFlow برای آموزش یک عامل بازی با یادگیری تقویتی
  • TensorFlow در حال خدمت رسانی برای ارائه مدل
  • فلاتر برای ایجاد یک اپلیکیشن بازی تخته‌ای چند پلتفرمی

پیش‌نیازها

  • دانش پایه توسعه Flutter با Dart
  • دانش پایه در مورد یادگیری ماشین با TensorFlow، مانند آموزش در مقابل استقرار
  • آشنایی اولیه با پایتون، ترمینال‌ها و داکر

آنچه یاد خواهید گرفت

  • نحوه آموزش یک عامل شخصیت غیر بازیکن (NPC) با استفاده از عوامل TensorFlow
  • نحوه سرویس‌دهی به مدل آموزش‌دیده با استفاده از TensorFlow Serving
  • چگونه یک بازی رومیزی چند پلتفرمی Flutter بسازیم؟

آنچه نیاز دارید

۲. بازی حمله هواپیما

بازی‌ای که در این آزمایشگاه کد می‌سازید «حمله هواپیما» نام دارد، یک بازی تخته‌ای کوچک دو نفره که شبیه بازی تخته‌ای «نبرد ناو» است. قوانین آن بسیار ساده است:

  • بازیکن انسانی در مقابل یک NPC که توسط یادگیری ماشینی آموزش دیده است، بازی می‌کند. بازیکن انسانی می‌تواند بازی را با لمس هر خانه‌ای در صفحه بازی آغاز کند.
  • در ابتدای بازی، بازیکن انسانی و عامل هر کدام یک شیء «صفحه» (۸ خانه سبز که یک «صفحه» را تشکیل می‌دهند، همانطور که می‌توانید در صفحه بازیکن انسانی در انیمیشن زیر ببینید) روی صفحه‌های خود دارند؛ این «صفحه‌ها» به صورت تصادفی قرار گرفته‌اند و فقط برای صاحبان صفحه قابل مشاهده و برای حریفانشان پنهان هستند.
  • بازیکن انسانی و عامل به نوبت به یک سلول از صفحه یکدیگر ضربه می‌زنند. بازیکن انسانی می‌تواند به هر سلولی در صفحه عامل ضربه بزند، در حالی که عامل به طور خودکار بر اساس پیش‌بینی مدل یادگیری ماشینی انتخاب را انجام می‌دهد. اگر سلول مورد نظر یک سلول «مسطح» باشد («به آن ضربه زده شود»)؛ در غیر این صورت زرد می‌شود («از دستش برود»).
  • هر کسی که زودتر به ۸ خانه قرمز برسد، برنده بازی است؛ سپس بازی با تخته‌های جدید از سر گرفته می‌شود.

این هم نمونه‌ای از گیم‌پلی بازی:

77cead530c5a4aff.gif

۳. محیط توسعه فلاتر خود را تنظیم کنید

برای توسعه فلاتر، به دو نرم‌افزار برای تکمیل این آزمایشگاه کد نیاز دارید - SDK فلاتر و یک ویرایشگر .

شما می‌توانید codelab را با استفاده از هر یک از این دستگاه‌ها اجرا کنید:

  • شبیه‌ساز iOS (نیاز به نصب ابزارهای Xcode دارد).
  • شبیه‌ساز اندروید (نیاز به راه‌اندازی در اندروید استودیو دارد).
  • یک مرورگر (برای اشکال‌زدایی، کروم مورد نیاز است).
  • به عنوان یک برنامه دسکتاپ ویندوز ، لینوکس یا macOS . شما باید روی پلتفرمی که قصد استقرار آن را دارید، توسعه دهید. بنابراین، اگر می‌خواهید یک برنامه دسکتاپ ویندوز توسعه دهید، باید روی ویندوز توسعه دهید تا به زنجیره ساخت مناسب دسترسی داشته باشید. الزامات خاص سیستم عامل وجود دارد که به تفصیل در docs.flutter.dev/desktop پوشش داده شده است.

۴. آماده شوید

برای دانلود کد این codelab:

  1. برای این آزمایشگاه کد به مخزن گیت‌هاب بروید.
  2. برای دانلود تمام کدهای این codelab، روی Code > Download zip کلیک کنید.

2cd45599f51fb8a2.png

  1. فایل زیپ دانلود شده را از حالت فشرده خارج کنید تا پوشه ریشه codelabs-main حاوی تمام منابع مورد نیاز شما باز شود.

برای این آزمایشگاه کد، شما فقط به فایل‌های موجود در زیرشاخه tfagents-flutter/ در مخزن نیاز دارید که شامل چندین پوشه است:

  • پوشه‌های step0 تا step6 حاوی کد آغازینی هستند که برای هر مرحله در این آزمایشگاه کد، بر اساس آن کد می‌سازید.
  • پوشه‌ی finished حاوی کد تکمیل‌شده برای برنامه‌ی نمونه‌ی نهایی است.
  • هر پوشه شامل یک زیرپوشه backbend است که شامل کد backend و یک زیرپوشه frontend است که شامل کد frontend فلاتر می‌شود.

۵. وابستگی‌های پروژه را دانلود کنید

بک‌اند

ترمینال خود را باز کنید و به زیرپوشه tfagents-flutter بروید. دستور زیر را اجرا کنید:

pip install -r requirements.txt

ظاهر (فرانت‌اند)

  1. در VS Code، روی File > Open folder کلیک کنید و سپس پوشه step0 را از کد منبعی که قبلاً دانلود کرده‌اید، انتخاب کنید.
  2. فایل step0/frontend/lib/main.dart را باز کنید. اگر پنجره‌ی VS Code ظاهر شد و از شما خواست بسته‌های مورد نیاز برای برنامه‌ی آغازین را دانلود کنید، روی Get packages کلیک کنید.
  3. اگر این پنجره را نمی‌بینید، ترمینال خود را باز کنید و سپس دستور flutter pub get را در پوشه step0/frontend اجرا کنید.

7ada07c300f166a6.png

۶. مرحله ۰: اجرای برنامه اولیه

  1. فایل step0/frontend/lib/main.dart را در VS Code باز کنید، مطمئن شوید که شبیه‌ساز اندروید یا شبیه‌ساز iOS به درستی تنظیم شده و در نوار وضعیت نمایش داده می‌شود.

برای مثال، وقتی از Pixel 5 با شبیه‌ساز اندروید استفاده می‌کنید، این چیزی است که می‌بینید:

۹۷۶۷۶۴۹۲۳۱۸۹۸۷۹۱.png

وقتی از آیفون ۱۳ با شبیه‌ساز iOS استفاده می‌کنید، این چیزی است که می‌بینید:

۹۵۵۲۹e۳a۶۸۲۲۶۸b۲.png

  1. کلیک a19a0c68bc4046e6.png اشکال‌زدایی را شروع کنید .

برنامه را اجرا و بررسی کنید

برنامه باید روی شبیه‌ساز اندروید یا شبیه‌ساز iOS شما اجرا شود. رابط کاربری بسیار ساده است. دو صفحه بازی وجود دارد؛ یک بازیکن انسانی می‌تواند به هر خانه‌ای در صفحه عامل در بالا به عنوان موقعیت ضربه زدن ضربه بزند. شما یک عامل هوشمند را آموزش خواهید داد تا به طور خودکار پیش‌بینی کند که بر اساس صفحه بازیکن انسانی به کجا ضربه بزند.

در باطن، برنامه Flutter صفحه فعلی بازیکن انسانی را به backend ارسال می‌کند، که یک مدل یادگیری تقویتی را اجرا می‌کند و موقعیت سلول پیش‌بینی‌شده برای ضربه بعدی را برمی‌گرداند. frontend پس از دریافت پاسخ، نتیجه را در رابط کاربری نمایش می‌دهد.

734ab3d48a1133e1.png15cba2e741149c95.png

اگر اکنون روی هر سلولی در صفحه اپراتور کلیک کنید، هیچ اتفاقی نمی‌افتد زیرا برنامه هنوز نمی‌تواند با backend ارتباط برقرار کند.

۷. مرحله ۱: ایجاد یک محیط پایتون برای TensorFlow Agents

هدف اصلی این آزمایشگاه کد، طراحی عاملی است که از طریق تعامل با محیط یاد می‌گیرد. در حالی که بازی Plane Strike نسبتاً ساده است و می‌توان قوانین را برای عامل NPC به صورت دستی ایجاد کرد، شما از یادگیری تقویتی برای آموزش یک عامل استفاده می‌کنید تا مهارت‌ها را یاد بگیرید و بتوانید به راحتی عامل‌هایی را برای بازی‌های دیگر در آینده بسازید.

در تنظیمات استاندارد یادگیری تقویتی (RL)، عامل در هر گام زمانی یک مشاهده دریافت می‌کند و یک عمل را انتخاب می‌کند. عمل به محیط اعمال می‌شود و محیط یک پاداش و یک مشاهده جدید را برمی‌گرداند. عامل، سیاستی را برای انتخاب اعمالی جهت به حداکثر رساندن مجموع پاداش‌ها، که به عنوان بازگشت نیز شناخته می‌شود، آموزش می‌دهد. با انجام بازی به دفعات زیاد، عامل قادر به یادگیری الگوها و تقویت مهارت‌های خود برای تسلط بر بازی است. برای فرموله کردن بازی حمله هواپیما به عنوان یک مسئله RL، وضعیت صفحه را به عنوان مشاهده، موقعیت حمله را به عنوان عمل و سیگنال برخورد/خطا را به عنوان پاداش در نظر بگیرید.

bc5da07bc45062f4.png

برای آموزش عامل NPC، از TensorFlow Agents استفاده می‌کنید که یک کتابخانه یادگیری تقویتی قابل اعتماد، مقیاس‌پذیر و آسان برای استفاده برای TensorFlow است.

TF Agents برای یادگیری تقویتی عالی است زیرا با مجموعه گسترده‌ای از آزمایشگاه‌های کد، مثال‌ها و مستندات گسترده برای شروع کار شما ارائه می‌شود. می‌توانید از TF Agents برای حل مسائل واقع‌گرایانه و پیچیده یادگیری تقویتی با مقیاس‌پذیری استفاده کنید و الگوریتم‌های جدید یادگیری تقویتی را به سرعت توسعه دهید. می‌توانید به راحتی بین عامل‌ها و الگوریتم‌های مختلف برای آزمایش جابجا شوید. همچنین به خوبی آزمایش شده و پیکربندی آن آسان است.

محیط‌های بازی از پیش ساخته شده زیادی در OpenAI Gym (مثلاً بازی‌های آتاری)، Mujuco و غیره پیاده‌سازی شده‌اند که TF Agentها می‌توانند به راحتی از آنها استفاده کنند. اما از آنجایی که بازی Plane Strike یک بازی کاملاً سفارشی است، ابتدا باید یک محیط جدید را از ابتدا پیاده‌سازی کنید.

برای پیاده‌سازی محیط پایتون TF Agents، باید روش‌های زیر را پیاده‌سازی کنید:

class YourGameEnv(py_environment.PyEnvironment):

  def __init__(self):
    """Initialize environment."""


  def action_spec(self):
    """Return action_spec."""


  def observation_spec(self):
    """Return observation_spec."""


  def _reset(self):
    """Return initial_time_step."""


  def _step(self, action):
    """Apply action and return new time_step."""

مهم‌ترین تابع، تابع _step() است که یک عمل را دریافت کرده و یک شیء time_step جدید برمی‌گرداند. در مورد بازی Plane Strike، شما یک صفحه بازی دارید؛ وقتی یک موقعیت ضربه جدید وارد می‌شود، بر اساس شرایط صفحه بازی، محیط موارد زیر را محاسبه می‌کند:

  • صفحه بازی در مرحله بعد باید چه شکلی باشد (با توجه به موقعیت صفحه پنهان، آیا رنگ خانه باید به قرمز یا زرد تغییر کند؟)
  • بازیکن برای آن موقعیت چه پاداشی باید دریافت کند (پاداش ضربه یا پنالتی از دست رفته؟)
  • آیا بازی باید تمام شود (آیا کسی برنده شد؟)
  • کد زیر را به تابع _step() در فایل _planestrike_py_environment.py اضافه کنید:
if self._hit_count == self._plane_size:
    self._episode_ended = True
    return self.reset()

if self._strike_count + 1 == self._max_steps:
    self.reset()
    return ts.termination(
        np.array(self._visible_board, dtype=np.float32), UNFINISHED_GAME_REWARD
    )

self._strike_count += 1
action_x = action // self._board_size
action_y = action % self._board_size
# Hit
if self._hidden_board[action_x][action_y] == HIDDEN_BOARD_CELL_OCCUPIED:
    # Non-repeat move
    if self._visible_board[action_x][action_y] == VISIBLE_BOARD_CELL_UNTRIED:
        self._hit_count += 1
        self._visible_board[action_x][action_y] = VISIBLE_BOARD_CELL_HIT
        # Successful strike
        if self._hit_count == self._plane_size:
            # Game finished
            self._episode_ended = True
            return ts.termination(
                np.array(self._visible_board, dtype=np.float32),
                FINISHED_GAME_REWARD,
            )
        else:
            self._episode_ended = False
            return ts.transition(
                np.array(self._visible_board, dtype=np.float32),
                HIT_REWARD,
                self._discount,
            )
    # Repeat strike
    else:
        self._episode_ended = False
        return ts.transition(
            np.array(self._visible_board, dtype=np.float32),
            REPEAT_STRIKE_REWARD,
            self._discount,
        )
# Miss
else:
    # Unsuccessful strike
    self._episode_ended = False
    self._visible_board[action_x][action_y] = VISIBLE_BOARD_CELL_MISS
    return ts.transition(
        np.array(self._visible_board, dtype=np.float32),
        MISS_REWARD,
        self._discount,

۸. مرحله ۲: آموزش عامل بازی با TensorFlow Agents

با استفاده از محیط TF Agents، می‌توانید عامل بازی را آموزش دهید. برای این آزمایشگاه کد، از یک عامل REINFORCE استفاده می‌کنید. REINFORCE یک الگوریتم گرادیان سیاست در یادگیری تقویتی است. ایده اصلی آن تنظیم پارامترهای شبکه عصبی سیاست بر اساس سیگنال‌های پاداش جمع‌آوری‌شده در طول گیم‌پلی است، به طوری که شبکه سیاست بتواند بازده را در بازی‌های آینده به حداکثر برساند.

  • ابتدا، باید محیط‌های آموزش و ارزیابی را نمونه‌سازی کنید. این کد را به تابع train_agent() در فایل step2/backend/training.py اضافه کنید:
train_py_env = planestrike_py_environment.PlaneStrikePyEnvironment(
    board_size=BOARD_SIZE, discount=DISCOUNT, max_steps=BOARD_SIZE**2
)
eval_py_env = planestrike_py_environment.PlaneStrikePyEnvironment(
    board_size=BOARD_SIZE, discount=DISCOUNT, max_steps=BOARD_SIZE**2
)

train_env = tf_py_environment.TFPyEnvironment(train_py_env)
eval_env = tf_py_environment.TFPyEnvironment(eval_py_env)
  • در مرحله بعد، باید یک عامل یادگیری تقویتی ایجاد کنید که قرار است آموزش داده شود. در این آزمایشگاه کد، از عامل REINFORCE استفاده می‌کنید که یک عامل مبتنی بر سیاست است. این کد را درست زیر کد بالا اضافه کنید:
actor_net = tfa.networks.Sequential(
    [
        tfa.keras_layers.InnerReshape([BOARD_SIZE, BOARD_SIZE], [BOARD_SIZE**2]),
        tf.keras.layers.Dense(FC_LAYER_PARAMS, activation="relu"),
        tf.keras.layers.Dense(BOARD_SIZE**2),
        tf.keras.layers.Lambda(lambda t: tfp.distributions.Categorical(logits=t)),
    ],
    input_spec=train_py_env.observation_spec(),
)

optimizer = tf.keras.optimizers.Adam(learning_rate=LEARNING_RATE)

train_step_counter = tf.Variable(0)

tf_agent = reinforce_agent.ReinforceAgent(
    train_env.time_step_spec(),
    train_env.action_spec(),
    actor_network=actor_net,
    optimizer=optimizer,
    normalize_returns=True,
    train_step_counter=train_step_counter,
)
  • در نهایت، عامل را در حلقه آموزش آموزش دهید. در حلقه، ابتدا چند قسمت از بازی‌های انجام شده را در یک بافر جمع‌آوری می‌کنید و سپس عامل را با داده‌های بافر شده آموزش می‌دهید. این کد را به تابع train_agent() در فایل step2/backend/training.py اضافه کنید:
# Collect a few episodes using collect_policy and save to the replay buffer.
collect_episode(
    train_py_env,
    collect_policy,
    COLLECT_EPISODES_PER_ITERATION,
    replay_buffer_observer,
)

# Use data from the buffer and update the agent's network.
iterator = iter(replay_buffer.as_dataset(sample_batch_size=1))
trajectories, _ = next(iterator)
tf_agent.train(experience=trajectories)
replay_buffer.clear()
  • حالا می‌توانید آموزش را شروع کنید. در ترمینال خود، به پوشه step2/backend در رایانه خود بروید و دستور زیر را اجرا کنید:
python training.py

بسته به پیکربندی سخت‌افزار شما، اتمام آموزش ۸ تا ۱۲ ساعت طول می‌کشد (لازم نیست کل آموزش را خودتان تمام کنید زیرا یک مدل از پیش آموزش‌دیده در step3 ارائه شده است). در این میان، می‌توانید پیشرفت را با TensorBoard رصد کنید. یک ترمینال جدید باز کنید، به پوشه step2/backend در رایانه خود بروید و دستور زیر را اجرا کنید:

tensorboard --logdir tf_agents_log/

tf_agents_log پوشه‌ای است که گزارش آموزش در آن قرار دارد. یک نمونه از اجرای آموزش به شکل زیر است:

33e12e2b387c063a.png8488632ccf43348a.png

می‌توانید ببینید که با پیشرفت آموزش، میانگین طول قسمت کاهش و میانگین بازده افزایش می‌یابد. به طور شهودی می‌توانید درک کنید که اگر عامل باهوش‌تر باشد و پیش‌بینی‌های بهتری انجام دهد، طول بازی کوتاه‌تر می‌شود و عامل پاداش‌های بیشتری جمع‌آوری می‌کند. این منطقی است زیرا عامل می‌خواهد بازی را در مراحل کمتری به پایان برساند تا تخفیف سنگین پاداش را در مراحل بعدی به حداقل برساند.

پس از اتمام آموزش، مدل آموزش‌دیده به پوشه policy_model منتقل می‌شود.

۹. مرحله ۳: مدل آموزش‌دیده را با TensorFlow Serving مستقر کنید

اکنون که عامل بازی را آموزش داده‌اید، می‌توانید آن را با TensorFlow Serving مستقر کنید.

  • در ترمینال خود، به پوشه step3/backend در رایانه خود بروید و TensorFlow Serving with Docker را شروع کنید:
docker run -t --rm -p 8501:8501 -p 8500:8500 -v "$(pwd)/backend/policy_model:/models/policy_model" -e MODEL_NAME=policy_model tensorflow/serving

داکر ابتدا به طور خودکار تصویر TensorFlow Serving را دانلود می‌کند که یک دقیقه طول می‌کشد. پس از آن، TensorFlow Serving باید شروع شود. گزارش باید مانند این قطعه کد باشد:

2022-05-30 02:38:54.147771: I tensorflow_serving/model_servers/server.cc:89] Building single TensorFlow model file config:  model_name: policy_model model_base_path: /models/policy_model
2022-05-30 02:38:54.148222: I tensorflow_serving/model_servers/server_core.cc:465] Adding/updating models.
2022-05-30 02:38:54.148273: I tensorflow_serving/model_servers/server_core.cc:591]  (Re-)adding model: policy_model
2022-05-30 02:38:54.262684: I tensorflow_serving/core/basic_manager.cc:740] Successfully reserved resources to load servable {name: policy_model version: 123}
2022-05-30 02:38:54.262768: I tensorflow_serving/core/loader_harness.cc:66] Approving load for servable version {name: policy_model version: 123}
2022-05-30 02:38:54.262787: I tensorflow_serving/core/loader_harness.cc:74] Loading servable version {name: policy_model version: 123}
2022-05-30 02:38:54.265010: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:38] Reading SavedModel from: /models/policy_model/123
2022-05-30 02:38:54.277811: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:90] Reading meta graph with tags { serve }
2022-05-30 02:38:54.278116: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:132] Reading SavedModel debug info (if present) from: /models/policy_model/123
2022-05-30 02:38:54.280229: I external/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2022-05-30 02:38:54.332352: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:206] Restoring SavedModel bundle.
2022-05-30 02:38:54.337000: I external/org_tensorflow/tensorflow/core/platform/profile_utils/cpu_utils.cc:114] CPU Frequency: 2193480000 Hz
2022-05-30 02:38:54.402803: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:190] Running initialization op on SavedModel bundle at path: /models/policy_model/123
2022-05-30 02:38:54.410707: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:277] SavedModel load for tags { serve }; Status: success: OK. Took 145695 microseconds.
2022-05-30 02:38:54.412726: I tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc:59] No warmup data file found at /models/policy_model/123/assets.extra/tf_serving_warmup_requests
2022-05-30 02:38:54.417277: I tensorflow_serving/core/loader_harness.cc:87] Successfully loaded servable version {name: policy_model version: 123}
2022-05-30 02:38:54.419846: I tensorflow_serving/model_servers/server_core.cc:486] Finished adding/updating models
2022-05-30 02:38:54.420066: I tensorflow_serving/model_servers/server.cc:367] Profiler service is enabled
2022-05-30 02:38:54.428339: I tensorflow_serving/model_servers/server.cc:393] Running gRPC ModelServer at 0.0.0.0:8500 ...
[warn] getaddrinfo: address family for nodename not supported
2022-05-30 02:38:54.431620: I tensorflow_serving/model_servers/server.cc:414] Exporting HTTP/REST API at:localhost:8501 ...
[evhttp_server.cc : 245] NET_LOG: Entering the event loop ...

می‌توانید یک درخواست نمونه به نقطه پایانی ارسال کنید تا مطمئن شوید که مطابق انتظار کار می‌کند:

curl -d '{"signature_name":"action","instances":[{"0/discount":0.0,"0/observation":[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,     0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]],"0/reward":0.0,"0/step_type":0}]}'     -X POST http://localhost:8501/v1/models/policy_model:predict

نقطه پایانی موقعیت پیش‌بینی‌شده 45 را برمی‌گرداند، که (۵، ۵) در مرکز صفحه است (برای کنجکاوی، می‌توانید سعی کنید بفهمید که چرا مرکز صفحه حدس خوبی برای موقعیت ضربه اول است).

{
    "predictions": [45]
}

همین! شما با موفقیت یک backend برای پیش‌بینی موقعیت ضربه بعدی برای عامل NPC ساختید..

۱۰. مرحله ۴: ایجاد اپلیکیشن Flutter برای اندروید و iOS

بخش پشتی آماده است. می‌توانید درخواست‌هایی را برای بازیابی پیش‌بینی‌های موقعیت ضربه از برنامه Flutter به آن ارسال کنید.

  • ابتدا باید یک کلاس تعریف کنید که ورودی‌ها را برای ارسال در خود جای دهد. این کد را به فایل step4/frontend/lib/game_agent.dart اضافه کنید:
class Inputs {
  final List<double> _boardState;
  Inputs(this._boardState);

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['0/discount'] = [0.0];
    data['0/observation'] = [_boardState];
    data['0/reward'] = [0.0];
    data['0/step_type'] = [0];
    return data;
  }
}

اکنون می‌توانید درخواست را به TensorFlow Serving ارسال کنید تا پیش‌بینی‌ها انجام شود.

  • این کد را به تابع predict() در فایل step4/frontend/lib/game_agent.dart اضافه کنید:
var flattenedBoardState = boardState.expand((i) => i).toList();
final response = await http.post(
  Uri.parse('http://$server:8501/v1/models/policy_model:predict'),
  body: jsonEncode(<String, dynamic>{
    'signature_name': 'action',
    'instances': [Inputs(flattenedBoardState)]
  }),
);

if (response.statusCode == 200) {
  var output = List<int>.from(
      jsonDecode(response.body)['predictions'] as List<dynamic>);
  return output[0];
} else {
  throw Exception('Error response');
}

زمانی که برنامه پاسخ را از backend دریافت کرد، رابط کاربری بازی را به‌روزرسانی می‌کنید تا پیشرفت بازی را منعکس کند.

  • این کد را به تابع _gridItemTapped() در فایل step4/frontend/lib/main.dart اضافه کنید:
int agentAction =
    await _policyGradientAgent.predict(_playerVisibleBoardState);
_agentActionX = agentAction ~/ _boardSize;
_agentActionY = agentAction % _boardSize;
if (_playerHiddenBoardState[_agentActionX][_agentActionY] ==
    hiddenBoardCellOccupied) {
  // Non-repeat move
  if (_playerVisibleBoardState[_agentActionX][_agentActionY] ==
      visibleBoardCellUntried) {
    _agentHitCount++;
  }
  _playerVisibleBoardState[_agentActionX][_agentActionY] =
      visibleBoardCellHit;
} else {
  _playerVisibleBoardState[_agentActionX][_agentActionY] =
      visibleBoardCellMiss;
}
setState(() {});

اجراش کن

  1. کلیک a19a0c68bc4046e6.png اشکال‌زدایی را شروع کنید و سپس منتظر بارگذاری برنامه باشید.
  2. برای شروع بازی، روی هر خانه‌ای در صفحه‌ی عامل ضربه بزنید.

852942d0de299c1f.png6ae3601470c8e33a.png

۱۱. مرحله ۵: فعال کردن برنامه Flutter برای پلتفرم‌های دسکتاپ

علاوه بر اندروید و iOS، فلاتر از پلتفرم‌های دسکتاپ از جمله لینوکس، مک و ویندوز نیز پشتیبانی می‌کند.

لینوکس

  1. مطمئن شوید که دستگاه هدف روی آن تنظیم شده است 86cba523de82b4f9.png در نوار وضعیت VSCode.
  2. کلیک a19a0c68bc4046e6.png اشکال‌زدایی را شروع کنید و سپس منتظر بارگذاری برنامه باشید.
  3. برای شروع بازی، روی هر خانه‌ای در صفحه‌ی عامل کلیک کنید.

۴۸۵۹۴c۷c۰a۵۸۹۷۳۳.png

مک

  1. برای مک، باید مجوزهای مناسب را تنظیم کنید زیرا برنامه درخواست‌های HTTP را به backend ارسال می‌کند. برای جزئیات بیشتر، لطفاً به Entitlements و App Sandbox مراجعه کنید.

این کد را به ترتیب به step4/frontend/macOS/Runner/DebugProfile.entitlements و step4/frontend/macOS/Runner/Release.entitlements اضافه کنید:

<key>com.apple.security.network.client</key>
<true/>
  1. مطمئن شوید که دستگاه هدف روی آن تنظیم شده است eb4b0b5563824138.png در نوار وضعیت VSCode.
  2. کلیک a19a0c68bc4046e6.png اشکال‌زدایی را شروع کنید و سپس منتظر بارگذاری برنامه باشید.
  3. برای شروع بازی، روی هر خانه‌ای در صفحه‌ی عامل کلیک کنید.

55a5de3674194e89.png

ویندوز

  1. مطمئن شوید که دستگاه هدف روی آن تنظیم شده است ۹۵۸۷be1bb375bc0f.png در نوار وضعیت VSCode.
  2. کلیک a19a0c68bc4046e6.png اشکال‌زدایی را شروع کنید و سپس منتظر بارگذاری برنامه باشید.
  3. برای شروع بازی، روی هر خانه‌ای در صفحه‌ی عامل کلیک کنید.

41d9f87d84c5e755.png

۱۲. مرحله ۶: فعال کردن برنامه Flutter برای پلتفرم وب

کار دیگری که می‌توانید انجام دهید، اضافه کردن پشتیبانی وب به برنامه Flutter است. به طور پیش‌فرض، پلتفرم وب به طور خودکار برای برنامه‌های Flutter فعال است، بنابراین تنها کاری که باید انجام دهید این است که آن را اجرا کنید.

  1. مطمئن شوید که دستگاه هدف روی آن تنظیم شده است 71db93efa928d15d.png در نوار وضعیت VSCode.
  2. کلیک a19a0c68bc4046e6.png اشکال‌زدایی را شروع کنید و سپس منتظر بمانید تا برنامه در مرورگر کروم بارگذاری شود.
  3. برای شروع بازی، روی هر خانه‌ای در صفحه‌ی عامل کلیک کنید.

fae7490304e28dfe.png

۱۳. تبریک

شما یک برنامه بازی تخته‌ای با یک عامل مبتنی بر یادگیری ماشین ساختید تا در مقابل بازیکن انسانی بازی کند!

بیشتر بدانید