GOWOG
GOWOG
试玩游戏
在 Agent 上的 AI 实验
PythonAI agentneuroevolution
本地 Docker 运行
run_local.sh
#!/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
./run_local.sh
本地开发
GolangNode.JSPhaser
服务器
为少调整过的项目:Kirk-Wang/gowog
go 1.14
本地启动:
go run cmd/server/*
8080
客户端
npm install
npm run dev -- --env.HOST_IP=localhost:8080 # HOST_IP -> 服务器地址
注意
30008080
productiondockerClient8080docker
通讯约定
protobufprotocprotobuf
server/message.proto
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
SpriteshootManagershoot managerbullet
游戏后端设计方案
Components(组件)
5
ClientHubObjManagerGame Master
Architecture(架构图)
channel
Client 与 Server 交互设计方案
Player connect(玩家连接)
Player Disconnect(玩家断开连接)
Client input(客户端输入)
Profile
ProfileGolangslow components--cpuprofile--memprofile
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
AI 训练设计方案
openAI GymCS2DNeuroEvolution(神经进化)
运行
gowog
./run_local.sh
virtualenvpython3
requirements.txt
运行训练脚本
python train_ga.py -n save_file_name
save_fie_nameweightsweights
Genetic Algorithm(遗传算法)
_cs2denv_ga.py 的实现_
CS2D AgentCS2DopenAI gymagentreset()step()observation_spaceaction_space
ObservationSpaceupdate_player
玩家位置玩家大小尺寸列数行数块宽度块高度块01201
1 / distance(目标的距离)agent1001
NeuroEvolution(神经进化)
_train_ga.py 的实现_
Neural Network
NeuroEvolutionNN(神经网络)NNMutate
一个特别的改进是,我们只存储应用于神经网络的噪声种子列表,而不是存储所有的代权值。因为在同一个种子下,所有的随机化都是相同的,所以一个种子可以代表一个网络的突变算子。我们不需要保留每一代的所有权值,我们只需要存储一组从开始到当前一代的种子,然后从这组种子中重新构造权值来得到所有神经网络的权值。
Maxim Lapan"Deep Reinforcement Learning Hands-On"