我有一个游戏,我已经使用 pygbag 移植到浏览器,并且在使用 pickle 加载数据时工作正常,但它不保存数据,但是当在本地运行(不在浏览器上)时它工作正常,我应该如何使用 pickle 保存数据或任何其他带有 pygbag 的保存库?
游戏的其余部分工作正常,并且它也加载所有资源。
保存代码是 -
# saving data
file = open("Civ Data/main.pkl", "wb")
pickle.dump(kingdoms, file)
file.close()
如果无法保存数据,那么有没有办法给玩家一个可以下载并稍后用于加载保存的文件?
完整代码是 - https://github.com/IGR2020/PaperCiv/tree/browser
当然,我可以帮你。在使用 Pygbag 在基于浏览器的游戏中遇到 pickle 保存问题的原因是浏览器环境通常对文件系统的直接访问有限。
让我们探讨一下解决这个问题的方法以及如何实现它们:
1. 基于浏览器的存储
-
本地存储: 适用于小型数据片段(最多几 MB),这些数据需要在用户的浏览器中保持持久性。
```javascript // 在 JavaScript 中保存 localStorage.setItem('kingdomsData', JSON.stringify(kingdoms));
// 在 JavaScript 中加载 let kingdoms = JSON.parse(localStorage.getItem('kingdomsData')); ```
在的 Python 代码中,需要使用
pygbag.js
模块在 JavaScript 和 Python 之间进行交互:```python import pygbag import json
def save_data(kingdoms): kingdoms_str = json.dumps(kingdoms) pygbag.js.eval(f"localStorage.setItem('kingdomsData', '{kingdoms_str}');")
def load_data(): kingdoms_str = pygbag.js.eval("localStorage.getItem('kingdomsData');") return json.loads(kingdoms_str) if kingdoms_str else None ```
-
索引数据库 (IndexedDB): 用于更结构化且可能更大的数据集。它是一个更像数据库的选项,内置在现代网络浏览器中。
javascript // 用于保存的简化 IndexedDB 示例(需要实现更完整的 IndexedDB 交互) function saveToIndexedDB(kingdoms) { // 打开数据库 // 创建(如果需要)一个对象存储 // 将数据存储在对象存储中 }
还需要像上面使用
localStorage
所做的那样使用pygbag.js
来桥接 Python 和 IndexedDB。
2. 基于服务器的存储
-
如果需要持久存储或需要处理大量数据,那么在远程服务器上保存游戏数据是更强大的解决方案。
- 设置服务器: 可以使用 Flask 或 Django(用于 Python)或任何其他后端技术创建一个服务器来处理数据存储。
-
API:
为的游戏创建一个 API 端点,以通过
fetch
或XMLHttpRequest
从 JavaScript 发送(保存)和接收(加载)游戏数据。
```python # Python 服务器端示例(使用 Flask) from flask import Flask, request, jsonify import pickle
app = Flask( name )
@app.route('/save', methods=['POST']) def save_game(): kingdoms = request.get_json() # 使用 pickle 或其他方法将 kingdoms 保存到服务器 return jsonify({'status': 'saved'})
if name == ' main ': app.run(debug=True) ```
3. 下载文件(变通方法)
可以生成一个包含游戏数据的文件,并让用户将其下载到他们的计算机上。这不会自动保存,但为用户提供了一种存储进度的途径。
```python
import json
from pygbag import download
def allow_download_data(kingdoms):
kingdoms_str = json.dumps(kingdoms)
download(kingdoms_str, "kingdoms_save.json")
```
选择正确的方法
-
小型数据集:
localStorage
-
中等大小、结构化数据集:
IndexedDB
- 大型数据集、持久性、在线功能: 基于服务器的存储
- 简单变通方法: 下载文件选项
重要提示: 在基于浏览器的游戏中处理保存数据时,请务必考虑游戏数据的安全性和完整性。评估是否需要服务器端验证或加密等措施来防止作弊或数据丢失。
如果能提供有关游戏规模和是否愿意使用服务器端组件的更多上下文,我可以帮助确定最合适的解决方案。如果还有其他问题,请告诉我!
标签:python,pygame,pickle,saving-data,pygbag From: 78800496