猫史档案馆


【速建教程】浮空岛速建的分析、思路与实现

用户:yee089yee089查看:6 回复:10 评论:6 创建时间:2022-03-30T14:17:37


之前出了一期浮空岛手建教程,然后稍微有亿点肝。这次,我教大家做一下浮空岛速建(推荐自己手写实现,出大问题了再看代码)。

——————————————————————————————————————————————————————

/*
2、搭出岛的上轮廓(此处人机选择了从上向下搭,也可以从下往上,会好点(主要是我这么搭到底下光源不足,需要‘夜间施工法’()())):

3、向下缩小轮廓,每层缩小1个半径,大约缩小5格的‘半径’(不知道该这么说,‘只可意会,不可言传’):

4、改成dark_stone材料,然后每2层缩小一层半径,直到封住:
*/

这是之前的主体部分。

那么这个轮廓,肯定是要你自己搭的。那么,下面的部分就是现在我们要搞的。

那么,在下一层收缩轮廓怎么做呢?

分析:我们要收缩,分为两步:(1)把上一层复制下来;

                                        (2)把边缘方块删除。

(1)不难,但是(2)怎么做呢?

我们要先分析边缘方块是有什么特点

/*
0000000
0222200
0211120
0222220
0000000
*/

这里,‘2’代表边缘方块,‘0’代表空气。容易看出,边缘方块一定在旁边有空气方块。

那么,我们可以写一个check()函数(检查上面的是不是边缘方块,是的话就不复制了):


const dir =  [new Box3Vector3(-1,0,0),new Box3Vector3(0,0,-1),new Box3Vector3(0,0,1),new Box3Vector3(1,0,0) ];
function check(x,y,z){
    var flag = true;
    for(var i = 0; i < 4; i++){
        let nowx = x+dir[i].x;
        let nowy = y+dir[i].y+1;
        let nowz = z+dir[i].z;
        if(voxels.getVoxelId(nowx,nowy,nowz) == 0){
            flag=false;
            break;
        }
    }
    return flag;
}

接着,第四步,底下是二个缩小一圈,就是稍微改一改代码。

但是,这样会有点不自然,怎么办呢?在check函数末尾加一段:

    if(Math.random()*5 < 1){
        flag=true;
    }

(为什么自己想)。

好了,不出所料,你现在应该学会了,没学会,请看下面的代码()

————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————(超级喵长的分割线和括号癌晚期()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()())

const dir =  [new Box3Vector3(-1,0,0),new Box3Vector3(0,0,-1),new Box3Vector3(0,0,1),new Box3Vector3(1,0,0) ];
console.clear();
var voxel = voxels.id('zero');
function check(x,y,z){
    var flag = true;
    for(var i = 0; i < 4; i++){
        let nowx = x+dir[i].x;
        let nowy = y+dir[i].y+1;
        let nowz = z+dir[i].z;
        if(voxels.getVoxelId(nowx,nowy,nowz) == 0){
            flag=false;
            break;
        }
    }
    if(Math.random()*5 < 1){
        flag=true;
    }
    return flag;
}
async function bfs(x,y,z){
    let queue = [new Box3Vector3(0,0,0),new Box3Vector3(0,0,0),new Box3Vector3(0,0,0)];
    queue.pop();
    queue.pop();
    queue.pop();
    let stpq=[0,0,0];
    stpq.pop();
    stpq.pop();
    
    queue.push(new Box3Vector3(x,y,z));
    world.say(x + ' ' + y +' ' + z);
    
    while(queue.length > 0){
        let now = queue[0];
        queue.shift();
        let stp = stpq[0];
        stpq.shift();
        
        
        for(let i = 0; i < 4; i++){
            let nowx = now.x+dir[i].x;
            let nowy = now.y+dir[i].y;
            let nowz = now.z+dir[i].z;
            if(voxels.getVoxelId(nowx,nowy,nowz) == voxels.id('stone')){
                if(stp < 35){
                    queue.push(new Box3Vector3(nowx,nowy,nowz));
                    stpq.push(stp+1);
                    voxels.setVoxelId(nowx,nowy,nowz,voxel)
                }
           }
        }
        await sleep(1);
    }
    console.log('finishbfs');
}
(async function(){
    let y;
    for(var i = 0; i < 128; i++){
        for(var j = 0; j < 128; j++){
            for(var k = 0; k < 128; k++){
                if(voxels.getVoxelId(i,j,k) == voxel){
                    y=j;
                    await bfs(i,j,k);
                    break;
                }
            }
        }
    }
    for(var j = y-1; j > y-6; j--){
        for(var i = 0; i < 128; i++){
            for(var k = 0; k < 128; k++){
                if(voxels.getVoxelId(i,j+1,k) == voxel && check(i,j,k)){
                    voxels.setVoxelId(i,j,k,voxel);
                    await sleep(10);
                }
            }
        }
    }
    for(var j = y-6; j > y-40; j-=2){
        for(var i = 0; i < 128; i++){
            for(var k = 0; k < 128; k++){
                if(voxels.getVoxelId(i,j+1,k) == voxel && check(i,j,k)){
                    voxels.setVoxelId(i,j,k,voxel);
                    voxels.setVoxelId(i,j-1,k,voxel);
                    await sleep(10);
                }
            }
        }
    }
    for(var i = 0; i < 128; i++){
        for(var j = 0; j < 128; j++){
            for(var k = 0; k < 128; k++){
                if(voxels.getVoxelId(i,j,k) == voxel){
                    voxels.setVoxel(i,j,k,'stone');
                }
            }
        }
    }
})()

(PS:首先搭好最上面的一层,在中间放一个‘zero’方块,再把这玩意丢进控制台)


回复

上一页1 页 / 共 1下一页
yee089yee089

沙发()

点赞0


评论


用户_869149用户_869149

板凳!

点赞0


评论


yee089yee089

既然没有人,这个地板我要了()

点赞1


评论


云游box3der尖头叉子云游box3der尖头叉子

天花板

点赞0


评论


yee089yee089

地下室()

点赞0


评论


yee089yee089

()《地心》

点赞0


评论


难起的名字难起的名字

顶()

点赞0


评论


宇智波鼬[晓]宇智波鼬[晓]

我觉着还行,你应该不用离开协会了

点赞0


评论


Ezra__Ezra__

宽搜还可以继续简便()   

等等这算不算挖坟()emotion_doge

点赞1


评论


灵清帝王吃爆一切厕所灵清帝王吃爆一切厕所

喵d

点赞0


评论