TensorFlow Agents ve Flutter ile masa oyunu geliştirme

1. Başlamadan önce

AlphaGo ve AlphaStar'ın inanılmaz gelişmeleri, insanüstü seviyede oyun aracıları oluşturmak için makine öğrenimini kullanmanın potansiyelini ortaya koydu. Güçlü oyun aracıları oluşturmak için gereken becerileri edinmek amacıyla, makine öğrenimi destekli küçük bir oyun geliştirmek eğlenceli bir alıştırmadır.

Bu codelab'de, aşağıdakileri kullanarak masa oyunu geliştirmeyi öğreneceksiniz:

  • Pekiştirmeli öğrenme ile bir oyun aracısını eğitmek için TensorFlow Aracısı
  • Modeli sunmak için TensorFlow Sunumu
  • Platformlar arası masa oyunu uygulaması oluşturmak için Flutter

Ön koşullar

  • Dart ile Flutter geliştirmeyle ilgili temel bilgiler
  • TensorFlow ile eğitim ve dağıtım gibi temel makine öğrenimi bilgileri
  • Python, terminaller ve Docker hakkında temel bilgiler

Neler öğreneceksiniz?

  • TensorFlow Aracılarını kullanarak Oyuncu Olmayan Karakter (NPC) aracısını eğitme
  • Eğitilen modeli TensorFlow Sunumu kullanarak sunma
  • Platformlar arası Flutter masa oyunu geliştirme

Gerekenler

2. Uçak Vuruşu Oyunu

Bu codelab'de geliştirdiğiniz oyunun adı "Plane Strike". Bu oyun, "Battleship" masa oyununa benzeyen 2 oyunculu küçük bir masa oyunu. Kurallar çok basittir:

  • İnsan oyuncu, makine öğrenimi tarafından eğitilmiş bir NPC aracısına karşı oynar. İnsan oyuncu, temsilcinin panosundaki herhangi bir hücreye dokunarak oyunu başlatabilir.
  • Oyunun başında insan oyuncunun ve temsilcinin birer "uçak" vardır nesne (aşağıdaki animasyonda insan oyuncunun panosunda görebileceğiniz gibi bir "uçağı" oluşturan 8 yeşil hücre) kendi tahtalarında; bu "uçaklar" rastgele yerleştirilir ve yalnızca oyun tahtasının sahipleri tarafından görülebilir ve rakiplerine gizlenir.
  • İnsan oyuncu ve ajan sırayla birbirlerinin oyun tahtasında bir hücreye vurur. Gerçek oyuncu, temsilci panosundaki herhangi bir hücreye dokunabilir. Aracı ise bir makine öğrenimi modelinin tahminine göre otomatik olarak seçim yapar. Denenen hücre "uçak" ise kırmızı renge döner hücre (‘hit'); Aksi takdirde rengi sarıya döner ("eksik").
  • Oyunu ilk olarak 8 kırmızı hücreye ulaşan kişi kazanır; Oyun yeni masalarla yeniden başlatılır.

Oyunun oynanabilirlik örneğini aşağıda bulabilirsiniz:

77cead530c5a4aff.gif

3. Flutter geliştirme ortamınızı kurma

Flutter ile geliştirme yaparken bu codelab'i tamamlamak için iki parça yazılıma ihtiyacınız vardır: Flutter SDK'sı ve düzenleyici.

Codelab'i aşağıdaki cihazlardan birini kullanarak çalıştırabilirsiniz:

  • iOS simülatörü (Xcode araçlarının yüklenmesini gerektirir).
  • Android Emülatör (Android Studio'da kurulum gerektirir).
  • Tarayıcı (hata ayıklama için Chrome gereklidir).
  • Windows, Linux veya macOS masaüstü uygulaması olarak Uygulamayı dağıtmayı planladığınız platformda gerçekleştirmeniz gerekir. Bu nedenle, bir Windows masaüstü uygulaması geliştirmek istiyorsanız uygun derleme zincirine erişmek için Windows'da geliştirme yapmanız gerekir. İşletim sistemine özgü gereksinimler docs.flutter.dev/desktop sayfasında ayrıntılı olarak açıklanmıştır.

4. Hazırlanın

Bu codelab'in kodunu indirmek için:

  1. Bu codelab için GitHub deposuna gidin.
  2. Kod > ZIP dosyasını indir seçeneğini tıklayın.

2cd45599f51fb8a2.png

  1. İhtiyacınız olan tüm kaynakların yer aldığı bir codelabs-main kök klasörünü açmak için, indirilen zip dosyasını açın.

Bu codelab için yalnızca deponun birden fazla klasör içeren tfagents-flutter/ alt dizininde bulunan dosyalara ihtiyacınız vardır:

  • step0-step6 klasörleri, bu codelab'deki her adımda temel aldığınız başlangıç kodunu içerir.
  • finished klasörü, tamamlanmış örnek uygulama için tamamlanmış kodu içerir.
  • Her klasörde, arka uç kodunu içeren bir backbend alt klasörü ve Flutter ön uç kodunu içeren bir frontend alt klasörü bulunur

5. Proje için bağımlılıkları indirme

Arka uç

Terminalinizi açıp tfagents-flutter alt klasörüne gidin. Aşağıdaki komutu çalıştırın:

pip install -r requirements.txt

Ön uç

  1. VS Code'da File > (Dosya >) seçeneğini tıklayın. Klasörü aç seçeneğini tıklayın ve daha önce indirdiğiniz kaynak kodundan step0 klasörünü seçin.
  2. step0/frontend/lib/main.dart dosyasını aç. Başlangıç uygulaması için gerekli paketleri indirmenizi isteyen bir VS Kodu iletişim kutusu görürseniz Paketleri al'ı tıklayın.
  3. Bu iletişim kutusunu görmüyorsanız terminalinizi açın ve step0/frontend klasöründe flutter pub get komutunu çalıştırın.

7ada07c300f166a6.png

6. 0. Adım: Başlangıç uygulamasını çalıştırın

  1. step0/frontend/lib/main.dart dosyasını VS Code'da açın, Android Emülatör veya iOS Simülatörü'nün düzgün şekilde ayarlandığından ve durum çubuğunda göründüğünden emin olun.

Örneğin, Pixel 5'i Android Emülatör ile kullandığınızda şunları görürsünüz:

9767649231898791.png

iPhone 13'ü iOS Simülatörü ile kullandığınızda aşağıdakileri görürsünüz:

95529e3a682268b2.png

  1. a19a0c68bc4046e6.png Hata ayıklamayı başlat'ı tıklayın.

Uygulamayı çalıştırma ve keşfetme

Uygulama, Android Emülatörünüzde veya iOS Simülatörünüzde başlatılmalıdır. Kullanıcı arayüzü oldukça basit. 2 oyun tahtası vardır; gerçek bir oyuncu, ajanda panosundaki herhangi bir hücreye vuruş pozisyonu olarak dokunabilir. Akıllı bir temsilciyi, gerçek oyuncunun panosuna göre nereye vuracağını otomatik olarak tahmin edecek şekilde eğiteceksiniz.

Flutter uygulaması, temelde insan oyuncunun mevcut panosunu arka uca gönderir. Bu kart, pekiştirmeli bir öğrenme modeli çalıştırır ve sıradaki vuruş için tahmini bir hücre konumu döndürür. Ön uç, yanıtı aldıktan sonra sonucu kullanıcı arayüzünde görüntüler.

734ab3d48a1133e1.png 15cba2e741149c95.png

Şu anda aracısının panosundaki herhangi bir hücreyi tıklarsanız uygulama henüz arka uçla iletişim kuramadığından hiçbir şey olmaz.

7. 1. Adım: TensorFlow Aracıları Python ortamı oluşturun

Bu codelab'in temel amacı, ortamla etkileşime geçerek öğrenen bir aracı tasarlamaktır. Plane Strike oyunu görece basit olsa da NPC ajanı için kendi kurallarınızı oluşturmak mümkün olsa da bir ajanı eğitmek için pekiştirmeli öğrenmeyi kullanıyorsunuz. Bu sayede becerileri öğreniyor ve gelecekte diğer oyunlar için kolayca temsilciler oluşturabiliyorsunuz.

Standart Pekiştirmeli Öğrenme (RL) ayarında aracı her adımda bir gözlem alır ve bir işlem seçer. İşlem ortama uygulanır ve ortam bir ödül ve yeni bir gözlem döndürür. Temsilci, iade olarak da bilinen ödüllerin toplamını en üst düzeye çıkarmak için bir politikayı eğitir. Temsilci, oyunu birçok kez oynayarak oyunun kalıplarını öğrenerek oyunda ustalaşmak için becerilerini geliştirebiliyor. Uçak Vuruşu oyununu RL problemi olarak formüle etmek için oyun tahtası durumunu gözlem, vuruş pozisyonunu aksiyon ve isabet/kaçırma sinyali olarak düşünebilirsiniz.

bc5da07bc45062f4.png

NPC aracısını eğitmek için TensorFlow için güvenilir, ölçeklenebilir ve kullanımı kolay bir pekiştirmeli öğrenme kitaplığı olan TensorFlow Aracıları'ndan yararlanacaksınız.

TF Agents, başlamanıza yardımcı olacak kapsamlı bir kod laboratuvarı seti, örnekler ve kapsamlı belgeler sunduğundan pekiştirmeli öğrenme için mükemmel bir çözümdür. Ölçeklenebilirlikle ilgili gerçekçi ve karmaşık RL problemlerini çözmek ve hızlıca yeni RL algoritmaları geliştirmek için TF Aracılarını kullanabilirsiniz. Deneme yapmak için farklı aracılar ve algoritmalar arasında kolayca geçiş yapabilirsiniz. Ayrıca iyi test edilmiş olup yapılandırması kolaydır.

OpenAI Gym'de uygulanmış birçok önceden oluşturulmuş oyun ortamı vardır (ör. Atari games), Mujuco vb. bulunur. Ancak Plane Strike oyunu eksiksiz bir özel oyun olduğundan önce sıfırdan yeni bir ortam oluşturmanız gerekiyor.

TF Aracıları Python ortamını uygulamak için aşağıdaki yöntemleri uygulamanız gerekir:

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."""

En önemlisi, bir işlem yapıp yeni bir time_step nesnesi döndüren _step() işlevidir. Plane Strike oyununda bir oyun tahtanız vardır; yeni bir vuruş pozisyonu geldiğinde oyun tahtasının durumuna bağlı olarak ortam şu sonucu belirler:

  • Oyun tahtası bir sonraki adımda nasıl olmalı (gizli uçağın konumuna göre hücrenin rengini kırmızıya mı yoksa sarıya mı değiştirmeli?)
  • Oyuncu bu pozisyon için hangi ödülü almalı (ödül isabeti verme veya penaltıyı kaçırma?)
  • Maç sonlandırılmalı mı (kazanan var mı?)
  • _planestrike_py_environment.py dosyasındaki _step() işlevine şu kodu ekleyin:
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. Adım: Oyun aracısını TensorFlow Agents ile eğitin

TF Agents ortamı hazır olduğunda oyun aracısını eğitebilirsiniz. Bu codelab için REINFORCE aracısı kullanırsınız. REINFORCE, RL'deki bir politika gradyanı algoritmasıdır. Temel amacı, politika ağının gelecekteki oyunlarda getiriyi en üst düzeye çıkarabilmesi için politika nöral ağ parametrelerini oyun sırasında toplanan ödül sinyallerine göre düzenlemektir.

  • İlk olarak eğitim ve değerlendirme ortamlarını örneklendirmeniz gerekir. Bu kodu step2/backend/training.py dosyasındaki train_agent() işlevine ekleyin:
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)
  • Daha sonra, eğitilecek bir pekiştirmeli öğrenme aracısı oluşturmanız gerekir. Bu codelab'de, politika tabanlı bir aracı olan REINFORCE aracısını kullanacaksınız. Bu kodu yukarıdaki kodun hemen altına ekleyin:
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,
)
  • Son olarak, temsilciyi eğitim döngüsüyle eğitin. Döngüde önce oyunun birkaç bölümünü bir tamponda toplarsınız ve daha sonra temsilciyi arabellekteki verilerle eğitirsiniz. Bu kodu step2/backend/training.py dosyasındaki train_agent() işlevine ekleyin:
# 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()
  • Artık eğitime başlayabilirsiniz. Terminalinizde, bilgisayarınızdaki step2/backend klasörüne gidip şu komutu çalıştırın:
python training.py

Donanım yapılandırmalarınıza bağlı olarak eğitimin tamamlanması 8-12 saat sürer (step3 içinde önceden eğitilmiş bir model sağlandığı için tüm eğitimi kendiniz tamamlamanız gerekmez). Bu sırada ilerlemeyi TensorBoard ile izleyebilirsiniz. Yeni bir terminal açın, bilgisayarınızda step2/backend klasörüne gidin ve şu komutu çalıştırın:

tensorboard --logdir tf_agents_log/

tf_agents_log, eğitim günlüğünü içeren klasördür. Örnek bir eğitim çalıştırması aşağıdaki gibidir:

33e12e2b387c063a.png 8488632ccf43348a.png

Eğitim ilerledikçe ortalama bölüm uzunluğunun küçüldüğünü ve ortalama geri dönüşün arttığını görebilirsiniz. Sezgisel olarak, temsilci daha akıllı olup daha iyi tahminlerde bulunursa oyunun süresinin kısalacağını ve temsilcinin daha fazla ödül toplayacağını anlayabilirsiniz. Temsilci, sonraki adımlarda ağır ödül indirimlerini en aza indirmek için oyunu daha az adımda bitirmek istediğinden bu normaldir.

Eğitim tamamlandıktan sonra, eğitilen model policy_model klasörüne aktarılır.

9. 3. Adım: Eğitilen modeli TensorFlow Sunumu ile dağıtın

Oyun aracısını eğittiğinize göre artık TensorFlow Sunum ile dağıtabilirsiniz.

  • Terminalinizde, bilgisayarınızdaki step3/backend klasörüne gidin ve Docker ile TensorFlow Sunumu'nu başlatın:
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 önce TensorFlow Sunum görüntüsünü otomatik olarak indirir. Bu işlem bir dakika sürer. Ardından, TensorFlow Sunumu başlar. Günlük, şu kod snippet'i gibi görünmelidir:

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 ...

Beklendiği gibi çalıştığından emin olmak için uç noktaya örnek bir istek gönderebilirsiniz:

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

Uç nokta, panonun ortasında (5, 5) olacak şekilde 45 tahmin edilen bir konum döndürür (merak edenler için tahtanın merkezinin neden ilk vuruş konumu için iyi bir tahmin olduğunu anlamaya çalışabilirsiniz).

{
    "predictions": [45]
}

İşte bu kadar. NPC aracısı için bir sonraki ihtar konumunu tahmin etmek üzere başarıyla bir arka uç oluşturdunuz.

10. 4. adım: Android ve iOS için Flutter uygulamasını oluşturun

Arka uç hazır. Flutter uygulamasından ihtar konumu tahminleri almak için bu araca istek göndermeye başlayabilirsiniz.

  • Öncelikle, gönderilecek girişleri sarmalayan bir sınıf tanımlamanız gerekir. step4/frontend/lib/game_agent.dart dosyasına bu kodu ekleyin:
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;
  }
}

Artık tahminde bulunmak için isteği TensorFlow Serve'e gönderebilirsiniz.

  • Bu kodu step4/frontend/lib/game_agent.dart dosyasındaki predict() işlevine ekleyin:
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');
}

Uygulama arka uçtan yanıt aldıktan sonra, oyun kullanıcı arayüzünü oyundaki ilerleme durumunu yansıtacak şekilde güncellersiniz.

  • Bu kodu step4/frontend/lib/main.dart dosyasındaki _gridItemTapped() işlevine ekleyin:
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(() {});

Çalıştır

  1. a19a0c68bc4046e6.png Hata ayıklamayı başlat'ı tıklayın, ardından uygulamanın yüklenmesini bekleyin.
  2. Oyunu başlatmak için temsilcinin panosundaki herhangi bir hücreye dokunun.

852942d0de299c1f.png 6ae3601470c8e33a.png

11. 5. Adım: Flutter uygulamasını masaüstü platformlar için etkinleştirin

Flutter, Android ve iOS'in yanı sıra Linux, Mac ve Windows gibi masaüstü platformlarını da destekler.

Linux

  1. VSCode'un durum çubuğunda hedef cihazın 86cba523de82b4f9.png olarak ayarlandığından emin olun.
  2. a19a0c68bc4046e6.png Hata ayıklamayı başlat'ı tıklayın, ardından uygulamanın yüklenmesini bekleyin.
  3. Oyunu başlatmak için temsilcinin panosundaki herhangi bir hücreyi tıklayın.

48594c7c0a589733.png

Mac

  1. Uygulama, HTTP isteklerini arka uca göndereceğinden Mac için uygun yararlanma haklarını ayarlamanız gerekir. Daha fazla bilgi için lütfen Yararlanma Hakları ve Uygulama Korumalı Alanı'nı inceleyin.

Bu kodu sırasıyla step4/frontend/macOS/Runner/DebugProfile.entitlements ve step4/frontend/macOS/Runner/Release.entitlements için ekleyin:

<key>com.apple.security.network.client</key>
<true/>
  1. VSCode'un durum çubuğunda hedef cihazın eb4b0b5563824138.png olarak ayarlandığından emin olun.
  2. a19a0c68bc4046e6.png Hata ayıklamayı başlat'ı tıklayın, ardından uygulamanın yüklenmesini bekleyin.
  3. Oyunu başlatmak için temsilcinin panosundaki herhangi bir hücreyi tıklayın.

55a5de3674194e89.png

Windows

  1. VSCode'un durum çubuğunda hedef cihazın 9587be1bb375bc0f.png olarak ayarlandığından emin olun.
  2. a19a0c68bc4046e6.png Hata ayıklamayı başlat'ı tıklayın, ardından uygulamanın yüklenmesini bekleyin.
  3. Oyunu başlatmak için temsilcinin panosundaki herhangi bir hücreyi tıklayın.

41d9f87d84c5e755.png

12. 6. Adım: Web platformu için Flutter uygulamasını etkinleştirin

Yapabileceğiniz bir diğer şey de Flutter uygulamasına web desteği eklemektir. Web platformu varsayılan olarak Flutter uygulamaları için otomatik olarak etkinleştirilir. Dolayısıyla tüm yapmanız gereken bu uygulamayı başlatmaktır.

  1. VSCode'un durum çubuğunda hedef cihazın 71db93efa928d15d.png olarak ayarlandığından emin olun.
  2. a19a0c68bc4046e6.png Hata ayıklamayı başlat'ı tıklayın ve ardından uygulamanın Chrome tarayıcıya yüklenmesini bekleyin.
  3. Oyunu başlatmak için temsilcinin panosundaki herhangi bir hücreyi tıklayın.

fae7490304e28dfe.png

13. Tebrikler

İnsan oyuncuya karşı oynamak için makine öğrenimi destekli bir aracı kullanarak bir masa oyunu uygulaması geliştirdiniz.

Daha fazla bilgi