最近再用pygame开发一个2d的RPG小游戏, 地图是用二维数组的形式保存的, 就像这样:👇
map2d = {
"map":[
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
],
.....
}
编辑地图的时候肯定不能用纯手工修改, 那么就还得自己写一个地图编辑器了. 这时候使用python自带的json库 json.dump的话 就会出现换行格式不美观:如下
"map": [
[
13,
13,
13,
13,
13,
13,
13,
13,
13,
13,
13,
13,
13,
13
],
[
13,
11,
........
]
这时候程序读数据当然是没问题的, 但是强迫症表示浑身不舒服… 找了半天的百度以及用chatgpt提供的 修改 dump的参数 separators=(“,”,“:”),也还是不起作用. 没办法自己动手丰衣足食:
python代码实现如下:
import json
a = {
"map":[
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
.....
],
"yiwei": [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17]
}
res = "{\n"
# 缩进
indent = 4
# 当前的遍历的位置
index = 0
# 当前字典(json数据) 的可迭代长度
keyLen = len(a.keys())
for i in a:
# 得到当前值
info = a[i]
# 获取到当前值的类型
dataTp = type(info)
# 给末尾添加的额外元素
endStr = ",\n"
# 如果当前值是数组, 需要特殊处理
if dataTp == list:
# 判断数组的第一个元素是否是 二维数组,这里只实现 二维数组的方法, 一维数组直接写入, 其他多维的数组方法同理
# 实现的功能是保存 用二维数组渲染的游戏地图, 所以子元素的类型都一致,只用判断一个就行
if type(info[0]) == list:
info = "[\n"
lIndex = 0
# 属于更下一级的子元素, 缩进需要再进一步
indent *= 2
for ci in a[i]:
# 判断是否到了迭代的末尾, 末尾的数据就不用加 逗号和换行了
if lIndex == len(a[i]) -1:
endStr = ""
# else:
info += " "*indent+f"{ci}{endStr}"
# 遍历位置+1
lIndex += 1
info += "\n]"
endStr = ",\n"
# 结束二维数组的处理之后, 将缩进改回来
indent = 4
# 根据当前行的数据类型判断是否需要 加上双引号包裹起来
if dataTp != dict and dataTp != list:
info = f'"{info}"'
if index == keyLen -1:
endStr = ""
# 将当前行的最终数据追加到res
res += " "*indent+f'"{i}": {info}{endStr}'
index += 1
res += "\n}"
with open("data.json", "w") as f:
f.write(res)
这下文件内容的格式看起来就舒服多了
{
"map": [
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13],
[13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13]
],
"yiwei": [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17]
}
以上代码截止: 2023/3/26 运行无误