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"