GolangとNeuroEvolutionを用いたマルチプレイヤーゲーム開発入門

ミニマルなマルチプレイヤーWebゲーム GOWOG は、Golangで作成されています。

デモプレイ

デモページ

AIエージェントの実験

サーバー、クライアント、メッセージが分離されているため、バックエンドとの通信が容易です。 このプロジェクトでは、Pythonで書かれたAIエージェントを使用して環境との相互作用を学習します。 この実験では、迷宮内での最短経路を見つけるためにニューロ進化(NeuroEvolution)を利用しています。

ローカルでのDocker実行

run_local.sh

#!/bin/bash
docker build . --build-arg HOSTNAME=localhost:8080 -t gowog_local || exit
docker stop gowog_container
docker rm gowog_container
docker run --privileged -d --name gowog_container -p 8080:8080 gowog_local server -prod client/build/

Mac上で実行するには:

./run_local.sh

ブラウザで http://localhost:8080 を開く

ローカル開発

ゲームはサーバーとクライアントの二部分に分かれています。サーバーはGolang、クライアントはNode.jsとPhaserゲームエンジンを使用しています。

サーバー

私の環境ではGoバージョン1.14を使用しています。

ローカル起動方法:

go run cmd/server/main.go

サーバーはポート8080で待ち受けます。

クライアント

npm install
npm run start -- --env.HOST_IP=localhost:8080 # HOST_IP -> サーバーアドレス

ブラウザで http://localhost:3000 を開く

注意点

開発中、クライアントはポート3000、サーバーはポート8080で動作します。 プロダクションおよびDocker環境では、クライアントが構築され、Golangサーバーが同じポート8080でクライアントページを返します。

通信プロトコル

サーバーとクライアント間の通信はprotobufに基づいています。protobufの生成にはprotocをインストールしてください。

変更があるたびに以下のコマンドを実行:

cd server
./generate_proto.sh

ゲームフロントエンド設計

フロントエンドプロジェクトは以下に基づいています:

ゲームバックエンド設計

主な5つのエンティティがあります。各エンティティの状態はプライベートです。

エンティティ プライベート状態
Client websocket.Connection
Hub Clientリスト
ObjManager Player, Shootなど
GameMaster ObjManagerとHub

AI訓練設計

このリポジトリには、CS2D環境とトレーニングスクリプトが含まれています。 トレーニングスクリプトはNeuroEvolutionを使用して迷宮内で最短経路を見つけます。

実行手順

python train_agent.py -n weights_file_name

遺伝的アルゴリズム

_cs2d_env_ga.py の実装_

CS2DエージェントはopenAI Gym形式に従い、基本メソッドをサポートします。

観測空間は一元配列で、プレイヤー位置やブロックサイズなどの情報を含みます。

報酬は目標までの距離に反比例し、エージェントが近づくほど高くなります。

ニューロ進化

_train_agent.py の実装_

ニューラルネットワークを通じて最適な行動を取得します。 進化的アルゴリズムを使用して、世代ごとに新しい重みセットを生成します。

タグ: golang NeuroEvolution Docker Node.js Phaser

6月23日 17:53 投稿