1. قبل از شروع
پیشرفت شگفت انگیز AlphaGo و AlphaStar پتانسیل استفاده از یادگیری ماشینی برای ساخت عوامل بازی در سطح فوق بشری را نشان داد. این یک تمرین سرگرم کننده برای ساخت یک بازی کوچک با قدرت ML است تا مهارت های مورد نیاز برای ایجاد عوامل بازی قدرتمند را بدست آورید.
در این کد لبه، نحوه ساخت یک بازی رومیزی را با استفاده از:
- TensorFlow Agent برای آموزش یک عامل بازی با یادگیری تقویتی
- سرویس TensorFlow برای ارائه مدل
- برای ایجاد یک برنامه بازی رومیزی بین پلتفرمی، فلاتر کنید
پیش نیازها
- دانش اولیه توسعه فلاتر با دارت
- دانش اولیه یادگیری ماشین با TensorFlow، مانند آموزش در مقابل استقرار
- دانش اولیه پایتون، ترمینال ها و داکر
چیزی که یاد خواهید گرفت
- نحوه آموزش یک عامل شخصیت غیر بازیکن (NPC) با استفاده از TensorFlow Agents
- نحوه سرویس دهی به مدل آموزش دیده با استفاده از سرویس TensorFlow
- چگونه یک بازی تخته ای فلاتر چند پلتفرمی بسازیم
آنچه شما نیاز دارید
2. بازی حمله هواپیما
بازیای که در این نرمافزار میسازید، "Plane Strike" نام دارد، یک بازی کوچک 2 نفره که شبیه بازی تخته "Battleship" است. قوانین بسیار ساده هستند:
- بازیکن انسانی در برابر یک عامل NPC که توسط یادگیری ماشینی آموزش دیده بازی می کند. بازیکن انسانی می تواند بازی را با ضربه زدن به هر سلول در هیئت مدیره عامل شروع کند.
- در ابتدای بازی، بازیکن انسانی و عامل هر کدام یک شیء «صفحه» (8 سلول سبز که یک «هواپیما» را تشکیل میدهند، همانطور که در تابلوی بازیکن انسانی در انیمیشن زیر مشاهده میکنید) روی تختههای خود دارند. این "هواپیماها" به طور تصادفی قرار می گیرند و فقط برای صاحبان تخته قابل مشاهده هستند و برای مخالفان خود پنهان می شوند.
- بازیکن انسان و عامل به نوبت به یک سلول از هیئت مدیره یکدیگر ضربه می زنند. بازیکن انسانی می تواند به هر سلولی در تابلوی عامل ضربه بزند، در حالی که عامل به طور خودکار بر اساس پیش بینی یک مدل یادگیری ماشینی انتخاب می کند. سلول مورد نظر قرمز می شود اگر یک سلول "صفحه" ("Hit") باشد. در غیر این صورت زرد می شود ("از دست").
- هر کس ابتدا به 8 گلبول قرمز برسد، برنده بازی است. سپس بازی با تابلوهای تازه شروع می شود.
در اینجا نمونه ای از گیم پلی بازی را مشاهده می کنید:
3. محیط توسعه Flutter خود را تنظیم کنید
برای توسعه Flutter، به دو نرم افزار برای تکمیل این کد لبه نیاز دارید - Flutter SDK و یک ویرایشگر .
شما می توانید کدلب را با استفاده از هر یک از این دستگاه ها اجرا کنید:
- شبیه ساز iOS (نیاز به نصب ابزار Xcode دارد).
- شبیه ساز اندروید (نیاز به نصب در Android Studio دارد).
- یک مرورگر (Chrome برای اشکال زدایی لازم است).
- به عنوان یک برنامه دسکتاپ Windows ، Linux ، یا macOS . شما باید روی پلتفرمی که قصد استقرار در آن را دارید توسعه دهید. بنابراین، اگر می خواهید یک برنامه دسکتاپ ویندوز توسعه دهید، باید در ویندوز توسعه دهید تا به زنجیره ساخت مناسب دسترسی داشته باشید. الزامات خاص سیستم عامل وجود دارد که به طور مفصل در docs.flutter.dev/desktop پوشش داده شده است.
4. راه اندازی شوید
برای دانلود کد این کد لبه:
- به مخزن GitHub برای این Codelab بروید.
- روی Code > Download zip کلیک کنید تا همه کدهای این کد لبه را دانلود کنید.
- فایل فشرده دانلود شده را از حالت فشرده خارج کنید تا یک پوشه
codelabs-main
با تمام منابعی که نیاز دارید باز شود.
برای این کد لبه، شما فقط به فایل های موجود در زیر شاخه tfagents-flutter/
در مخزن نیاز دارید که حاوی چندین پوشه است:
- پوشه های
step0
تاstep6
حاوی کد شروعی هستند که برای هر مرحله در این کد لبه ایجاد می کنید. - پوشه
finished
حاوی کد تکمیل شده برای برنامه نمونه تمام شده است. - هر پوشه حاوی یک زیر پوشه
backbend
است که شامل کد باطن است و یک زیر پوشهfrontend
که شامل کد Flutter frontend است.
5. وابستگی های پروژه را دانلود کنید
Backend
ترمینال خود را باز کنید و به زیر پوشه tfagents-flutter
بروید. موارد زیر را اجرا کنید:
pip install -r requirements.txt
Frontend
- در VS Code، روی File > Open folder کلیک کنید و سپس پوشه
step0
را از کد منبعی که قبلا دانلود کرده اید انتخاب کنید. - فایل
step0/frontend/lib/main.dart
را باز کنید. اگر میبینید که یک گفتگوی VS Code ظاهر میشود که از شما میخواهد بستههای مورد نیاز را برای برنامه شروع دانلود کنید، روی دریافت بستهها کلیک کنید. - اگر این گفتگو را نمی بینید، ترمینال خود را باز کنید و سپس دستور
flutter pub get
در پوشهstep0/frontend
اجرا کنید.
6. مرحله 0: برنامه شروع را اجرا کنید
- فایل
step0/frontend/lib/main.dart
را در VS Code باز کنید، مطمئن شوید که شبیه ساز اندروید یا شبیه ساز iOS به درستی تنظیم شده و در نوار وضعیت ظاهر می شود.
برای مثال، وقتی از Pixel 5 با شبیهساز اندروید استفاده میکنید، این چیزی است که میبینید:
در اینجا چیزی است که هنگام استفاده از iPhone 13 با شبیه ساز iOS مشاهده می کنید:
- کلیک کنید اشکال زدایی را شروع کنید .
برنامه را اجرا و کاوش کنید
این برنامه باید در شبیه ساز اندروید یا شبیه ساز iOS شما راه اندازی شود. رابط کاربری بسیار ساده است. 2 تخته بازی وجود دارد. یک بازیکن انسانی می تواند به عنوان یک موقعیت ضربه به هر سلول در هیئت مدیره عامل در بالای صفحه ضربه بزند. شما یک مامور هوشمند را آموزش می دهید تا به طور خودکار مکان ضربه زدن را بر اساس تخته بازیکن انسانی پیش بینی کند.
در زیر کاپوت، اپلیکیشن Flutter، برد فعلی بازیکن انسانی را به باطن ارسال میکند، که یک مدل یادگیری تقویتی را اجرا میکند و موقعیت سلولی پیشبینیشده را برای ضربه بعدی برمیگرداند. قسمت جلویی پس از دریافت پاسخ، نتیجه را در رابط کاربری نمایش می دهد.
اگر اکنون روی هر سلولی در برد عامل کلیک کنید، هیچ اتفاقی نمیافتد زیرا برنامه هنوز نمیتواند با پشتیبان ارتباط برقرار کند.
7. مرحله 1: یک محیط پایتون TensorFlow Agents ایجاد کنید
هدف اصلی این کد لبه طراحی عاملی است که از طریق تعامل با یک محیط یاد می گیرد. در حالی که بازی Plane Strike نسبتاً ساده است و می توان قوانین دستی را برای عامل NPC ایجاد کرد، شما از یادگیری تقویتی برای آموزش یک عامل استفاده می کنید تا مهارت ها را بیاموزید و بتوانید به راحتی برای بازی های آینده عامل بسازید.
در تنظیم استاندارد یادگیری تقویتی (RL)، عامل در هر مرحله زمانی یک مشاهده دریافت می کند و اقدامی را انتخاب می کند. عمل بر روی محیط اعمال می شود و محیط پاداش و مشاهده جدیدی را برمی گرداند. نماینده سیاستی را آموزش می دهد تا اقداماتی را برای به حداکثر رساندن مجموع پاداش ها انتخاب کند که به عنوان بازگشت نیز شناخته می شود. با چندین بار انجام بازی، عامل قادر به یادگیری الگوها و تقویت مهارت های خود برای تسلط بر بازی است. برای فرمول بندی بازی Plane Strike به عنوان یک مسئله RL، حالت تخته را به عنوان مشاهده، موقعیت ضربه را به عنوان عمل و سیگنال ضربه/مصادف را به عنوان پاداش در نظر بگیرید.
برای آموزش عامل 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
پوشه ای است که شامل گزارش آموزشی است. یک نمونه تمرین به صورت زیر است:
می بینید که با پیشرفت آموزش، میانگین طول اپیزود کاهش می یابد و میانگین بازدهی افزایش می یابد. به طور شهودی میتوانید درک کنید که اگر عامل باهوشتر باشد و پیشبینیهای بهتری انجام دهد، طول بازی کوتاهتر میشود و نماینده پاداشهای بیشتری را جمعآوری میکند. این منطقی است زیرا نماینده می خواهد بازی را در مراحل کمتری به پایان برساند تا تخفیف پاداش سنگین را در مراحل بعدی به حداقل برساند.
پس از اتمام آموزش، مدل آموزش دیده به پوشه 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(() {});
اجراش کن
- کلیک کنید اشکال زدایی را شروع کنید و سپس منتظر بمانید تا برنامه بارگیری شود.
- برای شروع بازی، روی هر سلولی در هیئت مدیره عامل ضربه بزنید.
11. مرحله 5: برنامه Flutter را برای پلتفرم های دسکتاپ فعال کنید
Flutter علاوه بر اندروید و iOS از پلتفرم های دسکتاپ از جمله لینوکس، مک و ویندوز نیز پشتیبانی می کند.
لینوکس
- مطمئن شوید که دستگاه مورد نظر روی تنظیم شده است در نوار وضعیت VSCode.
- کلیک کنید اشکال زدایی را شروع کنید و سپس منتظر بمانید تا برنامه بارگیری شود.
- برای شروع بازی، روی هر سلول در هیئت مدیره عامل کلیک کنید.
مک
- برای مک، باید حقوق مناسب را تنظیم کنید زیرا برنامه درخواستهای HTTP را به باطن ارسال میکند. لطفاً برای جزئیات بیشتر به حقوق و جعبه ایمنی برنامه مراجعه کنید.
این کد را به ترتیب به step4/frontend/macOS/Runner/DebugProfile.entitlements
و step4/frontend/macOS/Runner/Release.entitlements
اضافه کنید:
<key>com.apple.security.network.client</key>
<true/>
- مطمئن شوید که دستگاه مورد نظر روی تنظیم شده است در نوار وضعیت VSCode.
- کلیک کنید اشکال زدایی را شروع کنید و سپس منتظر بمانید تا برنامه بارگیری شود.
- برای شروع بازی، روی هر سلول در هیئت مدیره عامل کلیک کنید.
ویندوز
- مطمئن شوید که دستگاه مورد نظر روی تنظیم شده است در نوار وضعیت VSCode.
- کلیک کنید اشکال زدایی را شروع کنید و سپس منتظر بمانید تا برنامه بارگیری شود.
- برای شروع بازی، روی هر سلول در هیئت مدیره عامل کلیک کنید.
12. مرحله 6: برنامه Flutter را برای پلتفرم وب فعال کنید
یکی دیگر از کارهایی که می توانید انجام دهید این است که پشتیبانی وب را به برنامه Flutter اضافه کنید. بهطور پیشفرض، پلتفرم وب بهطور خودکار برای برنامههای Flutter فعال است، بنابراین تنها کاری که باید انجام دهید این است که آن را راهاندازی کنید.
- مطمئن شوید که دستگاه مورد نظر روی تنظیم شده است در نوار وضعیت VSCode.
- کلیک کنید اشکال زدایی را شروع کنید و سپس منتظر بمانید تا برنامه در مرورگر کروم بارگیری شود.
- برای شروع بازی، روی هر سلول در هیئت مدیره عامل کلیک کنید.
13. تبریک می گویم
شما یک برنامه بازی تخته ای با یک عامل ML ساخته اید تا در برابر بازیکن انسانی بازی کنید!