ミニマルなマルチプレイヤー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 の実装_
ニューラルネットワークを通じて最適な行動を取得します。 進化的アルゴリズムを使用して、世代ごとに新しい重みセットを生成します。