英文原文正文为项目原始 README(英文),本站后续会翻译为中文,当前仅剔除图片与无关章节并统一排版。
GOWOG,开源基于Web的GO语言在线游戏
GOWOG 是一个用 Golang 编写的多人网络游戏。多亏了 Golang,服务器可以同时处理大量玩家。
试试游戏
东南亚地区(越南、新加坡、马来西亚...)
由于托管成本,服务器仅托管在东南亚。
代理上的 AI 实验
由于服务器、客户端和消息是解耦的,因此与后台通信很容易。以下是我用 Python 编写的 AI 代理,它学习与环境互动。这个实验是使用神经进化在迷宫中寻找路径。
https://www.youtube.com/watch?v=pWbb1m91mhU
实现代码在 gowog/ai
本地
你可以通过运行 ./run_local.sh 在本地尝试游戏。它会构建一个 Docker 环境并在 8080 端口运行游戏。
在浏览器中打开“localhost:8080”
开发
该游戏包含两个部分:服务器和客户端。服务器使用 Golang,客户端使用 Node.JS 和 Phaser 游戏引擎。
服务器
安装 Golang https://golang.org/doc/install
安装依赖项
go get github.com/gorilla/websocketgo get github.com/golang/protobuf/protoc-gen-gogo get github.com/pkg/profile
运行服务器。服务器将在端口 8080 监听。
进入 gowog 文件夹
go run server/cmd/server/*
客户端
安装 NodeJS https://nodejs.org/en/download/
进入 gowog/client 文件夹
安装依赖项
npm install
运行客户端。客户端将在端口 3000 监听。env.HOST_IP 是 gowog 服务器的 IP,现在是 localhost:8080。
npm run dev -- --env.HOST_IP=localhost:8080
在浏览器中打开 "localhost:3000"
注意:
在开发环境中,我们分别在端口 3000 运行客户端,在端口 8080 运行服务器。
在生产和 Docker 环境中,客户端已经构建完成,Go 语言服务器将在同一个端口 8080 返回客户端页面。因此,如果我们运行 Docker 环境,游戏将在浏览器的“localhost:8080”启动。
通信约定
服务器和客户端之间的通信包基于 protobuf。安装 protoc 以生成 protobuf。
每次你更改 /server/message.proto 中的包签名时,运行
-
go 到
gowog/server -
/generate.sh
文档
常见问题
为什么我们需要 Golang 来开发多人游戏?
构建大型多人游戏非常困难,目前也被忽视。你必须确保延迟是可接受的,同时处理共享状态的并发,并允许其垂直扩展。Golang 提供了非常优雅的概念,通过 goroutine 和 channel 处理并发。
为什么游戏玩法如此简单且前端代码库如此混乱?
游戏玩法主要用于演示目的。我的目标是保持游戏当前的简洁,同时在保持良好延迟(<100ms)的情况下垂直扩展玩家数量。我欢迎大家提出任何想法,使游戏更具可扩展性。
不过,我仍然愿意接受图形改进和客户端代码库重构。我希望看到一些粒子爆炸或发光效果、运动效果。请记住,不同的人对游戏的外观有不同的观点,因此在进行 UI 更改之前,我们需要达成完全共识。
为什么选择 protobuf?
为了优化包大小,我们需要将其压缩为二进制。Protobuf 提供了快速的语言无关序列化和反序列化,因此 Golang 服务器可以以最佳方式与 JS 客户端通信。
我们可以考虑更快的序列化格式,如 Cap'n Proto 或 FlatBuffers。
为什么多人游戏不是基于房间的(每个游戏少于 20 名玩家)
在我看来,基于房间的挑战性较低,因为每个房间彼此完全独立,我们可以通过增加更多实例更容易地扩展游戏。此仓库旨在展示游戏在一台多核单机上可以服务多少玩家。
当然,我的最终目标是通过增加更多实例,使非基于房间的游戏垂直扩展。
贡献指南
我期待你对 GOWOG 的贡献,这将有助于游戏更加流畅和可扩展。如果你有任何提高游戏性能的想法,请在此问题中讨论 Discussion。
我也欢迎前端改进,例如代码库重组和性能提升。如果你想改进 UI,请创建一个问题来展示新的设计,以便我们就此达成一致。
由于我的愿望是利用 Golang 并发范式实现支持大量玩家的流畅游戏体验,我将保持游戏玩法简单。玩家可以移动并互相射击。任何游戏玩法的更改都不被接受。
致谢
https://github.com/gorilla/websocke/blob/master/examples/chat
https://github.com/RenaudROHLINGER/phaser-es6-webpack
https://github.com/huytd/agar.io-clone(我的灵感)
许可证
- 本文标题:gowog - Gowog
- 本文链接:https://www.cn121.com/webgame/giongto35-gowog.html
- 原项目:giongto35/gowog 版权归原作者 giongto35 及贡献者所有
- 收录信息:本站于 2026-10-01 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
- 开源协议:收录时本项目采用 MIT(查看 LICENSE 原文),本站转载其原始文档(未改动文字,仅剔除图片与无关章节);使用、修改、分发请以该仓库 LICENSE 原文为准。
- 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 giongto35/gowog。
- 内容说明:本页正文为原项目 README 原文(英文),本站后续会翻译为中文(当前尚未译出,仅将二级标题译为中文,便于按栏目定位;标题原文可在下方原仓库中查看),仅剔除了图片与赞助等无关章节、并把相对链接改为绝对地址;页首简介为机器翻译自仓库描述。
- 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
- 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。