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

时间:2022-04-16 04:47:12

试玩 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

打开 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

游戏前端设计

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

这个前端项目是基于:

├── 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(架构图)

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

不同的实体通过包装在函数中的 channel 彼此调用。

Client 与 Server 交互设计方案

Player connect(玩家连接)

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

Player Disconnect(玩家断开连接)

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

Client input(客户端输入)

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

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&period;2G内存试玩RAMOS&lowbar;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. &lbrack;试玩&rsqb; FMXLinux &lpar;Firemonkey for Linux&rpar; Linux 桌面开发(第三方插件)

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

  8. ESP32 LyraT音频开发板试玩&lpar;二&rpar;:播放音乐

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

  9. ESP32 LyraT音频开发板试玩&lpar;一&rpar;:搭建开发环境

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

随机推荐

  1. Cocoa Touch事件处理流程--响应者链

    Cocoa Touch事件处理流程--响应者链 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9264335 转载请注明 ...

  2. YOU KNOW NOTHING &comma; SNOW

    JVM运行时数据区域 方法区: 用 于存储虚拟机加载的类信息,常量,静态变量,JIT编译后的代码,所有线程共享 堆:所有线程共享,用来存储实例对象. 虚拟机栈:线程私有,生命周期与线程相同,每个方法被 ...

  3. solr异常解决

    使用solr1.4跟solr3.1时,配置了个唯一id类型是sint 或者int,启动时在tomcat后台就会抛出这个异常: org.apache.solr.common.SolrException: ...

  4. SQL SERVER 2014 安装图解(含 SQL SERVER 2014 安装程序共享)

    开篇介绍 2015年1月1日,新的一年开始之际,本来应该好好做点有意义的事情来跨个年的.结果,*惯 - 睡觉之前一定要折腾一下电脑,说干就干,给新到的 DELL 电脑装虚机,下载 SQL SERVE ...

  5. highchart 导出图片&comma; 显示空白

    使用highchart时, 导出的图片会变空白..   解决方案: 不要加载grid.js

  6. Linux查找文件夹名

    @(编程) find / -type d -name filename type的类型 -type c File is of type c: b block (buffered) special c ...

  7. UIBezierPath详解

    使用UIBezierPath类可以创建基于矢量的路径,这个类在UIKit中.此类是Core Graphics框架关于path的一个封装.使用此类可以定义简单的形状,如椭圆或者矩形,或者有多个直线和曲线 ...

  8. SKU &colon; Stock Keeping Unit

    Stock Keeping Unit  is a number assigned to a product by a retail store to identify the price, produ ...

  9. &lbrack;No0000F0&rsqb;DataGrid一行Row添加ToolTip,wpf

    1. <Window x:Class="WpfApp7.MainWindow" xmlns="http://schemas.microsoft.com/winfx/ ...

  10. swift中 ?和 !的区别

      可选类型(?)与强制解析运算符(!) ?是一种判断后再拆包的语法糖 !是一种强制拆包的语法糖   当你不确定有值的时候就可以用  ? 当你确定有值的时候可以用  !     ?的几种使用场景:1. ...