猫史档案馆


【代码地图速建】3秒实现把图片中的迷宫画在神岛地图!

用户:Vicent轩Vicent轩查看:19 回复:49 评论:19 创建时间:2022-01-17T17:26:16


hello大家好,我是Vicent轩

今天来分享个代码,让你在box3建迷宫变得轻松!

一、首先你需要准备一张迷宫地图

像这个:

center_image

并把它压缩成255x255大小的图片

 

二、写一段python代码

逐个扫描像素点,并把图片中墙壁部分识别出来

比如说上图,墙壁部分是白色的

白色的RBG值是 255,255,255

但是,这张图片的白色...准确的来说是灰色

如果我们用RBG255,255,255去判断这个点是不是代表着墙壁

那肯定是扫描出一片空白,那这就需要我们去摸索

容差tolerance到底该设多少了

总之...建议容差在50-200之间

太高了几乎扫描不出墙壁只有散点

太低了,墙壁是完整的出来了,但是不该是墙壁的地方也识别成了墙壁

那迷宫路的宽度就会有的地方宽有的地方窄,变得畸形不是自己想要的了

危调工作量巨大(bushi

center_image

好的以上工作做完了以后,让程序导出到txt...

等等...这个txt将近3MB?

啊那这可不行...要是将这么长的数据复制到box3...直接卡喵XD

所以我们需要亿点代码把数据压缩一下...

center_image

原始数据大概是这样的格式:

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在代码文件的位置

center_image

 

三、写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坐标)

center_image(效果图)

然后我们需要把地图的墙壁建起来

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();

center_image

感谢观看,你学废了吗?

center_image


回复

上一页1 页 / 共 2下一页
凌cloud凌cloud

沙发!!!!

点赞0


评论


VernierVernier

XD

点赞0


评论


VernierVernier

XD

点赞0


评论


VernierVernier

XD

点赞0


评论


凌cloud凌cloud

XD!!!!给我顶上去!!!!

点赞0


评论


Vicent轩Vicent轩

注:以上代码适用于超大地图XD,想用在大地图上的话自己修改代码

点赞2


评论


一个破名七个字一个破名七个字

ddd!!!

点赞0


评论


一个破名七个字一个破名七个字

这么说,啥都可以扫了!

点赞0


评论


浮生awa浮生awa

前排!!!!

点赞0


评论


爱探险的可乐呀爱探险的可乐呀

把RBG改为RGB是不是会正确一些呢()

不过vicent的代码是真的不错()学废了学废了()

点赞2


评论


Yue.SYue.S

这个厉害了

点赞6


评论


神岛吉吉喵神岛吉吉喵

牛啊牛啊

点赞3


评论


神岛吉吉喵神岛吉吉喵

好,很有精神!

点赞3


评论


拍打星拍打星

XDXDXD

点赞1


评论


loc浪迹天涯loc浪迹天涯

Vicent轩,我可以合作黑暗欺骗么?

我在神岛的名称是“TitleMan”,你可以看看我的地图(就相当于看看我的水平),我的大作是《Go!吃豆人!》

求Vicent轩大佬紧急回复!

点赞1


评论


IaeaIaea

dddddd

点赞0


评论


治愈绾兮治愈绾兮

你这压缩算法,有点像压缩包的呀

点赞0


评论


想不出来叫什么想不出来叫什么

66666666VicentNB

 

点赞0


评论


韵律源点Arcaea韵律源点Arcaea

在代码岛放动画指日可待

点赞0


评论


mornwindmornwind

你还不如

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


评论


FML饭米粒FML饭米粒

114514个“子”

点赞0


评论


阳光猫阳光猫

点赞,改天试试

点赞0


评论


源码极客源码极客

妙啊

点赞0


评论


一个STUB用户_6715468一个STUB用户_6715468

要不要我帮你整成一个网页()

点赞1


评论


聋猪up聋猪up

吉吉说得对()继续秀()

点赞0


评论


一个STUB用户_14302596一个STUB用户_14302596

轩,你是不是不知道尹子的地形机器可以直接导入图片

点赞0


评论


研岩研岩

。。。

点赞0


评论


爱编程_编程喵喵爱编程_编程喵喵

赞👍

点赞0


评论


面具狐狸云绾兮面具狐狸云绾兮

阿巴阿巴阿巴

点赞0


评论