网页游戏 活跃维护

gowog

giongto35/gowog

Gowog,基于Golang的网络多人在线游戏

126
Stars 标星
30
Forks 分支
7
Watchers 关注
0
Open Issues
Go
主要语言
MIT
开源协议
7.8 MB
仓库大小
7 年前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:giongto35/gowog
git clone https://github.com/giongto35/gowog.git
git clone git@github.com:giongto35/gowog.git
README.md master

英文原文正文为项目原始 README(英文),本站后续会翻译为中文,当前仅剔除图片与无关章节并统一排版。

GOWOG,开源基于Web的GO语言在线游戏

GOWOG 是一个用 Golang 编写的多人网络游戏。多亏了 Golang,服务器可以同时处理大量玩家。

试试游戏

东南亚地区(越南、新加坡、马来西亚...)

http://game.giongto35.com

由于托管成本,服务器仅托管在东南亚。

代理上的 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/websocket
  • go get github.com/golang/protobuf/protoc-gen-go
  • go 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(我的灵感)

许可证

MIT 许可

本站来源与版权声明
  • 本文标题:gowog - Gowog
  • 本文链接:https://cn121.com/webgame/giongto35-gowog.html
  • 原项目:giongto35/gowog 版权归原作者 giongto35 及贡献者所有
  • 收录信息:本站于 2026-10-01 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
  • 开源协议:收录时本项目采用 MIT(查看 LICENSE 原文),本站转载其原始文档(未改动文字,仅剔除图片与无关章节);使用、修改、分发请以该仓库 LICENSE 原文为准。
  • 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 giongto35/gowog。
  • 内容说明:本页正文为原项目 README 原文(英文),本站后续会翻译为中文(当前尚未译出,仅将二级标题译为中文,便于按栏目定位;标题原文可在下方原仓库中查看),仅剔除了图片与赞助等无关章节、并把相对链接改为绝对地址;页首简介为机器翻译自仓库描述。
  • 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
  • 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。