猫史档案馆


【BOX3科普贴】怎样做出一个贪吃蛇大作战?源代码全公开!

用户:嗯哼君 渠源嗯哼君 渠源查看:492 回复:15 评论:15 创建时间:2020-05-02T23:09:52


先放出成品吧:https://box3.codemao.cn/content/1/9302

根据吉吉喵的《圈地之王》改编而来,不过都是我一个人写的代码

主要的难点有两个地方:①实现尾迹的长短变化;②实现杀喵敌人的变化

先放上源代码吧,很多没用的注释,删去就行:

console.log("Link Start!");
const SECONDS_PER_TICK = 1000 / 128; 
const ROUND_TIME = 200 * SECONDS_PER_TICK;//每局游戏时长
const MIN_PLAYERS = 2;//玩家数量下限
const BLACK_TIME = 250 //刷新黑方块的时间,默认一秒钟4个
const GRID_X = 128;
const GRID_Z = 128;
var t;
world.gravity *= 10;

const TEAMS = [
    { r: 1, g: 0, b: 0, v: voxels.id('red_light'),      n: '红队',       score: 0, },
    { r: 0, g: 1, b: 0, v: voxels.id('green_light'),    n: '绿队',     score: 0, },
    { r: 0, g: 0, b: 1, v: voxels.id('blue_light'),     n: '蓝队',      score: 0, },
    { r: 1, g: 0, b: 1, v: voxels.id('purple'),         n: '紫队',   score: 0, },
    { r: 0, g: 1, b: 1, v: voxels.id('indigo_light'),   n: '青队',      score: 0, },
    { r: 1, g: 1, b: 0, v: voxels.id('yellow_light'),   n: '黄队',    score: 0, },
];


world.onPlayerJoin(({ entity }) => {
    entity.player.Len = 1
    //console.log(entity.player.name + "的Len初始化为 : " + entity.player.Len)
    entity.player.All = []
    //console.log(entity.player.name + "的All初始化为 : " + entity.player.Len)
});

// 辅助函数,用于随机打乱一个数组
function shuffle (array) {
    for (let i = 1; i < array.length; ++i) {
        const temp = array[i];
        const x = (Math.random() * (i + 1)) | 0;
        array[i] = array[x];
        array[x] = temp;
    }
    return array;
}

async function startGame () {
    // 将地面初始化,全部变成white
    for (let j = 0; j < GRID_Z; ++j) {
        for (let i = 0; i < GRID_X; ++i) {
            voxels.setVoxel(i, 8, j, 'white');
        }
    }
    
    // 等待玩家进入
    while (world.querySelectorAll('player').length < MIN_PLAYERS) {
        world.say('等待其他玩家加入...');
        await sleep(1000);
        world.say('2个玩家立即开始');
        await world.nextPlayerJoin();
    }

    // 足够玩家加入后,就开始倒计时
    for (let i = 3; i > 0; --i) {
        world.say(i + '...');
        await sleep(1000);
    }
    world.say('游戏开始!');
    putb()
    
    // 每局都随机打乱队伍
    const players = shuffle(world.querySelectorAll('player'));
    
    // 设置玩家的颜色、分值和初始位置
    function setTeam (p, t) {
        p.player.color.r = t.r;
        p.player.color.g = t.g;
        p.player.color.b = t.b;
        p.position.x = Math.random() * GRID_X;
        p.position.y = 30;
        p.position.z = Math.random() * GRID_Z;
        //新加了一个v的私人变量,用于下面的判断
        p.player.v = t.v;
        //初始化分数
        p.player.Len = 1
        //初始化身体
        p.player.All = []
    }

    // 获得初始团队
    const teams = players.map((p, i) => {
        //console.log("t初始化开始");
        t = TEAMS[i % TEAMS.length]
        setTeam(p, t);
        //console.log("t : " + t);
        return t;
    })
    //console.log("t初始化完毕");
    
    //当玩家接触到地面任意方块时,更新该方块的颜色
    const contactHandler = world.onVoxelContact(({voxel, entity, x, y, z }) => {
        //获得该玩家的索引idx:从所有的玩家列表中获得第一个(唯一一个)符合条件的玩家)
        //调用私人变量时要用entity.player.xxx
        const idx = players.indexOf(entity);
        if (idx < 0) {
            //indexOf返回-1时表明未找到
            return;
        }
        //console.log(entity.player.name + "的颜色为" + entity.player.v);
        if (voxel === voxels.id('black')){
            //如果染色的方块为black(食物)
            entity.player.Len ++ ;
            //console.log(entity.player.name + "的Len增加为 : " + entity.player.Len)
            //向列表末尾添加染色方块的位置
            entity.player.All[entity.player.All.length] = [x, y, z];
        } 
        else if (voxel === voxels.id('white')){
            //如果染色的方块为white(空地)
            //向列表末尾添加染色方块的位置
            entity.player.All[entity.player.All.length] = [x, y, z];
            //console.log(entity.player.name + "的列表增加 : " + entity.player.All[0][0] + " " +entity.player.All[0][1] + " " + entity.player.All[0][2])
            //将列表第一项填充为white(末尾减少)
            //console.log("填充前的列表" + entity.player.All)
            voxels.setVoxelId(entity.player.All[0][0], entity.player.All[0][1], entity.player.All[0][2], voxels.id('white'));
            //console.log("填充后的方块" + voxels.name(voxels.getVoxel(entity.player.All[0][0], entity.player.All[0][1], entity.player.All[0][2])));
            //console.log("填充后的列表" + entity.player.All)
            if (entity.player.All.length != 1){
                //喵也不知道哪来的BUG
                entity.player.All.shift()
            }
            //第一项:entity.player.All[-(entity.player.Len + 1)]
            //console.log("删除后的列表" + entity.player.All)
        } 
        else if (voxel === entity.player.v){
            //console.log(entity.player.name + "踩到了自己颜色")
            //如果染色的方块为自己的颜色(遗留痕迹)
            //向列表末尾添加染色方块的位置
            entity.player.All[entity.player.All.length] = [x, y, z];
            //console.log(entity.player.name + "的列表增加 : " + entity.player.All[0][0] + " " +entity.player.All[0][1] + " " + entity.player.All[0][2])
            //将列表第一项填充为white(末尾减少)
            //console.log("填充前的列表" + entity.player.All)
            voxels.setVoxelId(entity.player.All[0][0], entity.player.All[0][1], entity.player.All[0][2], voxels.id('white'));
            //console.log("填充后的方块" + voxels.name(voxels.getVoxel(entity.player.All[0][0], entity.player.All[0][1], entity.player.All[0][2])));
            //console.log("填充后的列表" + entity.player.All)
            if (entity.player.All.length != 1){
                //喵也不知道哪来的BUG
                entity.player.All.shift()
            }
            //第一项:entity.player.All[-(entity.player.Len + 1)]
            //console.log("删除后的列表" + entity.player.All)
        } 
        else{
            //如果染色的方块不为black、white或自己的颜色(其他人)
            //获取目标(将要被染色)的方块
            mubiao = voxels.getVoxel(x,y,z);
            //console.log(entity.player.name + "踩到了" + voxels.name(mubiao));
            //console.log("踩到的方块:"+ voxel)
            //console.log("自己的颜色:" + entity.player.v)
            for(i=0; i<TEAMS.length; i++){
                //遍历查找该队
                if (mubiao === TEAMS[i].v){
                    //console.log("当前共喵 + players.length + "人")
                    for(let j=0; j<players.length; j++){
                        //遍历查找属于这个队伍的玩家
                        /*console.log("j为" + j)
                        console.log("players为" + players)
                        console.log("players[j].isPlayer为" + players[j].isPlayer)
                        console.log("players[j].player.name为" + players[j].player.name)
                        console.log("players[j].player.v为" + players[j].player.v)*/
                        //players[j].cameraMode = 'fps'
                        if (players[j].player.v == mubiao){
                            //console.log(players[j].player.name + "与目标方块颜色相匹配")
                            //如果颜色相匹配
                            //players[j].player.forceRespawn()
                            players[j].position.x = Math.random() * GRID_X;
                            players[j].position.y = 30;
                            players[j].position.z = Math.random() * GRID_Z;
                            //GO DIETH!
                            restart(players[j])
                            
                        };
                    };

                };
            };
            
            //向列表末尾添加染色方块的位置
            entity.player.All[entity.player.All.length] = [x, y, z];
            //console.log(entity.player.name + "的列表增加 : " + entity.player.All[0][0] + " " +entity.player.All[0][1] + " " + entity.player.All[0][2])
            //将列表第一项填充为white(末尾减少)
            //console.log("填充前的列表" + entity.player.All)
            voxels.setVoxelId(entity.player.All[0][0], entity.player.All[0][1], entity.player.All[0][2], voxels.id('white'));
            //console.log("填充后的方块" + voxels.name(voxels.getVoxel(entity.player.All[0][0], entity.player.All[0][1], entity.player.All[0][2])));
            //console.log("填充后的列表" + entity.player.All)
            if (entity.player.All.length != 1){
                //喵也不知道哪来的BUG
                entity.player.All.shift()
            }
            //第一项:entity.player.All[-(entity.player.Len + 1)]
            //console.log("删除后的列表" + entity.player.All)

        }
        const t = teams[idx];
        voxels.setVoxelId(x, y, z, t.v);
    });

    world.onVoxelSeparate(({entity}) => {
        //当有玩家停止接触方块(即有可能掉出虚空)
        if(entity && entity.isPlayer){
            //console.log("entity.position['y']为" + entity.position['y'])
            //console.log("entity.position['y'] < 9为" + (entity.position['y'] < 9))
            if(entity.position['y'] < 9){
                //如果y坐标小于9(玩家是10)
                console.log(entity.player.name + "y坐标小于9")
                restart(entity);
                //GO DEATH!
            }
        }
    });


    // 新玩家加入,会被随机分配到一个队伍
    const joinHandler = world.onPlayerJoin(({entity}) => {
        const t = TEAMS[(Math.random() * teams.length) | 0];
        setTeam(entity, t);
        teams.push(t);
        players.push(entity)
    });
    
    // 每局游戏会在计时到达时结束。
    const endTick = world.currentTick + ROUND_TIME;

    //每隔2秒会出现一个方块(食物)
    
    // 检测游戏是否进行中
    function gameInProgress () {
        let numActivePlayers = 0;
        for (let i = 0; i < players.length; ++i) {
            if (!players[i].destroyed) {
                numActivePlayers += 1;
            }
        }
        return world.currentTick < endTick && numActivePlayers >= MIN_PLAYERS;
        //返回一布尔值,是否游戏中
    }
    
    
    // 当游戏结束时
    while (gameInProgress()) {
        // 等待 1 Tick
        await world.nextTick();
    }
        
        
    // 计算各队伍的分数
    for (let i = 0; i < TEAMS.length; ++i) {
        //遍历各队伍计算分数
        for (let j = 0; j < players.length; j++){
            //遍历各玩家,找出这一个队伍的
            //console.log("players[j].player.v为" + players[j].player.v)
            //console.log("TEAMS[i].v为" + TEAMS[i].v)
            if (players[j].player.v == TEAMS[i].v){
                //如果该玩家颜色与该队伍颜色一样
                TEAMS[i].score += players[j].player.Len;
                console.log(players[j].player.name + "的队伍是" + voxels.name(players[j].player.v) + ",自己的分数是" + players[j].player.Len + "队伍的分数是" + TEAMS[i].score)
                //console.log(TEAMS)
                //将队伍分数加上该玩家分数
            }
        }
        //const c = TEAMS[i].score = fillHoles(TEAMS[i].v);
            
        // 如果有团队圈完全场,那么直接胜出
        //if (c >= GRID_X * GRID_Z) {
        //    break;
        //}
    }
    // 清除事件处理器
    contactHandler.cancel();
    joinHandler.cancel();

    // 重置玩家颜色
    for (let i = 0; i < players.length; ++i) {
        const c = players[i].player.color;
        c.r = c.g = c.b = 1;
    }
    world.say('本局游戏结束!');
    await sleep(5000);

    // 宣布获胜队伍
    /*for(let i=0; i<players.length; i++){
        console.log(players[i].player.name + "的队伍是" + voxels.player.name(players[i].v) + ",分数是" + players[i].player.Len)
    }*/
    TEAMS.sort((a, b) => b.score - a.score);
    world.say(`恭喜 ${TEAMS[0].n} 胜利!!`);
    await sleep(10000);
    for(let i=0;i<TEAMS.length;i++ ){
        TEAMS[i].score = 0
    }
   
}

// 无限循环游戏
async function gameLoop () {
    while (true) {
        await startGame();    
    }
}

async function putb(){
    //刷黑方块
    voxels.setVoxelId((Math.random() * GRID_X), 8, (Math.random() * GRID_Z), voxels.id('black'));
    await sleep(BLACK_TIME)
    putb()
};

async function restart(f_player){
    console.log(f_player.player.name + "喵了")
    f_player.player.Len = 1;
    f_player.player.All = []
    for(let ij=0; ij<GRID_X; ij++){
        //通过遍历还原所有方块
        //骂骂咧咧:console.log("开始还原初始化")
        for(let ji=0; ji<GRID_Z; ji++){
            //c我电脑要炸了,*龙门粗口*:console.log(ij+ "," +ji)
            if(voxels.getVoxel(ij,8,ji) == f_player.player.v){
                //如果该方块为该玩家的颜色
                //s**t:console.log("开始还原颜色")
                voxels.setVoxelId(ij, 8, ji, voxels.id('black'));
            };

        };
                                
    };
}

gameLoop();

建议配合原《圈地之王》代码查看异同之处,下面说一下基本原理:

①将玩家行走过的方块全部添加到一个列表中(All),只要根据他目前的长短(Len),还原指定的方块即可

②当自己触碰到其他颜色的方块时,遍历全方块查找该颜色,替换为black

能看懂最好,看不懂就看不懂吧emotion_doge当然你要有什么不懂的地方也可以在评论区里问我,我尽可能的回答

以下是几点改进方向,也给想要二次创作的人们提出几点建议:

①可不可以更改一下玩家的视角,更加真实地还原这个游戏

②可不可以加一些障碍(比如地雷、树木等),增加难度与趣味性

③可不可以让玩家尾迹被触碰后,只是让自己的方块还原,而不是让一队的人都跟着陪葬

④可不可以局部代码优化(比如本人就用不惯forEach,基本都是用的for……)

⑤……

(PS:如有意见,还请多多提出啊,我们一起改进交流~)


回复

上一页第 1 页 / 共 1 页下一页
嗯哼君 渠源嗯哼君 渠源

原谅我的多次console,我有个坏习惯就是不喜欢删去,而是直接加上//emotion_doge

点赞0


评论

等明天再把代码简洁一下,重新发评论区

nb!!!!!!!A


未命名用户015734未命名用户015734

哇大佬(>_<)(某澜正在尝试自荐,但某法不理我QwQ)

点赞0


评论

加油啊2333

(/≧▽≦)/(虽然某法到现在了还没理我)

(某法貌似不在线)

(敢问写作喵QQ号,某法叫我去找写作喵……)

409840512

跪谢


鸽者无罪鸽者无罪

大佬nb

点赞0


评论


如意喵如意喵

顶帖emotion_雷电猴_举手

点赞0


评论


老葵老葵

大佬……

点赞0


评论


嗯哼君 渠源嗯哼君 渠源

 

 

最终精简版:

console.log("Link Start!");//桐老爷专属水印[doge]

const SECONDS_PER_TICK = 1000 / 128; 
const ROUND_TIME = 200 * SECONDS_PER_TICK;//每局游戏时长
const MIN_PLAYERS = 2;//玩家数量下限
const BLACK_TIME = 250 //刷新黑方块的时间,默认一秒钟4个
const GRID_X = 128;//两个都是地图边界
const GRID_Z = 128;
var t;
world.gravity *= 10;

const TEAMS = [
    { r: 1, g: 0, b: 0, v: voxels.id('red_light'),      n: '红队',       score: 0, },
    { r: 0, g: 1, b: 0, v: voxels.id('green_light'),    n: '绿队',     score: 0, },
    { r: 0, g: 0, b: 1, v: voxels.id('blue_light'),     n: '蓝队',      score: 0, },
    { r: 1, g: 0, b: 1, v: voxels.id('purple'),         n: '紫队',   score: 0, },
    { r: 0, g: 1, b: 1, v: voxels.id('indigo_light'),   n: '青队',      score: 0, },
    { r: 1, g: 1, b: 0, v: voxels.id('yellow_light'),   n: '黄队',    score: 0, },
];


world.onPlayerJoin(({ entity }) => {
    //初始化各参数
    entity.player.Len = 1
    //因为刚开始玩家就有一条尾迹,所以说不是0而是1
    entity.player.All = []
    //因为尾迹的添加是在触碰后再添加的,所以说目前为空列表
});

// 辅助函数,用于随机打乱一个数组(未魔改)
function shuffle (array) {
    for (let i = 1; i < array.length; ++i) {
        const temp = array[i];
        const x = (Math.random() * (i + 1)) | 0;
        array[i] = array[x];
        array[x] = temp;
    }
    return array;
}

async function startGame () {
    // 将地面初始化,全部变成white
    for (let j = 0; j < GRID_Z; ++j) {
        for (let i = 0; i < GRID_X; ++i) {
            voxels.setVoxel(i, 8, j, 'white');
        }
    }
    
    // 等待玩家进入(未魔改)
    while (world.querySelectorAll('player').length < MIN_PLAYERS) {
        world.say('等待其他玩家加入...');
        await sleep(1000);
        world.say('2个玩家立即开始');
        await world.nextPlayerJoin();
    }

    // 足够玩家加入后,就开始倒计时(未魔改)
    for (let i = 3; i > 0; --i) {
        world.say(i + '...');
        await sleep(1000);
    }
    world.say('游戏开始!');
    putb()
    //putb()即"put black",用于随机放置黑色方块
    
    // 每局都随机打乱队伍(喵)
    const players = shuffle(world.querySelectorAll('player'));
    
    // 设置玩家的颜色、分值和初始位置
    function setTeam (p, t) {
        p.player.color.r = t.r;
        p.player.color.g = t.g;
        p.player.color.b = t.b;
        p.position.x = Math.random() * GRID_X;
        p.position.y = 30;
        p.position.z = Math.random() * GRID_Z;
        //新加了一个v的私人变量(储存他的颜色),用于下面的队伍判断
        p.player.v = t.v;
        //初始化分数(似乎有点多余了?但也不敢随意删去hhhc)
        p.player.Len = 1
        //初始化身体(似乎有点多余了?但也不敢随意删去hhhc)
        p.player.All = []
    }

    // 获得初始团队(未魔改……吧)
    const teams = players.map((p, i) => {
        t = TEAMS[i % TEAMS.length]
        setTeam(p, t);
        return t;
    })
    
    //当玩家接触到地面任意方块时,更新该方块的颜色
    const contactHandler = world.onVoxelContact(({voxel, entity, x, y, z }) => {
        //获得该玩家的索引idx:从所有的玩家列表中获得第一个(唯一一个)符合条件的玩家)
        //调用私人变量时要用entity.player.xxx
        const idx = players.indexOf(entity);
        if (idx < 0) {
            //indexOf返回-1时表明未找到
            return;
        }
        if (voxel === voxels.id('black')){
            //如果染色的方块为black(食物)
            entity.player.Len ++ ;
            //长度增加
            entity.player.All[entity.player.All.length] = [x, y, z];
            //向列表末尾添加染色方块的位置
            //因为他会让玩家变长,所以说不用删除末尾的方块(举个例子:大家都在退步,你不退步就是进步)
        } 
        else if (voxel === voxels.id('white')){
            //如果染色的方块为white(空地)
            //向列表末尾添加染色方块的位置
            entity.player.All[entity.player.All.length] = [x, y, z];
            //将列表第一项填充为white(末尾减少)
            voxels.setVoxelId(entity.player.All[0][0], entity.player.All[0][1], entity.player.All[0][2], voxels.id('white'));
            if (entity.player.All.length != 1){
                //喵也不知道哪来的BUG
                entity.player.All.shift()
            }
            //之前用的第一项,看不懂忽略即可:entity.player.All[-(entity.player.Len + 1)]
        } 
        else if (voxel === entity.player.v){
            //如果染色的方块为自己的颜色(遗留痕迹/尾迹)
            //向列表末尾添加染色方块的位置
            entity.player.All[entity.player.All.length] = [x, y, z];
            //将列表第一项填充为white(尾迹减少)
            voxels.setVoxelId(entity.player.All[0][0], entity.player.All[0][1], entity.player.All[0][2], voxels.id('white'));
            if (entity.player.All.length != 1){
                //同上,喵也不知道哪来的BUG
                entity.player.All.shift()
            }
            //同上,第一项:entity.player.All[-(entity.player.Len + 1)]
        else{
            //如果染色的方块不为black、white或自己的颜色(其他人)
            //获取目标(将要被染色)的方块
            mubiao = voxels.getVoxel(x,y,z);
            for(i=0; i<TEAMS.length; i++){
                //遍历查找该队
                if (mubiao === TEAMS[i].v){
                    for(let j=0; j<players.length; j++){
                        //遍历查找属于这个队伍的玩家
                        if (players[j].player.v == mubiao){
                            //如果颜色相匹配(与上方的player.v相对应)
                            players[j].position.x = Math.random() * GRID_X;
                            players[j].position.y = 30;
                            players[j].position.z = Math.random() * GRID_Z;
                            //GO DIETH!
                            restart(players[j])
                            
                        };
                    };

                };
            };
            
            //向列表末尾添加染色方块的位置
            entity.player.All[entity.player.All.length] = [x, y, z];
            //将列表第一项填充为white(末尾减少)
            if (entity.player.All.length != 1){
                //喵也不知道哪来的BUG×3
                entity.player.All.shift()
            }

        }
        const t = teams[idx];
        voxels.setVoxelId(x, y, z, t.v);
    });

    world.onVoxelSeparate(({entity}) => {
        //当有玩家停止接触方块(即有可能掉出虚空)
        if(entity && entity.isPlayer){
            if(entity.position['y'] < 9){
                //如果y坐标小于9(玩家是10)
                restart(entity);
                //GO DEATH!
            }
        }
    });


    // 新玩家加入,会被随机分配到一个队伍(未魔改)
    const joinHandler = world.onPlayerJoin(({entity}) => {
        const t = TEAMS[(Math.random() * teams.length) | 0];
        setTeam(entity, t);
        teams.push(t);
        players.push(entity)
    });
    
    // 每局游戏会在计时到达时结束。(未魔改)
    const endTick = world.currentTick + ROUND_TIME;
    
    // 检测游戏是否进行中(未魔改)
    function gameInProgress () {
        let numActivePlayers = 0;
        for (let i = 0; i < players.length; ++i) {
            if (!players[i].destroyed) {
                numActivePlayers += 1;
            }
        }
        return world.currentTick < endTick && numActivePlayers >= MIN_PLAYERS;
        //返回一布尔值,是否游戏中
    }
    
    
    // 当游戏结束时(未魔改)
    while (gameInProgress()) {
        // 等待 1 Tick
        await world.nextTick();
    }
        
        
    // 计算各队伍的分数(其实就是把一队的玩家的Len加起来)
    for (let i = 0; i < TEAMS.length; ++i) {
        //遍历各队伍计算分数
        for (let j = 0; j < players.length; j++){
            //遍历各玩家,找出这一个队伍的
            if (players[j].player.v == TEAMS[i].v){
                //如果该玩家颜色与该队伍颜色一样
                TEAMS[i].score += players[j].player.Len;
                //将队伍分数加上该玩家分数
            }
        }
    }
    // 清除事件处理器(未魔改,似乎还要把putb.cancel()加上的,但咱也不敢动(小心翼翼))
    contactHandler.cancel();
    joinHandler.cancel();

    // 重置玩家颜色(未魔改)
    for (let i = 0; i < players.length; ++i) {
        const c = players[i].player.color;
        c.r = c.g = c.b = 1;
    }
    world.say('本局游戏结束!');
    await sleep(5000);

    // 宣布获胜队伍(未魔改)
    TEAMS.sort((a, b) => b.score - a.score);
    world.say(`恭喜 ${TEAMS[0].n} 胜利!!`);
    await sleep(10000);
    for(let i=0;i<TEAMS.length;i++ ){
        TEAMS[i].score = 0
    }
   
}

// 无限循环游戏(未魔改)
async function gameLoop () {
    while (true) {
        await startGame();    
    }
}

async function putb(){
    //刷黑方块
    voxels.setVoxelId((Math.random() * GRID_X), 8, (Math.random() * GRID_Z), voxels.id('black'));
    await sleep(BLACK_TIME)
    putb()
    //无限套娃喵好!(滑稽)
};

async function restart(f_player){
//用于处理当玩家喵后的还原(包括掉下虚空与被别人触碰尾迹,似乎可以用forEach重构的)
    console.log(f_player.player.name + "喵了")
    f_player.player.Len = 1;
    f_player.player.All = []
    for(let ij=0; ij<GRID_X; ij++){
        //通过遍历还原所有方块
        for(let ji=0; ji<GRID_Z; ji++){
            //c我电脑要炸了,*龙门粗口*,谁想试试就把注释符号删去:console.log(ij+ "," +ji)
            if(voxels.getVoxel(ij,8,ji) == f_player.player.v){
                //如果该方块为该玩家的颜色
                //s**t:console.log("开始还原颜色")
                voxels.setVoxelId(ij, 8, ji, voxels.id('black'));
            };

        };
                                
    };
}

gameLoop();

点赞2


评论

666


NobelNobel

awa

点赞0


评论


硫酸QwQ硫酸QwQ

(js萌新瑟瑟发抖)

点赞0


评论

不不不,你知不知道,我当初看API的时候,就仿佛在学另外一种新的语言体系hhhc

我觉得JS很像C++,只不过没有头文件而已罢了


猫悟淡猫悟淡

渠源大大NB!

点赞0


评论

没有没有,都是站在巨人的肩膀上2333(Python名言)

哈哈


高贵的木叶龙A35d高贵的木叶龙A35d

顶顶顶

点赞0


评论


渐离咕咕咕咕渐离咕咕咕咕

就好奇下大佬在哪里自学的js...

点赞0


评论

要是光玩玩岛3的话,js看看那些“菜鸟教程”之类的就行了。最重要的还是API,这个就仿佛是学另外一种语言体系了……(没人教,而且没有教程,全靠你的悟性和死磕hhhc)


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

收藏

点赞0


评论

这不正好可以加到创作节码()))


小树同学小树同学

收藏

点赞0


评论


墨染云天墨染云天

imgsrc="https://static.codemao.cn/emoji/codemao/%E7%BC%96%E7%A8%8B%E7%8C%AB_%E7%82%B9%E8%B5%9E.gif"alt="emotion_编程猫_点赞"

点赞0


评论


alopdopsalopdops

fxfgx

点赞0


评论