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

打开 http://localhost:8080

本地开发

游戏包含两部分:服务器和客户端。服务器使用 Golang,客户端使用 Node.JSPhaser 游戏引擎。

服务器

为少调整过的项目:Kirk-Wang/gowog

我的本地环境是 go 1.14

本地启动:

go run cmd/server/*

服务器将监听 8080

客户端

npm install
npm run dev -- --env.HOST_IP=localhost:8080 # HOST_IP -> 服务器地址

进入 http://localhost:3000

注意

在开发过程中,客户端在端口 3000 上运行,服务器端在端口 8080 上运行。

productiondocker环境中,已构建 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_spaceaction_space

ObservationSpace 是一个一维数组,它由来自服务器的 update_player 消息构造而成

  1. Player position(玩家位置), player size(玩家大小尺寸), number of columns(列数), number of rows(行数), block width(块宽度), block height(块高度
  2. 到左,右,上,下到最近 block()的距离。此输入是为了避免碰撞
  3. 玩家在二进制块地图(binary block map)中的位置。地图是 012 维数组(0 为空,1 为块)
  4. 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 多人在线游戏开发的更多相关文章

  1. HTML5+JS 《五子飞》游戏实现(七)游戏试玩

    前面第一至第六章我们已经把<五子飞>游戏的基本工作都已经讲得差不多了,这一章主要是把所有的代码分享给大家,然后小伙伴们也可以玩一玩. 至于人机对战的我们放到后面讲进行分析. 试玩地址:ht ...

  2. 一个小玩意 PHP实现微信红包金额拆分试玩

    <meta charset="utf-8"> <?php // 新年红包金额拆分试玩 class CBonus { public $bonus;//红包 publ ...

  3. 1.2G内存试玩RAMOS_XP

    1.2G内存试玩RAMOS_XP1.为了防止做系统时出现意外,用Bootice把C盘MBR修改为Grub4dos,这样子系统如果失败,可以进入PE重做. 2.进入PE格式化C盘,格式化的时候勾选启用N ...

  4. 8个经典的HTML5游戏在线试玩及源码学习

    原文地址:http://www.oschina.net/news/32364/html5-games 游戏,毫无疑问是拿来供大家娱乐玩耍的,这也无可厚非,但是,今天给大家分享的8个HTML5游戏,在好 ...

  5. Apollo框架试玩

    2017年7月5日,百度举行了AI开发者大会,在会上发布了Apollo项目,并进行了演示,该项目在Github上已经能够被访问.出于一个程序员的好奇,昨天试玩了一把,确实不错. http://apol ...

  6. 发布到FaceBook试玩广告,FaceBook要求要一个Html文件

    Facebook 试玩广告具体要求: 试玩广告参数是创建试玩广告素材时要满足的要求. 试玩素材应为 HTML5 格式. 试玩广告素材不应使用 mraid.js 格式. 包含所有素材的试玩广告的单个 H ...

  7. [试玩] FMXLinux (Firemonkey for Linux) Linux 桌面开发(第三方插件)

    FMXLinux 是一个可以用来开发 Linux 桌面软件的第三方插件,它需要配合 Delphi 10.2 Toyko 官网:http://www.fmxlinux.com/ 使用方法:开启 FMX ...

  8. ESP32 LyraT音频开发板试玩(二):播放音乐

    我是卓波,很高兴你来看我的博客. 系列文章: ESP32 LyraT音频开发板试玩(一):搭建开发环境 ESP32 LyraT音频开发板试玩(二):播放音乐 本文延续上一篇博客 将D:\msys32\ ...

  9. ESP32 LyraT音频开发板试玩(一):搭建开发环境

    我是卓波,很高兴你来看我的博客. 系列文章: ESP32 LyraT音频开发板试玩(一):搭建开发环境 ESP32 LyraT音频开发板试玩(二):播放音乐 关于ESP32的开发环境搭建,官方有教程, ...

随机推荐

  1. 轻松理解HTTP缓存策略

    上一篇文章我写了koa-static的源码解析,其中用到了HTTP的缓存策略,给返回的静态文件设置了一些缓存的头,比如Cache-Control之类的.于是我就跟朋友讨论了一下HTTP的缓存策略: 朋 ...

  2. python按位操作以及进制转换

    a = raw_input() b = raw_input() c1 = int(str(a), 2)#2进制转化为10进制 c2 = int(str(b), 2) c = c1 ^ c2#按位异或 ...

  3. 【命令】set命令

    1.查看所有的本地变量和环境变量. 2.检测变量是否定义: 开启检测功能: set -u  关闭检测功能:   set +u [root@localhost likui]# unset mm 删除了m ...

  4. apk获取sha1值的方法

    安卓应用都使用一个签名证书(.keystore或.jks文件)签名,签名证书可以由jdk生成.证书生成后,证书就有其sha1值. 使用此证书打包后的安卓应用,也有其一样的sha1值.md5值和sha2 ...

  5. Java日常开发的21个坑,你踩过几个?

    前言 最近看了极客时间的<Java业务开发常见错误100例>,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~ 1. 六类典型空指针问题 包装类型的空指针问题 级联调用的空 ...

  6. Elasticsearch索引生命周期管理方案

    一.前言 在 Elasticsearch 的日常中,有很多如存储 系统日志.行为数据等方面的应用场景,这些场景的特点是数据量非常大,并且随着时间的增长 索引 的数量也会持续增长,然而这些场景基本上只有 ...

  7. [leetcode]24. Swap Nodes in Pairs交换链表的节点

    感觉这个题后台的运行程序有问题,一开始自己想的是反转链表那道题的方法,只是隔一个节点执行一次,但是没有通过,TLE了,但是很奇怪,并没有死循环,就是最后返回的时候超时. 最后的思路就是很简单的进行交换 ...

  8. maven 父子项目 pom

    父项目 <!--项目 id--> <artifactId>expressway-cloud-travel</artifactId> <!-- 子模块--> ...

  9. Mac苹果电脑单片机开发

    1.安装虚拟机 可以阅读往期文章:Mac苹果电脑安装虚拟机 2.在虚拟机上安装CH340驱动,keil4,PZ-ISP, 下载 CH340驱动安装  下载keil4破解及汉化  下载普中科技烧录软件

  10. Daphile 安装手册 -- 官方文档译文 [原创]

    Daphile 安装手册(Daphile Installation) 英文原文:https://www.daphile.com/download/DaphileInstallation.pdf 采集日 ...