초등학교 중학년 학생들을 대상으로 마인크래프트 교육용 월드에서 코딩 및 미술 통합 수업을 진행하고 있습니다. 학생들이 서로의 영역을 침범하지 않고 1인당 하나의 캔버스를 가질 수 있도록 개인별 작업 공간을 자동으로 생성하려고 합니다.
가로 5개, 세로 5개로 구성된 총 25개의 구역을 생성하는 자바스크립트 코드를 작성해 주세요. 각 구역의 크기는 10x10이어야 하며, 바닥에는 구역 번호(1~25)가 명확하게 새겨져야 합니다. 특히 학생들이 실수로 구획 선을 파괴하지 못하도록 보호 기능을 포함해야 합니다.
마이크로소프트 메이크코드(MakeCode) 자바스크립트 엔진에 최적화된 코드로 작성해 주세요. 블록의 명칭(예: WHITE_WOOL)을 직접 사용하는 대신, 버전 차이로 인한 에러를 방지하기 위해 가장 안정적인 숫자 ID 방식을 사용해 작성해 주세요.
친절하면서도, 기술적인 설명은 군더더기 없이 명확하고 전문적인 어조를 유지해 주세요.
마인크래프트 에듀케이션 에디션을 수업에 활용하며, 자바스크립트를 이용해 학급 관리 도구를 자동화하고 싶어 하는 사람이 읽을 것입니다.
player.onChat("grid", function () {
let size = 10;
let count = 5;
let totalSize = count * (size + 1) + 1;
// 1. 구획 선 및 바닥 기초 공사
for (let i = 0; i <= count; i++) {
let offset = i * (size + 1);
// [구획 선] 암반(7) 아래에 거부 블록(211)을 깔아 절대 파괴 방지
blocks.fill(211, pos(offset, -2, 0), pos(offset, -2, totalSize - 1), FillOperation.Replace);
blocks.fill(7, pos(offset, -1, 0), pos(offset, -1, totalSize - 1), FillOperation.Replace);
blocks.fill(211, pos(0, -2, offset), pos(totalSize - 1, -2, offset), FillOperation.Replace);
blocks.fill(7, pos(0, -1, offset), pos(totalSize - 1, -1, offset), FillOperation.Replace);
}
// 2. 학생 작업 공간 (허용 블록 설치)
let num = 1;
for (let z = 0; z < count; z++) {
for (let x = 0; x < count; x++) {
let startX = x * (size + 1) + 1;
let startZ = z * (size + 1) + 1;
// [핵심] 구획 안쪽 바닥에 허용 블록(210)을 설치
// 이 블록이 깔린 곳 위에서는 학생들이 자유롭게 블록을 추가/삭제할 수 있습니다.
blocks.fill(210, pos(startX, -2, startZ), pos(startX + 9, -2, startZ + 9), FillOperation.Replace);
// 캔버스용 흰색 양털 (ID: 35)
blocks.fill(35, pos(startX, -1, startZ), pos(startX + 9, -1, startZ + 9), FillOperation.Replace);
// 숫자 그리기 (석탄 블록 ID: 173)
drawRealNumber(startX + 2, startZ + 2, num);
num++;
}
}
player.say("구획은 무적! 안쪽은 자유! 격자 생성이 완료되었습니다.");
});
// 숫자 그리기 함수는 이전과 동일하게 유지됩니다.
function drawRealNumber(x: number, z: number, n: number) {
let b = 173;
if (n >= 10) {
let ten = Math.floor(n / 10);
if (ten == 1) { for(let i=0; i<5; i++) blocks.place(b, pos(x, -1, z+i)); }
else if (ten == 2) {
blocks.fill(b, pos(x, -1, z), pos(x+2, -1, z), FillOperation.Replace);
blocks.place(b, pos(x+2, -1, z+1));
blocks.fill(b, pos(x, -1, z+2), pos(x+2, -1, z+2), FillOperation.Replace);
blocks.place(b, pos(x, -1, z+3));
blocks.fill(b, pos(x, -1, z+4), pos(x+2, -1, z+4), FillOperation.Replace);
}
x += 4;
}
let digit = n % 10;
if (digit == 1) { for(let i=0; i<5; i++) blocks.place(b, pos(x+1, -1, z+i)); }
else if (digit == 2) {
blocks.fill(b, pos(x, -1, z), pos(x+2, -1, z), FillOperation.Replace);
blocks.place(b, pos(x+2, -1, z+1));
blocks.fill(b, pos(x, -1, z+2), pos(x+2, -1, z+2), FillOperation.Replace);
blocks.place(b, pos(x, -1, z+3));
blocks.fill(b, pos(x, -1, z+4), pos(x+2, -1, z+4), FillOperation.Replace);
} else if (digit == 3) {
blocks.fill(b, pos(x, -1, z), pos(x+2, -1, z), FillOperation.Replace);
blocks.place(b, pos(x+2, -1, z+1));
blocks.fill(b, pos(x, -1, z+2), pos(x+2, -1, z+2), FillOperation.Replace);
blocks.place(b, pos(x+2, -1, z+3));
blocks.fill(b, pos(x, -1, z+4), pos(x+2, -1, z+4), FillOperation.Replace);
} else if (digit == 4) {
blocks.fill(b, pos(x, -1, z), pos(x, -1, z+2), FillOperation.Replace);
blocks.place(b, pos(x+1, -1, z+2));
blocks.fill(b, pos(x+2, -1, z), pos(x+2, -1, z+4), FillOperation.Replace);
} else if (digit == 5) {
blocks.fill(b, pos(x, -1, z), pos(x+2, -1, z), FillOperation.Replace);
blocks.place(b, pos(x, -1, z+1));
blocks.fill(b, pos(x, -1, z+2), pos(x+2, -1, z+2), FillOperation.Replace);
blocks.place(b, pos(x+2, -1, z+3));
blocks.fill(b, pos(x, -1, z+4), pos(x+2, -1, z+4), FillOperation.Replace);
} else if (digit == 6) {
blocks.fill(b, pos(x, -1, z), pos(x+2, -1, z), FillOperation.Replace);
blocks.place(b, pos(x, -1, z+1));
blocks.fill(b, pos(x, -1, z+2), pos(x+2, -1, z+2), FillOperation.Replace);
blocks.place(b, pos(x, -1, z+3)); blocks.place(b, pos(x+2, -1, z+3));
blocks.fill(b, pos(x, -1, z+4), pos(x+2, -1, z+4), FillOperation.Replace);
} else if (digit == 7) {
blocks.fill(b, pos(x, -1, z), pos(x+2, -1, z), FillOperation.Replace);
for(let i=1; i<5; i++) blocks.place(b, pos(x+2, -1, z+i));
} else if (digit == 8) {
blocks.fill(b, pos(x, -1, z), pos(x+2, -1, z), FillOperation.Replace);
blocks.place(b, pos(x, -1, z+1)); blocks.place(b, pos(x+2, -1, z+1));
blocks.fill(b, pos(x, -1, z+2), pos(x+2, -1, z+2), FillOperation.Replace);
blocks.place(b, pos(x, -1, z+3)); blocks.place(b, pos(x+2, -1, z+3));
blocks.fill(b, pos(x, -1, z+4), pos(x+2, -1, z+4), FillOperation.Replace);
} else if (digit == 9) {
blocks.fill(b, pos(x, -1, z), pos(x+2, -1, z), FillOperation.Replace);
blocks.place(b, pos(x, -1, z+1)); blocks.place(b, pos(x+2, -1, z+1));
blocks.fill(b, pos(x, -1, z+2), pos(x+2, -1, z+2), FillOperation.Replace);
blocks.place(b, pos(x+2, -1, z+3));
blocks.fill(b, pos(x, -1, z+4), pos(x+2, -1, z+4), FillOperation.Replace);
} else if (digit == 0) {
blocks.fill(b, pos(x, -1, z), pos(x+2, -1, z+4), FillOperation.Outline);
}
}