用户:
Vicent轩查看:19 回复:49 评论:19 创建时间:2022-01-17T17:26:16
hello大家好,我是Vicent轩
今天来分享个代码,让你在box3建迷宫变得轻松!
一、首先你需要准备一张迷宫地图
像这个:

并把它压缩成255x255大小的图片
二、写一段python代码
逐个扫描像素点,并把图片中墙壁部分识别出来
比如说上图,墙壁部分是白色的
白色的RBG值是 255,255,255
但是,这张图片的白色...准确的来说是灰色
如果我们用RBG255,255,255去判断这个点是不是代表着墙壁
那肯定是扫描出一片空白,那这就需要我们去摸索
容差tolerance到底该设多少了
总之...建议容差在50-200之间
太高了几乎扫描不出墙壁只有散点
太低了,墙壁是完整的出来了,但是不该是墙壁的地方也识别成了墙壁
那迷宫路的宽度就会有的地方宽有的地方窄,变得畸形不是自己想要的了
危调工作量巨大(bushi

好的以上工作做完了以后,让程序导出到txt...
等等...这个txt将近3MB?
啊那这可不行...要是将这么长的数据复制到box3...直接卡喵XD
所以我们需要亿点代码把数据压缩一下...

原始数据大概是这样的格式:
1,1,1,0,1,1,1,0,0,1,0,1,1,1.......(此处省略114514个字doge)
我们把变成这样
1x3,0x1,1x3,0x2,1x1......(继续省略114514个子(bushi)
虽然还有繁琐的地方,但是已经足够了
复制到box3卡个十几秒就ok了
好的以下是代码:
from PIL import Image
img=Image.open("gold watcher.png")
img_array=img.load()
map_data_str=""
tolerance = 60
for x in range(255):
is_range = 0
no_range = 0
for z in range(255):
print(list(img_array[x,z]))
color = list(img_array[x,z])
if color[0] >= tolerance and color[1] >= tolerance and color[2] >= tolerance:
if(no_range != 0):
map_data_str += str(no_range)+"x"+"0"
no_range = 0
if(z != 255):#187
map_data_str += ","
print("1")
is_range += 1
else:
if(is_range != 0):
map_data_str += str(is_range)+"x"+"1"
is_range = 0
if(z != 255):
map_data_str += ","
no_range += 1
if(no_range != 0):
map_data_str += str(no_range)+"x"+"0"
no_range = 0
map_data_str += "-"
with open("result.txt","w") as f:
f.write(map_data_str)
# print(len(maplist))
# print(len(maplist[0]))
(语言:python,所用库pillow)
(迷宫图片位置在第二行替换,容差设置在第五行tolerance,变量格式为int数字,结果result.txt在代码文件的位置)

三、写JavaScript代码
我们的最终目的是把地图搬到神岛上嘛
当然要在神岛写代码啦!
首先我们需要用split方法把上面python代码
导出的压缩数据拆成原始数据然后画在神岛地图上
data = ""
async function drawMap(data,y){
x = 0;
z = 0;
xList = data.split("-");
for(const xData of xList){
zList = xData.split(",");
z=0;
for(const zData of zList){
setData = zData.split("x");
if(setData[1] == 1){
sv = "dark_gray";
}else{
sv = "stone";
};
for(i=0;i<setData[0];i++){
voxels.setVoxel(x,y,z,sv);
z+=1;
};
};
x += 1;
};
};
(data参数为python导出的压缩数据,请把数据完整复制到第一样的data变量[str]中,y为画地图的y坐标)
(效果图)
然后我们需要把地图的墙壁建起来
async function setMap(gV,wV,gY){
for(x=0;x<256;x++){
for(z=0;z<256;z++){
voxels.setVoxel(x,gY,z,gV);
};
};
for(x=0;x<256;x++){
for(z=0;z<256;z++){
if(voxels.name(voxels.getVoxel(x,gY-1,z)) == "dark_gray"){
for(y=gY;y<gY+7;y++){
voxels.setVoxel(x,y,z,wV);
};
};
};
};
};
(gV为地板方块名,wV为墙壁方块名,gY为地面y坐标(要比画地图坐标大1))
最后,调用一下,就完成啦!
async function main(){
drawMap(newData,16);
setMap("stone","green_leaf",17);
};
main();

感谢观看,你学废了吗?

loc浪迹天涯Vicent轩,我可以合作黑暗欺骗么?
我在神岛的名称是“TitleMan”,你可以看看我的地图(就相当于看看我的水平),我的大作是《Go!吃豆人!》。
求Vicent轩大佬紧急回复!
点赞1
评论
mornwind你还不如
from PIL import Image
img=Image.open("*.jpg").convert("L")
pix=[]
for y in range(img.height):
lst=[]
for x in range(img.width):
if img.getpixel(x,y)<225:
lst.append(0)
else:
lst.append(1)
pix.append(x)
with open("data.txt","w") as f:
f.write(pix)
灰度图检测不好吗
点赞2
评论
星星上的雪花原来你下午一直在黑暗欺骗挂机是因为这个啊 以前我处理超大数据时是这样的:把数据复制到另一个模块里然后命名“不要打开!.js”,然后使用从外部导入代码来加载数据,这样网页就不会被卡崩了 imgsrc="https://static.cod喵/emoji/codemao/%E7%BC%96%E7%A8%8B%E7%8C%AB_%E5%8A%A0%E6%B2%B9.gif"alt="emotion_编程猫_加油"
点赞0
评论