用户:
神岛吉吉喵查看:9859 回复:150 评论:163 创建时间:2020-02-25T18:50:39
吉吉喵今天
新鲜发布的地图
《圈地之王》
你玩了吗?
圈地为王
占地最多者胜!
🔰立即游玩🔰
https://box喵lay.codemao.cn/games/ead7872ef71喵958ef14
全图没加方块
也无模型
究竟怎么做出来的呢?

下面将代码全部揭秘
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();
从上面的代码
你解读到了什么信息?
下面
是吉吉喵给你的挑战
基于这份代码
你能做出
新的圈地之王吗?
任何创新都可以!
属于你的
圈地之王
希望你做出创新后
也接力
将你的代码发布出来!

📘相关阅读
- 如何设置出生点 https://shequ.codemao.cn/community/243385
- 如何将地面全部变成水 https://shequ.codemao.cn/community/242753
- 如何做出透明方块&隐形墙 https://shequ.codemao.cn/community/250211
🏍加入代码岛3.0内测Q群:
478041977
// 如果有团队圈完全场,那么直接胜出
圈完全场……这个队得有多么恐怖……
点赞0
评论
对了对于我连胜好几局被人说:哪有带这样玩的。的这事你看法怎样??我很牛 逼吧
就1个人。队友全挂机,我搞的满屏彩,1人顶3人,牛不牛啊
我今天也玩了个全图圈,太好玩了喵
+1
我之前分到2个队友,加我三人,本以为能有人帮忙,于是去圈全场,结果那两人都是挂机的……
我用手机的,如果要这么圈,难以控制方向,容易掉下去
新手教程:凌晨一点玩,你绝对会赢
点赞0
评论
那有意思吗
非常的有意思
不怕
什么不怕?
凌晨一点都没有人,好像代码写着要等2个人才能开始
请自己小号来(滑稽)
现在更新了,两个人玩才可以
两个人玩,一个人掉线了,你一定会赢
鬼会掉线
吉吉喵吉吉喵吉吉喵吉吉喵!!!!有Bug有Bug有Bug有Bug!!!!
点赞1
评论
我刚刚中途进入游戏,结果发现我被分到紫队,尾迹却是靛蓝色的!有时候不会分组(小小声)
(画外音:你觉得吉吉喵会回吗)我个人觉得不会(此时的吉吉喵:我有说我不回吗!)但是你每次遇到Bug确定不是交给技术喵吗?(此时的吉吉喵:(一片死寂))所以吉吉喵……充当代码岛吉祥物杠杠的!(此时的吉吉喵:(一片死寂))(画外音:你确定吉吉喵不会打你吗?)诶诶诶你说得对呀喵!为了防止吉吉喵咬人先溜了~
我也试过类似的,中途加入游戏,明明是红色,可脚下的却是靛蓝色
Bug又出现了!前方报告说分到的靛蓝色组结果画出了黄色线条?
发现我可以……(坏笑)
(此时的吉吉喵:你你你!能玩就行别废话(滑稽))咳咳咳咳,吉吉喵修Bug咻!(此时的吉吉喵:揪Bug你们拿手,玩也是你们开心,吉吉喵心里苦呀)emmmmmm……(顿时没话)(此时的吉吉喵:我还不是熬夜联系技术喵修Bug用QQ发代码给本吉吉喵呀喵)吉吉喵别熬夜(滑稽)
???
什么可以?
可以编剧本(滑稽)
……………………服了……………………
我也遇到过
我明明是绿的,可是我脚下的方块是红的
+111
进不去啊
点赞0
评论
+1
+1
简直喵,每代码岛作品都进不去
对啊
代码岛又卡BUG了
111
在线等吉吉喵
我只能等到十点
就睡觉了
刚刚到我的编辑器里看了一下,作品全消失了(幸好我之前新建地图只是玩玩,不做项目)
现在可以进去了,但代码好像全丢了,游戏根本玩不了
🧬
点赞0
评论
🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬 🧬
最近代码岛3.0也出问题了