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
- Flutter SDK'sı
- Flutter için Android ve iOS kurulumu
- Flutter için masaüstü kurulumu
- Flutter için web kurulumu
- Flutter ve Dart için Visual Studio Code (VS Code) kurulumu
- Docker
- Durma
- Python 3.7+
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:
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:
- Bu codelab için GitHub deposuna gidin.
- Kod > ZIP dosyasını indir seçeneğini tıklayın.
- İ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 birfrontend
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ç
- 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. 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.- Bu iletişim kutusunu görmüyorsanız terminalinizi açın ve
step0/frontend
klasöründeflutter pub get
komutunu çalıştırın.
6. 0. Adım: Başlangıç uygulamasını çalıştırın
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:
iPhone 13'ü iOS Simülatörü ile kullandığınızda aşağıdakileri görürsünüz:
- 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.
Ş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.
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ındakitrain_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ındakitrain_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:
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ındakipredict()
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
- Hata ayıklamayı başlat'ı tıklayın, ardından uygulamanın yüklenmesini bekleyin.
- Oyunu başlatmak için temsilcinin panosundaki herhangi bir hücreye dokunun.
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
- VSCode'un durum çubuğunda hedef cihazın olarak ayarlandığından emin olun.
- Hata ayıklamayı başlat'ı tıklayın, ardından uygulamanın yüklenmesini bekleyin.
- Oyunu başlatmak için temsilcinin panosundaki herhangi bir hücreyi tıklayın.
Mac
- 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/>
- VSCode'un durum çubuğunda hedef cihazın olarak ayarlandığından emin olun.
- Hata ayıklamayı başlat'ı tıklayın, ardından uygulamanın yüklenmesini bekleyin.
- Oyunu başlatmak için temsilcinin panosundaki herhangi bir hücreyi tıklayın.
Windows
- VSCode'un durum çubuğunda hedef cihazın olarak ayarlandığından emin olun.
- Hata ayıklamayı başlat'ı tıklayın, ardından uygulamanın yüklenmesini bekleyin.
- Oyunu başlatmak için temsilcinin panosundaki herhangi bir hücreyi tıklayın.
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.
- VSCode'un durum çubuğunda hedef cihazın olarak ayarlandığından emin olun.
- Hata ayıklamayı başlat'ı tıklayın ve ardından uygulamanın Chrome tarayıcıya yüklenmesini bekleyin.
- Oyunu başlatmak için temsilcinin panosundaki herhangi bir hücreyi tıklayın.
13. Tebrikler
İnsan oyuncuya karşı oynamak için makine öğrenimi destekli bir aracı kullanarak bir masa oyunu uygulaması geliştirdiniz.