GOWOG
:javascript
GOWOG
是一款迷你的,使用 Golang 編寫的多人 Web 遊戲。html
Demo:http://game.giongto35.com前端
因爲服務器,客戶端和消息是分離的,所以很容易與後端進行通訊。
此項目是用 Python
編寫的 AI agent
,能夠學習與環境的交互。
這個實驗是利用 neuroevolution
(神經進化)在迷宮中尋找一條路徑。java
油管 Demo:https://www.youtube.com/watch?v=pWbb1m91mhUpython
run_local.sh
webpack
#!/bin/bash docker build . --build-arg HOSTNAME=localhost:8080 -t gowog_local|| exit docker stop gowog docker rm gowog docker run --privileged -d --name gowog -p 8080:8080 gowog_local server -prod client/build/
執行,我本地是 Mac
:git
./run_local.sh
打開 http://www.javashuo.com/tag/http://localhost:8080es6
遊戲包含兩部分:服務器和客戶端。服務器使用 Golang
,客戶端使用 Node.JS
和 Phaser
遊戲引擎。github
爲少調整過的項目:Kirk-Wang/gowoggolang
個人本地環境是 go 1.14
。
本地啓動:
go run cmd/server/*
服務器將監聽 8080
。
npm install npm run dev -- --env.HOST_IP=localhost:8080 # HOST_IP -> 服務器地址
在開發過程當中,客戶端在端口 3000
上運行,服務器端在端口 8080
上運行。
在 production
和 docker
環境中,已構建 Client
,golang 服務器將在同一端口 8080
上返回客戶端頁面。所以,若是咱們運行 docker
環境,則遊戲將在瀏覽器中的 http://www.javashuo.com/tag/http://localhost:8080 運行。
服務器和客戶端之間的通訊包基於 protobuf
。 安裝 protoc
以生成 protobuf
。
每次你在 server/message.proto
中有更改(package singature)時。請運行:
cd server ./generate.sh
這個前端項目是基於:
├── client │ ├── index.html │ ├── src │ │ ├── config.js: javascript config │ │ ├── index.html │ │ ├── main.js │ │ ├── sprites │ │ │ ├── Leaderboard.js: Leaderboard object │ │ │ ├── Map.js: Map object │ │ │ ├── Player.js: Player object │ │ │ └── Shoot.js: Shoot object │ │ ├── states │ │ │ ├── Boot.js Boot screen │ │ │ ├── const.js │ │ │ ├── Game.js: Game master │ │ │ ├── message_pb.js: Protobuf Message │ │ │ ├── Splash.js │ │ │ └── utils.js │ │ └── utils.js
每一個對象都是從 Sprite
繼承的類。
玩家包含 shootManager
,每次射擊時,shoot manager
都會生成新的 bullet
。
遊戲中主要有 5
個實體。他們的狀態是私有的
實體 | 私有狀態 | |
---|---|---|
Client |
websocket.Conn | client hold 住 websocket 鏈接 |
Hub |
Client | Hub 處理全部通信, 包含全部 client 列表 |
ObjManager |
Player, Shoot, ... | ObjManager 包含全部 Player 和 Shoot,處理遊戲邏輯 |
Game Master |
ObjManager, Hub | Master object 由 ObjManager 和 Hub 組成 |
不一樣的實體經過包裝在函數中的 channel
彼此調用。
Player connect(玩家鏈接)
Player Disconnect(玩家斷開鏈接)
Client input(客戶端輸入)
Profile
是研究 Golang
性能並找出 slow components
的方法。運行服務器時,可使用標誌 --cpuprofile
和--memprofile
來配置 server。
cd server go run cmd/server/* --cpuprofile --memprofile
├── server │ ├── cmd │ │ └── server │ │ └── server.go: Entrypoint running server │ ├── game │ │ ├── common │ │ ├── config │ │ │ └── 1.map: Map represented 0 and 1 │ │ ├── gameconst │ │ ├── game.go: Game master objects, containing logic and communication │ │ ├── mappkg │ │ ├── objmanager │ │ ├── playerpkg │ │ ├── shape │ │ ├── shootpkg │ │ ├── types.go │ │ └── ws │ │ ├── wsclient.go │ │ └── wshub.go │ ├── generate.sh: Generate protobuf for server + client + AI environment │ ├── message.proto │ └── Message_proto │ └── message.pb.go ├── Dockerfile └── run_local.sh
此倉庫包含遵循 openAI Gym
格式和訓練腳本的 CS2D
環境。
訓練腳本使用 NeuroEvolution(神經進化)
在迷宮中找到到達目的地的最短路徑。
https://www.youtube.com/watch?v=pWbb1m91mhU
按照的說明運行 gowog
環境。即本地 Docker 運行:
./run_local.sh
使用 virtualenv
設置 python3
虛擬環境(直接用 Docker 吧~)。
requirements.txt
所包含的庫。運行訓練腳本
python train_ga.py -n save_file_name
save_fie_name
是保存權重(weights
)的地方。
在下一次,若是咱們指定了一個現有的文件,它將繼續從該文件的最後一次運行中的權重(weights
)進行訓練。
_cs2denv_ga.py 的實現_
基於機器學習的目的,CS2D Agent
是在 CS2D
上構建的。
它遵循 openAI gym
,支持 agent
的基本方法,包括:reset()
、step()
、observation_space
和action_space
。
ObservationSpace
是一個一維數組,它由來自服務器的 update_player
消息構造而成
玩家位置
), player size(玩家大小尺寸
), number of columns(列數
), number of rows(行數
), block width(塊寬度
), block height(塊高度
)塊
)的距離。此輸入是爲了不碰撞0
和 1
的 2
維數組(0
爲空,1
爲塊)獎勵是 1 / distance(目標的距離)
。若是 agent
接近目標 100
點,那麼獎勵就是 1
,情節結束。
_train_ga.py 的實現_
神經網絡(Neural Network
)經過使輸入(觀察空間)經過神經網絡來得到最佳動做。
NeuroEvolution
(神經進化)是使用進化算法不斷改進人工神經網絡的AI。對於每次迭代(生成),程序將基於前一次迭代中的最佳設置生成一組新的神經網絡權重。 由先前的 NN(神經網絡)
生成一個 NN
的過程叫作 Mutate
,它給神經網絡中的每一個參數添加隨機噪聲。
一個特別的改進是,咱們只存儲應用於神經網絡的噪聲種子列表,而不是存儲全部的代權值。由於在同一個種子下,全部的隨機化都是相同的,因此一個種子能夠表明一個網絡的突變算子。咱們不須要保留每一代的全部權值,咱們只須要存儲一組從開始到當前一代的種子,而後從這組種子中從新構造權值來獲得全部神經網絡的權值。
代碼是基於 Maxim Lapan
的 "Deep Reinforcement Learning Hands-On"
我是爲少。 微信:uuhells123。 公衆號:黑客下午茶。 謝謝點贊支持👍👍👍!