33
44本篇介绍如何用 Lean4Game 添加 Lean4 游戏。这类互动游戏不仅利于 Lean 本身的学习,还能促进对学科知识的理解,让关联的学科群体对 Lean 有更直观的认识。
55
6- 当前部署了 NNG4 游戏 :[ nng4.leanprover.cn] ( https://nng4.leanprover.cn ) ,可在线体验,后续计划写一个李代数入门的(mark 开坑) 。
6+ 当前部署了 NNG4 在线游戏(托管 @ rexwzh ) :[ nng4.leanprover.cn] ( https://nng4.leanprover.cn ) ,可在线体验。
77
88### 相关项目与资源
99
@@ -85,7 +85,7 @@ nvm use node
8585# 下载 Lean4Game
8686git clone https://github.com/leanprover-community/lean4game.git
8787cd lean4game
88- # 安装依赖
88+ # 安装依赖 (必须加上 --force 以解决依赖冲突)
8989npm install --force
9090```
9191
@@ -99,7 +99,12 @@ export VITE_CLIENT_DEFAULT_LANGUAGE=zh
9999
100100其中 ` PORT ` 为运行 Lean 代码的后端端口,默认是 ` 8080 ` ;` CLIENT_PORT ` 为前端访问端口,默认是 ` 3000 ` ;` VITE_CLIENT_DEFAULT_LANGUAGE ` 为界面语言,默认为 ` en ` 。
101101
102- 执行 ` npm start ` 启动游戏,如果看到以下页面,就表示访问成功:
102+ 执行 ` npm start ` 启动游戏。该命令会同时启动三个服务:
103+ - ** Server** : 后端 Lean 代码执行环境(8080 端口)。
104+ - ** Relay** : WebSocket 中继服务。
105+ - ** Client** : 前端 Vite 界面(3000 端口)。
106+
107+ 如果看到以下页面,就表示访问成功:
103108
104109![ 20240623121710] ( https://qiniu.wzhecnu.cn/PicBed6/picgo/20240623121710.png )
105110
@@ -109,62 +114,105 @@ export VITE_CLIENT_DEFAULT_LANGUAGE=zh
109114
110115### Nginx 配置
111116
112- 如果一切顺利,访问 ` http://localhost: 3000/#/g/local/GameSkeleton ` 会看到 “Hello World” 的界面:
117+ 假设服务启动在 3000 端口(且后端通过 8080 端口或 websocket 通信),我们需要配置 Nginx 来反向代理这些服务。
113118
114- ![ 20240623130158] ( https://qiniu.wzhecnu.cn/PicBed6/picgo/20240623130158.png )
119+ 以下是一个完整的生产环境配置示例,包含两部分:
120+ 1 . ** 游戏主站** (` lean4game.leanprover.cn ` ):代理到本地服务,支持 WebSocket。
121+ 2 . ** 游戏跳转** (` nng4.leanprover.cn ` ):将特定子域名重定向到具体的游戏路径。
115122
116- 假设服务启动在 3000 端口,可以将域名 ` game.leanprover.cn ` 配置为游戏主页面,参考配置如下:
123+ ``` nginx
124+ # WebSocket 支持所必需的配置
125+ map $http_upgrade $connection_upgrade {
126+ default upgrade;
127+ '' close;
128+ }
129+
130+ # 1. 游戏主站配置
131+ server {
132+ listen 80;
133+ server_name lean4game.leanprover.cn;
134+ rewrite ^(.*)$ https://$host$1 permanent;
135+ }
117136
118- ``` bash
119137server {
120138 listen 443 ssl;
121- ssl_certificate /etc/letsencrypt/live/game.leanprover.cn/fullchain.pem;
122- ssl_certificate_key /etc/letsencrypt/live/game.leanprover.cn/privkey.pem;
123- server_name game.leanprover.cn;
139+ server_name lean4game.leanprover.cn;
140+
141+ # SSL 证书配置 (请替换为实际路径)
142+ ssl_certificate cert/leanprover.cn/fullchain.pem;
143+ ssl_certificate_key cert/leanprover.cn/privkey.pem;
144+
145+ # SSL 优化配置
146+ ssl_session_cache shared:le_nginx_SSL:10m;
147+ ssl_session_timeout 1440m;
148+ ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
149+ ssl_prefer_server_ciphers on;
150+
124151 location / {
125- proxy_pass http://localhost:3000;
126- proxy_set_header Upgrade $http_upgrade ;
127- proxy_set_header Connection " Upgrade" ;
128- proxy_set_header Host $host ;
129- proxy_read_timeout 86400;
130- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
152+ # 代理到本地服务端口 (例如 frp 映射的端口或本地 3000)
153+ proxy_pass http://127.0.0.1:3110;
154+
131155 proxy_ssl_server_name on;
156+ proxy_set_header Host $host;
157+ proxy_set_header Connection $connection_upgrade;
132158 proxy_http_version 1.1;
133159 chunked_transfer_encoding off;
134160 proxy_buffering off;
135161 proxy_cache off;
162+ proxy_set_header X-Forwarded-For $remote_addr;
136163 proxy_set_header X-Forwarded-Proto $scheme;
137- client_max_body_size 0 ;
164+ proxy_set_header Upgrade $http_upgrade ;
138165 }
139166}
140- ```
141167
142- 为简化输入,可以为游戏单独配置一个子域名进行跳转,例如 ` nng4.leanprover.cn ` :
168+ # 2. 特定游戏重定向 (例如 NNG4)
169+ server {
170+ listen 80;
171+ server_name nng4.leanprover.cn;
172+ rewrite ^(.*)$ https://$host$1 permanent;
173+ }
143174
144- ``` bash
145175server {
146- listen 443 ssl;
147- ssl_certificate /etc/letsencrypt/live/nng4.leanprover.cn/fullchain.pem;
148- ssl_certificate_key /etc/letsencrypt/live/nng4.leanprover.cn/privkey.pem;
176+ listen 443 ssl;
149177 server_name nng4.leanprover.cn;
150- return 301 https://game.leanprover.cn/# /g/local/NNG4;
178+
179+ ssl_certificate cert/leanprover.cn/fullchain.pem;
180+ ssl_certificate_key cert/leanprover.cn/privkey.pem;
181+
182+ # 重定向到具体的游戏路径
183+ return 301 https://lean4game.leanprover.cn/#/g/local/NNG4;
151184}
152185```
153186
154- 这样只需访问 nng4.leanprover.cn,而不需要输入后面的一长串 URI。
187+ 这样配置后:
188+ - 访问 ` lean4game.leanprover.cn ` 将进入游戏大厅或主界面。
189+ - 访问 ` nng4.leanprover.cn ` 将直接跳转到自然数游戏 (NNG4)。
155190
156191
157192<!-- 通常,对 `client/` 或 `relay/` 中文件的任何更改都会导致服务器自动重新启动。
158193
159- 在生产环境中,可以执行 `npm run build` 在 `client/dist` 下构建代码,再启动服务 :
194+ 在生产环境中,推荐的启动流程如下 :
160195
196+ ```bash
197+ # 构建所有组件 (Server, Relay, Client)
161198npm run build
162- npm run start_client
163- npm run production
164199
165- 这里似乎存在 bug
200+ # 启动生产环境中继器 (会自动管理 Server 进程)
201+ npm run production
202+ ```
166203-->
167204
205+ ## 本地开发技巧
206+
207+ 如果你正在修改 ` lean4game/server ` 中的代码,并希望 NNG4 使用本地的服务器逻辑而非远程仓库版本,请在 NNG4 目录下执行:
208+
209+ ``` bash
210+ lake update -Klean4game.local
211+ lake build
212+ ```
213+
214+ 这样可以方便地调试游戏引擎的功能。
215+
168216## 游戏修改指南
169217
170218本节以 NNG4 为例,介绍游戏文件结构和如何添加游戏内容。
@@ -396,7 +444,14 @@ Statement
396444
397445## 游戏翻译
398446
399- 通过使用 lean-i18n 和 i18next,可以为游戏添加多语言支持。TODO Ref: https://github.com/leanprover-community/lean4game/blob/main/doc/translate.md
447+ 通过使用 lean-i18n 和 i18next,可以为游戏添加多语言支持。详细流程如下:
448+
449+ 1 . ** 生成模板** :在游戏目录下运行 ` lake build ` ,会自动生成 ` .i18n/en/Game.pot ` 模板文件。
450+ 2 . ** 翻译文件** :使用 Poedit 等工具打开 ` .pot ` 文件,进行翻译并保存为目标语言的 ` .po ` 文件(例如 ` .i18n/zh/Game.po ` )。
451+ 3 . ** 导出 JSON** :运行 ` lake exe i18n --export-json ` ,将翻译导出为服务器所需的 JSON 格式。
452+ 4 . ** 前端翻译** :对于 lean4game 框架本身的界面翻译,可以查看 ` lean4game/client/public/locales ` 目录。可以使用 ` npm run translate ` 扫描前端代码中的新字符串。
453+
454+ 更多详情请参考 [ translate.md] ( https://github.com/leanprover-community/lean4game/blob/main/doc/translate.md ) 。
400455
401456---
402457
0 commit comments