试玩 GOWOG ,初探 OpenAI(使用 NeuroEvolution 神经进化)与 Golang 多人在线游戏开发

GOWOG:
GOWOG 是一款迷你的,使用 Golang 编写的多人 Web 游戏。
试玩游戏
Demo:http://game.giongto35.com
在 Agent 上的 AI 实验
由于服务器,客户端和消息是分离的,因此很容易与后端进行通信。
此项目是用 Python 编写的 AI agent,可以学习与环境的交互。
这个实验是利用 neuroevolution (神经进化)在迷宫中寻找一条路径。
油管 Demo:https://www.youtube.com/watch?v=pWbb1m91mhU
本地 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
本地开发
游戏包含两部分:服务器和客户端。服务器使用 Golang,客户端使用 Node.JS 和 Phaser 游戏引擎。
服务器
为少调整过的项目:Kirk-Wang/gowog
我的本地环境是 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://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。
游戏后端设计方案
Components(组件)
游戏中主要有 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 组成 |
Architecture(架构图)

不同的实体通过包装在函数中的 channel 彼此调用。
Client 与 Server 交互设计方案
Player connect(玩家连接)

Player Disconnect(玩家断开连接)

Client input(客户端输入)

Profile
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
AI 训练设计方案
此仓库包含遵循 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)进行训练。
Genetic Algorithm(遗传算法)
_cs2denv_ga.py 的实现_
基于机器学习的目的,CS2D Agent 是在 CS2D 上构建的。
它遵循 openAI gym,支持 agent 的基本方法,包括:reset()、step()、observation_space 和action_space。
ObservationSpace 是一个一维数组,它由来自服务器的 update_player 消息构造而成
- Player position(
玩家位置), player size(玩家大小尺寸), number of columns(列数), number of rows(行数), block width(块宽度), block height(块高度) - 到左,右,上,下到最近 block(
块)的距离。此输入是为了避免碰撞 - 玩家在二进制块地图(binary block map)中的位置。地图是
0和1的2维数组(0为空,1为块) - binary block map
奖励是 1 / distance(目标的距离)。如果 agent 接近目标 100 点,那么奖励就是 1,情节结束。
NeuroEvolution(神经进化)
_train_ga.py 的实现_
神经网络(Neural Network)通过使输入(观察空间)通过神经网络来获得最佳动作。
NeuroEvolution(神经进化)是使用进化算法不断改进人工神经网络的AI。对于每次迭代(生成),程序将基于前一次迭代中的最佳设置生成一组新的神经网络权重。 由先前的 NN(神经网络) 生成一个 NN 的过程叫做 Mutate,它给神经网络中的每个参数添加随机噪声。
一个特别的改进是,我们只存储应用于神经网络的噪声种子列表,而不是存储所有的代权值。因为在同一个种子下,所有的随机化都是相同的,所以一个种子可以代表一个网络的突变算子。我们不需要保留每一代的所有权值,我们只需要存储一组从开始到当前一代的种子,然后从这组种子中重新构造权值来得到所有神经网络的权值。
代码是基于 Maxim Lapan 的 "Deep Reinforcement Learning Hands-On"
我是为少。
微信:uuhells123。
公众号:黑客下午茶。
谢谢点赞支持!
试玩 GOWOG ,初探 OpenAI(使用 NeuroEvolution 神经进化)与 Golang 多人在线游戏开发的更多相关文章
- HTML5+JS 《五子飞》游戏实现(七)游戏试玩
前面第一至第六章我们已经把<五子飞>游戏的基本工作都已经讲得差不多了,这一章主要是把所有的代码分享给大家,然后小伙伴们也可以玩一玩. 至于人机对战的我们放到后面讲进行分析. 试玩地址:ht ...
- 一个小玩意 PHP实现微信红包金额拆分试玩
<meta charset="utf-8"> <?php // 新年红包金额拆分试玩 class CBonus { public $bonus;//红包 publ ...
- 1.2G内存试玩RAMOS_XP
1.2G内存试玩RAMOS_XP1.为了防止做系统时出现意外,用Bootice把C盘MBR修改为Grub4dos,这样子系统如果失败,可以进入PE重做. 2.进入PE格式化C盘,格式化的时候勾选启用N ...
- 8个经典的HTML5游戏在线试玩及源码学习
原文地址:http://www.oschina.net/news/32364/html5-games 游戏,毫无疑问是拿来供大家娱乐玩耍的,这也无可厚非,但是,今天给大家分享的8个HTML5游戏,在好 ...
- Apollo框架试玩
2017年7月5日,百度举行了AI开发者大会,在会上发布了Apollo项目,并进行了演示,该项目在Github上已经能够被访问.出于一个程序员的好奇,昨天试玩了一把,确实不错. http://apol ...
- 发布到FaceBook试玩广告,FaceBook要求要一个Html文件
Facebook 试玩广告具体要求: 试玩广告参数是创建试玩广告素材时要满足的要求. 试玩素材应为 HTML5 格式. 试玩广告素材不应使用 mraid.js 格式. 包含所有素材的试玩广告的单个 H ...
- [试玩] FMXLinux (Firemonkey for Linux) Linux 桌面开发(第三方插件)
FMXLinux 是一个可以用来开发 Linux 桌面软件的第三方插件,它需要配合 Delphi 10.2 Toyko 官网:http://www.fmxlinux.com/ 使用方法:开启 FMX ...
- ESP32 LyraT音频开发板试玩(二):播放音乐
我是卓波,很高兴你来看我的博客. 系列文章: ESP32 LyraT音频开发板试玩(一):搭建开发环境 ESP32 LyraT音频开发板试玩(二):播放音乐 本文延续上一篇博客 将D:\msys32\ ...
- ESP32 LyraT音频开发板试玩(一):搭建开发环境
我是卓波,很高兴你来看我的博客. 系列文章: ESP32 LyraT音频开发板试玩(一):搭建开发环境 ESP32 LyraT音频开发板试玩(二):播放音乐 关于ESP32的开发环境搭建,官方有教程, ...
随机推荐
- Core3.0使用Swagger接口文档
前言 此方法为百度搜索结果,原文链接找不到了 步骤 1.引用Nuget Swashbuckle.AspNetCore 2.Startup.cs配置 //注册swagger服务,定义1个或者多个swag ...
- [.NET] - EventLog.EntryWritten Event
刚看到在MSND论坛上有人问一个EventLog.EntryWritten Event相关的问题,说是在2015触发了一个2013年的EventWritten的事件,比较好奇,然后查看了下这个类: h ...
- Mac 上使用 Shell 脚本 + adb shell 实现简单的 Android 模拟点击自动化测试
需求 在 A 界面,点击跳转到 B 界面(该界面会执行一些业务),再点击返回键出现 Dialog 弹窗,点击确认退出按钮,返回 A 界面.不断循环. 思路 一开始想到的就是按键精灵,下了 mac 版使 ...
- 为什么MySQL不推荐使用uuid作为主键?
前言 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一,单机递增),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么 ...
- vue watch监听不到对象,探究 watch 原理
最近使用vue watch时,在某些模块监听不到对象的改变,无法触发回调函数. 解决: 使用watch监听对象时,只能监听到该对象初始化时已存在的key值. 如下例监听user对象,在初始化时没有ag ...
- Android驱动学习-app调用内核驱动过程(驱动框架回顾)
考研已经过去了,android驱动的学习也断了半年多了,现在重新捡起来学习,回顾一下Android驱动的大体框架. Android系统的核心是java,其有一个David虚拟机.Android-app ...
- 已加载"C:\Windows\SysWOW64\msvcp120d.dll".无法查找或打开 PDB 文件.
已加载"C:\Windows\SysWOW64\msvcp120d.dll".无法查找或打开 PDB 文件. 今天使用vs2013遇到了这样的问题. 解决方案: 点调试. 然后选项 ...
- WPF 调试时拖拽不生效
WPF窗体代码 <Window x:Class="SerialLabelDemo.Test.Window10" xmlns="http://schemas.micr ...
- Shiro配置Session检测时Quartz版本冲突
项目背景: shiro 1.3 + quartz 2.x 2018-9-11 22:20:35补充: 经过测试,本人发现 ,通过实现 org.apache.shiro.session.mgt.Exec ...
- docker基础总结
搜索镜像docker search ubuntu 搜索ubuntu的Docker镜像 搜索结果单个单词ubuntu这样的镜像,被称为基础镜像或根镜像,这些基础镜像由 Docker 公司创建搜索结果ti ...