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

1. قبل از شروع

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

در این کد لبه، نحوه ساخت یک بازی رومیزی را با استفاده از:

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

پیش نیازها

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

چیزی که یاد خواهید گرفت

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

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

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

بازی‌ای که در این نرم‌افزار می‌سازید، "Plane Strike" نام دارد، یک بازی کوچک 2 نفره که شبیه بازی تخته "Battleship" است. قوانین بسیار ساده هستند:

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

در اینجا نمونه ای از گیم پلی بازی را مشاهده می کنید:

77cead530c5a4aff.gif

3. محیط توسعه Flutter خود را تنظیم کنید

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

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

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

4. راه اندازی شوید

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

  1. به مخزن GitHub برای این Codelab بروید.
  2. روی Code > Download zip کلیک کنید تا همه کدهای این کد لبه را دانلود کنید.

2cd45599f51fb8a2.png

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

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

  • پوشه های step0 تا step6 حاوی کد شروعی هستند که برای هر مرحله در این کد لبه ایجاد می کنید.
  • پوشه finished حاوی کد تکمیل شده برای برنامه نمونه تمام شده است.
  • هر پوشه حاوی یک زیر پوشه backbend است که شامل کد باطن است و یک زیر پوشه frontend که شامل کد Flutter frontend است.

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

Backend

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

pip install -r requirements.txt

Frontend

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

7ada07c300f166a6.png

6. مرحله 0: برنامه شروع را اجرا کنید

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

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

9767649231898791.png

در اینجا چیزی است که هنگام استفاده از iPhone 13 با شبیه ساز iOS مشاهده می کنید:

95529e3a682268b2.png

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

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

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

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

734ab3d48a1133e1.png15cba2e741149c95.png

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

7. مرحله 1: یک محیط پایتون TensorFlow Agents ایجاد کنید

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

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

bc5da07bc45062f4.png

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

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

بسیاری از محیط‌های بازی از پیش ساخته شده در OpenAI Gym (به عنوان مثال، بازی‌های Atari)، Mujuco و غیره پیاده‌سازی شده‌اند، که TF Agents می‌تواند به راحتی از آنها استفاده کند. اما از آنجایی که بازی 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,

8. مرحله 2: عامل بازی را با TensorFlow Agents آموزش دهید

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

  • ابتدا باید محیط های آموزشی و ارزیابی را نمونه سازی کنید. این کد را به تابع 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

بسته به تنظیمات سخت افزاری شما، 8 تا 12 ساعت طول می کشد تا آموزش را به پایان برسانید (لازم نیست تمام آموزش را خودتان تمام کنید زیرا یک مدل از پیش آموزش دیده در step3 ارائه شده است). در عین حال، می توانید پیشرفت را با TensorBoard نظارت کنید. یک ترمینال جدید باز کنید، به پوشه step2/backend در رایانه خود بروید و اجرا کنید:

tensorboard --logdir tf_agents_log/

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

33e12e2b387c063a.png8488632ccf43348a.png

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

پس از اتمام آموزش، مدل آموزش دیده به پوشه policy_model صادر می شود.

9. مرحله 3: مدل آموزش دیده را با سرویس TensorFlow اجرا کنید

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

  • در ترمینال خود، به پوشه 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

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

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 را برمی‌گرداند که (5، 5) در مرکز تخته است (برای افراد کنجکاو، می‌توانید سعی کنید بفهمید که چرا مرکز تخته حدس خوبی برای موقعیت ضربه اول است).

{
    "predictions": [45]
}

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

10. مرحله 4: برنامه 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');
}

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

  • این کد را به تابع _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

11. مرحله 5: برنامه Flutter را برای پلتفرم های دسکتاپ فعال کنید

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

لینوکس

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

48594c7c0a589733.png

مک

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

این کد را به ترتیب به 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. مطمئن شوید که دستگاه مورد نظر روی تنظیم شده است 9587be1bb375bc0f.png در نوار وضعیت VSCode.
  2. کلیک کنید a19a0c68bc4046e6.png اشکال زدایی را شروع کنید و سپس منتظر بمانید تا برنامه بارگیری شود.
  3. برای شروع بازی، روی هر سلول در هیئت مدیره عامل کلیک کنید.

41d9f87d84c5e755.png

12. مرحله 6: برنامه Flutter را برای پلتفرم وب فعال کنید

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

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

fae7490304e28dfe.png

13. تبریک می گویم

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

بیشتر بدانید