마인크래프트 에듀케이션 에디션을 활용한 수업, 특히 픽셀아트나 개별 건축 수업을 진행해 보신 선생님이시라면 누구나 공감하실 고민이 있습니다. 바로 "학생들이 서로의 영역을 침범하거나, 실수로 바닥과 경계선을 부수는 문제"입니다.
오늘은 이런 고민을 한 번에 해결해 줄 '10x10 절대 파괴 불가 개인 캔버스' 자동 생성 자바스크립트 코드를 소개합니다. 채팅창에 명령어 하나만 입력하면 25명의 학생이 안전하게 작업할 수 있는 공간이 1초 만에 만들어집니다!
왜 이 코드가 필요한가요?
이 코드는 초등학교 중학년 학생들을 대상으로 한 코딩 및 미술 통합 수업을 위해 맞춤 제작되었습니다. 학급 관리 도구를 자동화하여 선생님의 수업 준비 시간을 획기적으로 줄여줍니다.
주요 기능 및 특징
완벽한 물리적 보호 (Griefing 방지): * 경계선과 바닥 기초는 암반(ID 7)과 거부 블록(ID 211)으로 겹겹이 쌓여 있습니다. 서바이벌 모드의 학생들은 절대 친구의 영역이나 경계선을 파괴할 수 없습니다.
안전한 자유 편집 구역:
각 구역의 내부 바닥(-2 좌표)에는 허용 블록(ID 210)이 깔려 있습니다. 학생들은 이 블록 위(10x10 크기의 흰색 양털 캔버스)에서만 자유롭게 블록을 설치하고 부수며 픽셀아트를 즐길 수 있습니다.
직관적인 시각적 안내:
1번부터 25번까지의 자리 번호가 각 캔버스 바닥에 석탄 블록(ID 173)으로 명확하게 새겨져 있어, 학생들이 자신의 자리를 쉽게 찾을 수 있습니다.
안정성 최적화: * 버전 차이로 인한 명칭(Name) 오류를 방지하기 위해 가장 안정적인 숫자 ID 방식으로 작성되었습니다.
메이크코드(MakeCode) 자바스크립트
마이크로소프트 메이크코드의 자바스크립트 탭에 아래 코드를 그대로 복사하여 붙여넣기만 하면 됩니다. 게임 내 채팅창에 grid라고 입력하면 즉시 5x5(총 25개) 형태의 캔버스가 생성됩니다.
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);
}
}
이제 수업 시간마다 학생들이 울상을 지으며 "선생님, 친구가 제 블록 부쉈어요!"라고 외치는 일은 없을 것입니다. 안정적이고 쾌적한 환경에서 아이들의 멋진 픽셀아트 작품들이 탄생하기를 기대합니다!