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. 弱肉强食——《哆啦A梦:大雄的新恐龙》观后感

    观看大雄的新恐龙不是在电影院观看的,由于时间的问题无法去电影院观看,是在家通过梦蓝字幕组翻译好的观看的,这个翻译好的视频已经由于版权原因没有发布了. 故事的开始与以往的情节十分相似:大雄因为不想被胖虎 ...

  2. mybatis-plus逻辑删除

    MP(mybatis plus)已经大大简化了我们好多的开发操作,基本的增删改查都有了,包括代码生成等等,今天想说的是它的逻辑删除功能.我们都在数据库设计时候经常会有is字段,表示是否删除,为了留下员 ...

  3. 部署docker镜像仓库及高可用

      下载地址: https://github.com/goharbor/harbor/releases   安装harbor服务器: 安装harbor root@harbor-vm1:/usr/loc ...

  4. 精尽Spring MVC源码分析 - LocaleResolver 组件

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  5. Python将word文档批量转PDF

    前面有一篇<Python批量创建word文档(2)- 加图片和表格>的文章,利用这篇文章创建的word文档来批量转PDF文档.代码: 1 ''' 2 #python批量将word文档转换成 ...

  6. 网易云解锁无版权PC&安卓版

    前言 又是一个不太忙碌的周末 好吧,其实智能车有很多东西要做,其他也有很多东西要处理,但我想咸鱼一个早上. 闲着没事去吾爱破解上翻了翻,找找音乐软件,因为Listen 1有个音源挂了,应该是咪咕的,导 ...

  7. 686. Repeated String Match判断字符串重复几次可以包含另外一个

    public static int repeatedStringMatch(String A, String B) { //判断字符串a重复几次可以包含另外一个字符串b,就是不断叠加字符串a直到长度大 ...

  8. MyBatis-Plus 多表联查+分页

    在写东西的过程中,多表联查和分页功能必不可少.当然,crud也很重要 但是又不想写代码和xml. 通过苦苦的查找.发现MyBatis-Plus一款国产的框架.优化了许多操作 本次主要记录一下,多表联查 ...

  9. NIO非阻塞式编程

    /** * NIO非阻塞式编程<p> * 服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道 (channel) 上的事件. * 我们以服务端 ...

  10. 关于Iterator

    1.在迭代过程中,用list来删除元素的坑 1 package test; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 ...