猫史档案馆


🧬【源代码全公开!】圈地之王开发接力挑战

用户:神岛吉吉喵神岛吉吉喵查看:9859 回复:150 评论:163 创建时间:2020-02-25T18:50:39


center_image

吉吉喵今天

新鲜发布的地图

《圈地之王》

你玩了吗?

圈地为王

占地最多者胜!

🔰立即游玩🔰

https://box喵lay.codemao.cn/games/ead7872ef71喵958ef14

 

全图没加方块

也无模型

 

究竟怎么做出来的呢?

emotion_编程猫_紧张

下面将代码全部揭秘

const SECONDS_PER_TICK = 1000 / 128; 
const ROUND_TIME = 200 * SECONDS_PER_TICK;//每局游戏时长
const MIN_PLAYERS = 2;//玩家数量下限
const GRID_X = 128;
const GRID_Z = 128;

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, },
];

// 辅助函数,用于随机打乱一个数组
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 () {
    // 将地面初始化,全部变成不锈钢
    for (let j = 0; j < GRID_Z; ++j) {
        for (let i = 0; i < GRID_X; ++i) {
            voxels.setVoxel(i, 8, j, 'stainless_steel');
        }
    }
    
    // 等待玩家进入
    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('去圈地吧!看谁是圈地之王?');
    
    // 每局都随机打乱队伍
    const players = shuffle(world.querySelectorAll('player'));
    shuffle(TEAMS);
    
    // 设置玩家的颜色和初始位置
    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;
    }

    // 获得初始团队
    const teams = players.map((p, i) => {
        const t = TEAMS[i % TEAMS.length]
        setTeam(p, t);
        return t;
    })
    
    //当玩家接触到地面任意方块时,更新该方块的颜色
    const contactHandler = world.onVoxelContact(({ entity, x, y, z }) => {
        const idx = players.indexOf(entity);
        if (idx < 0) {
            return;
        }
        const t = teams[idx];
        voxels.setVoxelId(x, y, z, t.v);
    });
    
    // 新玩家加入,会被随机分配到一个队伍
    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;
    }
    
    // 通过深度优先搜索,将圈起来的地自动填色
    const visited = new Uint8Array(GRID_X * GRID_Z)
    const toVisit = []
    function mark (i, j, team) {
        const idx = i + j * GRID_X;
        if (i < 0 || i >= GRID_X ||
            j < 0 || j >= GRID_Z ||
            visited[idx] ||
            voxels.getVoxel(i, 8, j) === team) {
            return;
        }
        visited[idx] = true;
        toVisit.push(i, j);
    }
    function fillHoles (team) {
        visited.fill(0);
        for (let i = 0; i < Math.max(GRID_X, GRID_Z); ++i) {
            mark(i, 0, team);//更正了,将8改成了0
            mark(0, i, team);
            mark(GRID_X - 1, i, team);
            mark(i, GRID_Z - 1, team);
        }
        
        while (toVisit.length > 0) {
            const z = toVisit.pop() | 0;
            const x = toVisit.pop() | 0;
            mark(x - 1, z, team);
            mark(x + 1, z, team);
            mark(x, z - 1, team);
            mark(x, z + 1, team);
        }
        
        let score = 0;
        for (let j = 0; j < GRID_Z; ++j) {
            for (let i = 0; i < GRID_X; ++i) {
                const idx = i + j * GRID_X;
                if (!visited[idx]) {
                    voxels.setVoxelId(i, 8, j, team);
                    score += 1;
                }
            }
        }
        return score;
    }
    
    // 当游戏运行时
    while (gameInProgress()) {
        // 等待 1 Tick
        await world.nextTick();
        
        // 计算各队伍的分数
        for (let i = 0; i < TEAMS.length; ++i) {
            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);
    
    // 宣布获胜队伍
    TEAMS.sort((a, b) => b.score - a.score);
    world.say(`恭喜 ${TEAMS[0].n} 成为圈地之王!!`);
    await sleep(10000);
}

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

从上面的代码

你解读到了什么信息?

 

下面

是吉吉喵给你的挑战

 

基于这份代码

你能做出

新的圈地之王吗?

 

任何创新都可以!

属于你的

圈地之王

 

希望你做出创新后

也接力

将你的代码发布出来!

emotion_编程猫_加油

 

📘相关阅读

- 如何设置出生点 https://shequ.codemao.cn/community/243385

- 如何将地面全部变成水 https://shequ.codemao.cn/community/242753

- 如何做出透明方块&隐形墙 https://shequ.codemao.cn/community/250211

 

🏍加入代码岛3.0内测Q群:

478041977


回复

上一页第 1 页 / 共 5 页下一页
面具狐狸云绾兮面具狐狸云绾兮

沙发

点赞0


评论

认证

吉吉喵,我做了一个分服,因为那里人太多了!会卡的,

并不是创新

只是太卡了,所以发了个分服

对了,吉吉喵什么时候出故宫开车的代码?有急用,在线等,急


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

沙发,外卖,RPG

点赞0


评论


阳光的流熔怪Uyt5阳光的流熔怪Uyt5

地板!

点赞0


评论


神岛吉吉喵神岛吉吉喵

我的天!这代码里面,竟然有词语被屏蔽了!!!

点赞0


评论

已更新,应该没事了

这说明编程猫的屏蔽词有多么恐怖(滑稽)

是m(屏蔽词专属分割)d还是t(屏蔽词专属分割)m?

哈哈

tm

md

喵

喵泥马


名字是什么a名字是什么a

emotion_编程猫_厉害了

点赞0


评论


芜湖咸鱼芜湖咸鱼

我的科普贴竟然在吉吉的帖子里!

点赞0


评论

…………

哈哈!


芜湖咸鱼芜湖咸鱼

bug一大堆...

点赞0


评论


皮家族小跟班皮皮柴皮家族小跟班皮皮柴

https://superhex.io

这个好像是另一个网页版

点赞0


评论


安歌兴业安歌兴业

我太难了

点赞0


评论


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

// 如果有团队圈完全场,那么直接胜出

圈完全场……这个队得有多么恐怖……

点赞0


评论

对了对于我连胜好几局被人说:哪有带这样玩的。的这事你看法怎样??我很牛 逼吧

就1个人。队友全挂机,我搞的满屏彩,1人顶3人,牛不牛啊

我今天也玩了个全图圈,太好玩了喵

+1

我之前分到2个队友,加我三人,本以为能有人帮忙,于是去圈全场,结果那两人都是挂机的……

我用手机的,如果要这么圈,难以控制方向,容易掉下去


蕉饼蕉饼

哇啊啊啊啊啊

点赞0


评论


蕉饼蕉饼

吉吉喵,你是不是模仿了splix.io了?

点赞0


评论

经典io游戏玩法-圈地

吉吉喵你知道雷电猴去哪了吗?


神岛吉吉喵神岛吉吉喵

有人报告说代码有bug

存在圈地不补全的问题

你觉得哪一句出错了?

点赞0


评论

已修复

你前天的事我还没和你说完!我辛辛苦苦搭的四面墙啊!


编码已破译编码已破译

我啥我不能把地板染色?

点赞0


评论


传闻中的五音璃音传闻中的五音璃音

喵喵~

点赞0


评论

求求让我跟你录制

可以(滑稽)

em………

hi

女猴~


爱打扮的草灵灵爱打扮的草灵灵

新手教程:凌晨一点玩,你绝对会赢

点赞0


评论

那有意思吗

非常的有意思

不怕

什么不怕?

凌晨一点都没有人,好像代码写着要等2个人才能开始

请自己小号来(滑稽)

现在更新了,两个人玩才可以

两个人玩,一个人掉线了,你一定会赢

鬼会掉线


爱打扮的草灵灵爱打扮的草灵灵

吉吉喵你代码全部公开......就不怕有人抄袭吗?

点赞0


评论

别的地图可以创小游戏

代码岛你说呢?


漓花花漓花花

hh

点赞0


评论


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

吉吉喵吉吉喵吉吉喵吉吉喵!!!!有Bug有Bug有Bug有Bug!!!!

点赞1


评论

我刚刚中途进入游戏,结果发现我被分到紫队,尾迹却是靛蓝色的!有时候不会分组(小小声)

(画外音:你觉得吉吉喵会回吗)我个人觉得不会(此时的吉吉喵:我有说我不回吗!)但是你每次遇到Bug确定不是交给技术喵吗?(此时的吉吉喵:(一片死寂))所以吉吉喵……充当代码岛吉祥物杠杠的!(此时的吉吉喵:(一片死寂))(画外音:你确定吉吉喵不会打你吗?)诶诶诶你说得对呀喵!为了防止吉吉喵咬人先溜了~

我也试过类似的,中途加入游戏,明明是红色,可脚下的却是靛蓝色

Bug又出现了!前方报告说分到的靛蓝色组结果画出了黄色线条?

发现我可以……(坏笑)

(此时的吉吉喵:你你你!能玩就行别废话(滑稽))咳咳咳咳,吉吉喵修Bug咻!(此时的吉吉喵:揪Bug你们拿手,玩也是你们开心,吉吉喵心里苦呀)emmmmmm……(顿时没话)(此时的吉吉喵:我还不是熬夜联系技术喵修Bug用QQ发代码给本吉吉喵呀喵)吉吉喵别熬夜(滑稽)

???

什么可以?

可以编剧本(滑稽)

……………………服了……………………

我也遇到过

我明明是绿的,可是我脚下的方块是红的

+111


安歌1213安歌1213

emotion_编程猫_加油

点赞0


评论


蕉饼蕉饼

我队连续两次全完全场,直接胜出。。。

点赞1


评论

怎么办到的

其他人没注意的时候


TobylaiTobylai

服务器卡到主页进不去

点赞0


评论

+1

+1

难道代码岛又卡bug了?!

+1

+1

吉吉喵说代码岛服务器遭受了攻击......

对的

不知吉吉喵那怎么了


俊秀的乌力力RYeu俊秀的乌力力RYeu

进不去啊

点赞0


评论

+1

+1

简直喵,每代码岛作品都进不去

对啊

代码岛又卡BUG了

111

在线等吉吉喵

我只能等到十点

就睡觉了

刚刚到我的编辑器里看了一下,作品全消失了(幸好我之前新建地图只是玩玩,不做项目)

现在可以进去了,但代码好像全丢了,游戏根本玩不了


热情的超能鸭TCrC热情的超能鸭TCrC

我这边闪退了

点赞0


评论


一个XXX真萌新一个XXX真萌新

怎么跑?emotion_编程猫_在吗

点赞0


评论


编程猫编程猫

 🧬

点赞0


评论

🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬

最近代码岛3.0也出问题了


保守的飞叶龙oyGL保守的飞叶龙oyGL

看不懂

点赞0


评论

这就是真正的编程!


皮—卡—丘jjd皮—卡—丘jjd

估计这个要火了

点赞0


评论


皮—卡—丘jjd皮—卡—丘jjd

之前有一次我加入的是绿队,可是我脚下的方块却是红色的,咋回事?

点赞0


评论

+1

嗯嗯

+1111

我遇到了N次


皮—卡—丘jjd皮—卡—丘jjd

还有一次方块根本不跟着我

点赞0


评论

+1

我遇到了N次

+1000