Compare commits

...

10 Commits

63 changed files with 69442 additions and 825 deletions

4
.bashrc.local Normal file
View File

@@ -0,0 +1,4 @@
# 프로젝트 루트 폴더/.bashrc.local
if [ -f .venv/Scripts/activate ]; then
source .venv/Scripts/activate
fi

18
.gitignore vendored
View File

@@ -1,4 +1,22 @@
.venv/
# 기본적으로 output 디렉토리 전체 무시
output/
sample/
.DS_Store
# 시험자료와 그 하위 회차 폴더는 포함
!시험자료/
!시험자료/*/
# 기본적으로 모든 것을 무시
시험자료/*/*
# 하지만 회차 폴더 안의 파일은 다시 포함
!시험자료/*/*.*
# 모든 회차 폴더 안의 하위 폴더는 무시
시험자료/*/*/
# ent파일
ent/

View File

@@ -2,6 +2,7 @@ import os
import shutil
import unicodedata
"""
def copy_dic_subdirs(source_root, target_root_b, target_root_c):
for root, dirs, files in os.walk(source_root):
for dir_name in dirs:
@@ -26,6 +27,7 @@ def copy_dic_subdirs(source_root, target_root_b, target_root_c):
else:
print(f"Skipping {dir_name} under {parent_dir}, as it doesn't match '2교시' or '3교시'.")
"""
def copy_ent_files(source_root, target_root):
# 대상 디렉토리가 없으면 생성
@@ -34,18 +36,21 @@ def copy_ent_files(source_root, target_root):
for root, dirs, files in os.walk(source_root):
for file in files:
if file.endswith('.ent'):
space_remove_file = file.replace(" ","")
source_file_path = os.path.join(root, file)
target_file_path = os.path.join(target_root, file)
target_file_path = os.path.join(target_root, space_remove_file)
# 파일 복사
shutil.copy2(source_file_path, target_file_path)
print(f"Copied {source_file_path} to {target_file_path}")
# 사용법
source_directory = r"/Users/waterdrw/Downloads/제2502회 코딩활용능력 2급 수시4_답안파일" # 원본 디렉토리 경로
target_directory = r"./output/"
target_directory_a = r"./output/A" # '1교시'의 타겟 경로
target_directory_b = r"./output/B" # '2교시'의 타겟 경로
target_directory_c = r"./output/C" # '3교시'의 타겟 경로
source_directory = r"D:\project\data\CAS_제2510회 정기\제2510회 코딩활용능력 2급 정기 답안파일" # 원본 디렉토리 경로
target_directory = r".\ent\2510_CAS_2_A"
# target_directory_a = r"./output/A" # '1교시'의 타겟 경로
# target_directory_b = r"./output/B" # '2교시'의 타겟 경로
# target_directory_c = r"./output/C" # '3교시'의 타겟 경로
copy_ent_files(source_directory, target_directory)

View File

@@ -0,0 +1,59 @@
import os
import gzip
import tarfile
import json
from io import BytesIO
def extract_project_json_from_gz(filepath, output_folder):
# 1. .gz 압축 해제 → tar 형식 데이터 얻기
with gzip.open(filepath, 'rb') as gz_file:
tar_data = gz_file.read()
# 2. tar 데이터를 메모리에서 처리
tar_bytes = BytesIO(tar_data)
with tarfile.open(fileobj=tar_bytes, mode='r:') as tar:
try:
target = tar.getmember("temp/project.json")
except KeyError:
print(f"{os.path.basename(filepath)}: temp/project.json 없음")
return
# 압축파일 내부 temp/project.json 파일의 파일 오브젝트 추출
extracted = tar.extractfile(target)
if not extracted:
print(f"{os.path.basename(filepath)}: 파일 추출 실패")
return
# 파일 오브젝트를 JSON 객체로 로드
project_data = json.load(extracted)
# 해당 경로에 project.json 파일로 저장
os.makedirs(output_folder, exist_ok=True)
output_json_path = os.path.join(output_folder, "project.json")
with open(output_json_path, "w", encoding="utf-8") as out_file:
json.dump(project_data, out_file, ensure_ascii=False, indent=2)
print(f"✅ 처리 완료: {filepath}{output_json_path}")
def process_ent_files(ent_dir, output_dir):
for filename in os.listdir(ent_dir):
if filename.lower().endswith((".ent")):
filename = filename.replace(" ","")
filepath = os.path.join(ent_dir, filename)
output_root = output_dir
output_folder = os.path.join(output_root, os.path.splitext(filename)[0])
try:
extract_project_json_from_gz(filepath, output_folder)
except Exception as e:
print(f"❌ 오류 발생 ({filename}): {e}")
# 실행 예
if __name__ == "__main__":
# test_names = ["2509_CAT_3_A"]
# test_names = ["2508_CAS_2_A","2508_CAS_2_B"]
test_names = ["2510_CAS_2_A"]
for test_name in test_names:
ent_dir = f".\\ent\\{test_name}"
output_dir = f".\\output\\{test_name}"
process_ent_files(ent_dir, output_dir)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,8 @@
{
"folders": [
{
"path": "."
}
],
"settings": {}
}

View File

@@ -1,4 +1,16 @@
# Entry 채점 프로그램
### main.py
scoring.json 기준표 작성
scoring.json 기준표 작성 (샘플 파일)
1. 채점용 답안 파일 복사 후 .ent 파일 .zip 으로 변경
2. 변경된 압축 파일 디렉토리 포함해서 압축 해제
> 채점 디렉토리 구조의 예
> 2502 CAT 3급 수시2/학생명/temp/project.json 채점
>
### copyFiles.py
특정 디렉토리의 .ent 파일을 타겟 디렉토리로 복사
복사 시 copy_ent_files 함수 확인

Binary file not shown.

Binary file not shown.

476
_scoring.json Normal file
View File

@@ -0,0 +1,476 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='꽃밭')]",
"points": 1.7,
"desc": "배경 이름 변경"
},
"1-2": {
"type": "scene",
"ele": "$..objects[?(@.name=='숲속')]",
"points": 1.7,
"desc": "배경 이름 변경"
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='당근')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='하트')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='토끼')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='상자')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"2-1": {
"type": "scene",
"ele": "$.variables[?(@.name=='당근')]['value', 'object']",
"answer": [
"10",
null
],
"points": 1.77,
"desc": "변수 기본값, 전체 사용 여부"
},
"2-2": {
"type": "scene",
"ele": "$.variables[?(@.name=='점수')]['value', 'object']",
"answer": [
0,
null
],
"points": 1.77,
"desc": "변수 기본값, 전체 사용 여부"
},
"2-3": {
"type": "scene",
"ele": "$.messages[?@.name=='종료']",
"points": 1.77,
"desc": "시그널 작성 여부"
},
"2": {
"type": "script",
"ele": "$.objects[?(@.name=='당근')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.77,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"points": 1.77,
"answer": "45",
"desc": "크기 지정"
},
{
"ele": "$[0][2]['params']",
"points": 1.77,
"answer": [
"FORWARD",
null
],
"desc": "물체 앞으로 보내기"
},
{
"type": "list",
"ele": [
"$[0][3].params[0].params[?(@.type=='get_variable')].type",
"$[0][3].params[0].params[?(@=='LESS')]",
"$[0][3].params[0].params[?(@.type=='text')].params[0]"
],
"answer": [
"get_variable",
"LESS",
"1"
],
"points": 1.77,
"desc": "변수가 1보다 클때까지 반복"
},
{
"ele": "$[0][3].statements[0][?@.type=='locate_xy'].params[*].params",
"answer": [
"0",
"-120"
],
"points": 1.77,
"desc": "x:0, y:-120 으로 이동"
},
{
"ele": "$[0][3].statements[0][1].params[0].params[0]",
"answer": "32",
"points": 1.77,
"desc": "스페이스(32) 를 눌렀을 때"
},
{
"ele": "$[0][3].statements[0][1].statements[0][0].params[0].params[0]",
"answer": "0.2",
"points": 1.77,
"desc": "0.2초 기다리기"
},
{
"ele": "$[0][3].statements[0][1].statements[0][1].params[1].params[0]",
"answer": "-1",
"points": 1.77,
"desc": "변수에 -1"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].statements[0][2].params[0].params[0]",
"$[0][3].statements[0][1].statements[0][2].params[1]"
],
"answer": [
"0.5",
"mouse"
],
"points": 1.77,
"desc": "0.5초 동안 마우스 좌표 위치로 이동"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][2].type",
"$[0][3].statements[0][2].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.77,
"desc": "if reach something"
},
{
"ele": "$[0][3].statements[0][2].statements[0][0].params[1].params[0]",
"answer": "10",
"points": 1.77,
"desc": "변수에 10"
},
{
"ele": "$[0][3].statements[0][2].statements[0][1].params[*].params",
"answer": [
"성공!",
"0.5"
],
"points": 1.77,
"desc": "dialog_time 시작!을 0.5초"
},
{
"ele": "$[0][4].type",
"answer": "message_cast",
"points": 1.77,
"desc": "신호 보내기"
},
{
"ele": "$[0][5].type",
"answer": "hide",
"points": 1.77,
"desc": "숨기기"
}
]
},
"3": {
"type": "script",
"ele": "$.objects[?name=~'하트'].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.77,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "50",
"points": 1.77,
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[0]",
"answer": "FRONT",
"points": 1.77,
"desc": "맨 앞으로 보내기"
},
{
"ele": "$[0][3].params[0]",
"answer": null,
"points": 1.77,
"desc": "반복하기 (계속)"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0]"
],
"answer": [
"locate",
"mouse"
],
"points": 1.77,
"desc": "마우스 위치로 이동"
},
{
"ele": "$[1][0].type",
"answer": "when_message_cast",
"points": 1.77,
"desc": "신호를 받았을 때"
},
{
"ele": "$[1][1].type",
"answer": "hide",
"points": 1.77,
"desc": "숨기기"
}
]
},
"4": {
"type": "script",
"ele": "$.objects[?(@.name=='토끼')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.77,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "90",
"points": 1.77,
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"0",
"60"
],
"points": 1.77,
"desc": "x:0, y:60 으로 이동"
},
{
"type": "list",
"ele": [
"$[0][3].params[0].params[?(@.type=='get_variable')].type",
"$[0][3].params[0].params[?(@=='LESS')]",
"$[0][3].params[0].params[?(@.type=='text')].params[0]"
],
"answer": [
"get_variable",
"LESS",
"1"
],
"points": 1.77,
"desc": "변수가 1보다 클때까지 반복"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][*].params[0].params[0]",
"$[0][3].statements[0][*].params[1].params[*].params[0]",
"$[0][3].statements[0][*].params[2].params[0]"
],
"answer": [
"2",
"-200",
"200",
"60"
],
"points": 1.77,
"desc": "2초 동안 무작위로 x:-200~200, y:60"
},
{
"ele": "$[1][0].type",
"answer": "when_message_cast",
"points": 1.77,
"desc": "신호를 받았을 때"
},
{
"ele": "$[1][1].params[*].params[0]",
"answer": [
"2",
"0",
"0"
],
"points": 1.77,
"desc": "2초 동안 x:0, y:0 좌표 이동"
},
{
"ele": "$[1][2].params[0].params[0]",
"answer": "50",
"points": 1.77,
"desc": "크기 지정"
},
{
"type": "list",
"ele": [
"$[1][3].params[0].params[0].type",
"$[1][3].params[0].params[1]",
"$[1][3].params[0].params[2].params[0]",
"$[1][3].params[1].params[0]"
],
"answer": [
"get_variable",
"PLUS",
"점 입니다.",
"3"
],
"points": 1.77,
"desc": "변수 + 점 입니다. 3초 동안 말하기"
},
{
"ele": "$[1][4].params[0].params[0]",
"answer": "0.5",
"points": 1.77,
"desc": "0.5초 기다리기"
},
{
"ele": "$[1][5].type",
"answer": "start_scene",
"points": 1.77,
"desc": "장면 전환"
}
]
},
"5": {
"type": "script",
"ele": "$.objects[?name=~'상자'].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.77,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[*][1].params[0]",
"points": 1.77,
"answer": "FORWARD",
"desc": "물체 앞으로 보내기"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"0",
"-100"
],
"points": 1.77,
"desc": "x:0, y:-100 으로 이동"
},
{
"ele": "$[0][3].params[0].params[0]",
"points": 1.77,
"answer": "90",
"desc": "크기 지정"
},
{
"ele": "$[0][4].params[*].params",
"answer": [
"시작!",
"0.5"
],
"points": 1.77,
"desc": "dialog_time 시작!을 0.5초"
},
{
"ele": "$[1][0].type",
"answer": "when_message_cast",
"points": 1.77,
"desc": "신호를 받았을 때"
},
{
"ele": "$[1][1].type",
"answer": "hide",
"points": 1.77,
"desc": "숨기기"
}
]
},
"6": {
"type": "script",
"ele": "$.objects[?(@.name=='숲속')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_scene_start",
"points": 1.77,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].type",
"answer": "hide_variable",
"points": 1.77,
"desc": "변수 숨기기"
},
{
"ele": "$[0][2].type",
"answer": "hide_variable",
"points": 1.77,
"desc": "변수 숨기기"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 2,
"desc": "오브젝트 클릭 시"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"change_effect_amount",
"color",
"50"
],
"points": 2,
"desc": "색깔 효과를 50으로 변경"
},
{
"type": "list",
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]",
"$[1][2].params[1]"
],
"answer": [
"dialog",
"처음부터 다시 실행합니다.",
"speak"
],
"points": 2,
"desc": "처음부터 다시 실행합니다. 를 말하기"
},
{
"ele": "$[1][3].params[0].params[0]",
"answer": "2",
"points": 2,
"desc": "2초 기다리기"
},
{
"ele": "$[1][4].type",
"answer": "restart_project",
"points": 2,
"desc": "처음부터 다시 시작하기"
}
]
}
}

511
_scripts.json Normal file
View File

@@ -0,0 +1,511 @@
[
[
{
"id": "vlyg",
"x": 50,
"y": 30,
"type": "when_run_button_click",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "wqvc",
"x": 0,
"y": 0,
"type": "set_scale_size",
"params": [
{
"id": "7qfb",
"x": 0,
"y": 0,
"type": "number",
"params": [
"30"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "kmdb",
"x": 0,
"y": 0,
"type": "locate_xy",
"params": [
{
"id": "yry5",
"x": 0,
"y": 0,
"type": "number",
"params": [
"-100"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "g3wu",
"x": 0,
"y": 0,
"type": "number",
"params": [
"-100"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "wh5n",
"x": 0,
"y": 0,
"type": "dialog_time",
"params": [
{
"id": "cga0",
"x": 0,
"y": 0,
"type": "text",
"params": [
"야호! 출발!"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "gihc",
"x": 0,
"y": 0,
"type": "number",
"params": [
"1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"speak",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
],
[
{
"id": "mfln",
"x": 50,
"y": 168,
"type": "when_some_key_pressed",
"params": [
null,
"49"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "t3ej",
"x": 0,
"y": 0,
"type": "locate_object_time",
"params": [
{
"id": "th0s",
"x": 0,
"y": 0,
"type": "number",
"params": [
"2"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"meq4",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "zakv",
"x": 0,
"y": 0,
"type": "hide",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "f98n",
"x": 0,
"y": 0,
"type": "wait_second",
"params": [
{
"id": "urh6",
"x": 0,
"y": 0,
"type": "number",
"params": [
"1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "p4yn",
"x": 0,
"y": 0,
"type": "show",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
],
[
{
"id": "hlnb",
"x": 50,
"y": 444,
"type": "when_some_key_pressed",
"params": [
null,
"50"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "smqv",
"x": 0,
"y": 0,
"type": "locate_object_time",
"params": [
{
"id": "941e",
"x": 0,
"y": 0,
"type": "number",
"params": [
"2"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"6kvc",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "f8ez",
"x": 0,
"y": 0,
"type": "hide",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "6ln4",
"x": 0,
"y": 0,
"type": "wait_second",
"params": [
{
"id": "eihx",
"x": 0,
"y": 0,
"type": "number",
"params": [
"1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "mism",
"x": 0,
"y": 0,
"type": "show",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
[
{
"id": "edyx",
"x": 50,
"y": 334,
"type": "when_some_key_pressed",
"params": [
null,
"51"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "vjkb",
"x": 0,
"y": 0,
"type": "locate_object_time",
"params": [
{
"id": "jwnn",
"x": 0,
"y": 0,
"type": "number",
"params": [
"2"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"9200",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "brfk",
"x": 0,
"y": 0,
"type": "dialog_time",
"params": [
{
"id": "nun7",
"x": 0,
"y": 0,
"type": "text",
"params": [
"다녀왔습니다!"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "sriu",
"x": 0,
"y": 0,
"type": "number",
"params": [
"1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"speak",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
]

View File

@@ -0,0 +1,669 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='들길')]",
"points": 1.7,
"desc": "배경 이름 변경"
},
"1-2": {
"type": "scene",
"ele": "$..objects[?(@.name=='하늘')]",
"points": 1.7,
"desc": "배경 이름 변경"
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='나무')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='돌')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='행인')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='마라토너')]",
"points": 1.7,
"desc": "물체 이름 변경"
},
"2": {
"type": "script",
"ele": "$.objects[?(@.name=~'나무|나무(10)')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.6,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].type",
"points": 1.6,
"answer": "hide",
"desc": "숨기기"
},
{
"type": "list",
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.6,
"desc": "무한 반복"
},
{
"type": "list",
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0]"
],
"answer": [
"create_clone",
"self"
],
"points": 1.6,
"desc": "clone self"
},
{
"type": "list",
"ele": [
"$[0][2].statements[0][1].type",
"$[0][2].statements[0][1].params[0].type",
"$[0][2].statements[0][1].params[0].params[1].params[0]",
"$[0][2].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"1",
"3"
],
"points": 1.6,
"desc": "wait random 1 betwwen 3 sec"
},
{
"ele": "$[1][0].type",
"points": 1.6,
"answer": "when_clone_start",
"desc": "cloen start"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"240",
"-20"
],
"points": 1.6,
"desc": "변수가 1보다 클때까지 반복"
},
{
"ele": "$[1][2].type",
"points": 1.6,
"answer": "show",
"desc": "show"
},
{
"type": "list",
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0].params[3]",
"$[1][3].params[0].params[1]",
"$[1][3].params[0].params[2].params[0]"
],
"answer": [
"repeat_while_true",
"x",
"LESS",
"-240"
],
"points": 1.6,
"desc": "while object x pos less then -240"
},
{
"type": "list",
"ele": [
"$[1][3].statements[0][0].type",
"$[1][3].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"-3"
],
"points": 1.6,
"desc": "move x pos -3"
},
{
"ele": "$[1][4].type",
"points": 1.6,
"answer": "delete_clone",
"desc": "delete clone"
}
]
},
"3": {
"type": "script",
"ele": "$.objects[?(@.name=~'돌|바위(1)')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.6,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "30",
"points": 1.6,
"desc": "크기 지정"
},
{
"ele": "$[0][2].type",
"points": 1.6,
"answer": "hide",
"desc": "숨기기"
},
{
"type": "list",
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.6,
"desc": "무한 반복"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0]"
],
"answer": [
"create_clone",
"self"
],
"points": 1.6,
"desc": "clone self"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].type",
"$[0][3].statements[0][1].params[0].params[1].params[0]",
"$[0][3].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"1.5",
"3"
],
"points": 1.6,
"desc": "wait random 1.5 betwwen 3 sec"
},
{
"ele": "$[1][0].type",
"points": 1.6,
"answer": "when_clone_start",
"desc": "cloen start"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"240",
"-105"
],
"points": 1.6,
"desc": "move location x:240, y:-105"
},
{
"ele": "$[1][2].type",
"points": 1.6,
"answer": "show",
"desc": "show"
},
{
"type": "list",
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0].params[3]",
"$[1][3].params[0].params[1]",
"$[1][3].params[0].params[2].params[0]"
],
"answer": [
"repeat_while_true",
"x",
"LESS",
"-240"
],
"points": 1.6,
"desc": "while object x pos less then -240"
},
{
"type": "list",
"ele": [
"$[1][3].statements[0][0].type",
"$[1][3].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"-3"
],
"points": 1.6,
"desc": "move x pos -3"
},
{
"ele": "$[1][4].type",
"points": 1.6,
"answer": "delete_clone",
"desc": "delete clone"
}
]
},
"4": {
"type": "script",
"ele": "$.objects[?(@.name=~'행인|가을 자전거를 타는 모습')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.6,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"240",
"-30"
],
"points": 1.6,
"desc": "move location x:240, y:-30"
},
{
"type": "list",
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.6,
"desc": "무한 반복"
},
{
"type": "list",
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0].params[0]"
],
"answer": [
"move_direction",
"-1"
],
"points": 1.6,
"desc": "무한 반복"
}
]
},
"28": {
"type": "scene",
"ele": "$.messages[?(@.name=='넘어짐')]",
"points": 1.6,
"desc": "시그널 작성 여부"
},
"5": {
"type": "script",
"ele": "$.objects[?(@.name=~'마라토너|축구선수')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.6,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].type",
"points": 1.6,
"answer": "flip_y",
"desc": "y axis flip"
},
{
"type": "list",
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"-150",
"-70"
],
"points": 1.6,
"desc": "move location x:240, y:-30"
},
{
"type": "list",
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.6,
"desc": "무한 반복"
},
{
"ele": "$[0][3].statements[0][0].params[0]",
"points": 1.6,
"answer": "next",
"desc": "change to next shape check value"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].params[0]"
],
"points": 1.6,
"answer": [
"wait_second",
"0.1"
],
"desc": "wait 0.1 second"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][2].type",
"$[0][3].statements[0][2].params[0].type",
"$[0][3].statements[0][2].params[0].params[0]"
],
"points": 1.6,
"answer": [
"_if",
"is_press_some_key",
"32"
],
"desc": "if press space key"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][2].statements[0][0].type",
"$[0][3].statements[0][2].statements[0][0].params[0].params[0]"
],
"points": 1.6,
"answer": [
"repeat_basic",
"20"
],
"desc": "while 20"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][2].statements[0][0].statements[0][0].type",
"$[0][3].statements[0][2].statements[0][0].statements[0][0].params[0].params[0]"
],
"points": 1.6,
"answer": [
"move_y",
"5"
],
"desc": "y pos move 5"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][2].statements[0][1].type",
"$[0][3].statements[0][2].statements[0][1].params[0].params[0]"
],
"points": 1.6,
"answer": [
"repeat_basic",
"20"
],
"desc": "while 20"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][2].statements[0][1].statements[0][0].type",
"$[0][3].statements[0][2].statements[0][1].statements[0][0].params[0].params[0]"
],
"points": 1.6,
"answer": [
"move_y",
"-5"
],
"desc": "y pos move -5"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][3].type",
"$[0][3].statements[0][3].params[0].type"
],
"points": 1.6,
"answer": [
"_if",
"reach_something"
],
"desc": "if reach object"
},
{
"ele": "$[0][3].statements[0][3].statements[0][0].type",
"points": 1.6,
"answer": "message_cast",
"desc": "신호 보내기"
},
{
"ele": "$[1][0].type",
"answer": "when_message_cast",
"points": 1.6,
"desc": "신호를 받았을 때"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0].type",
"$[1][1].params[0].params[0]"
],
"points": 1.6,
"answer": [
"rotate_relative",
"angle",
"40"
],
"desc": "rotate angle 40"
},
{
"type": "list",
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]",
"$[1][2].params[1].params[0]",
"$[1][2].params[2].params[0]"
],
"points": 1.6,
"answer": [
"locate_xy_time",
"0.2",
"-140",
"-100"
],
"desc": "locate x: -140, y:-100 during 0.2 sec "
},
{
"type": "list",
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]",
"$[1][3].params[1]"
],
"answer": [
"dialog",
"아야!",
"speak"
],
"points": 1.6,
"desc": "아야! speak"
},
{
"type": "list",
"ele": [
"$[1][4].type",
"$[1][4].params[0]"
],
"answer": [
"stop_object",
"otherThread"
],
"points": 1.6,
"desc": "object other code stop"
},
{
"type": "list",
"ele": [
"$[1][5].type",
"$[1][5].params[0].params[0]"
],
"points": 1.6,
"answer": [
"wait_second",
"1"
],
"desc": "wait 1 second"
},
{
"ele": "$[1][6].type",
"answer": "start_neighbor_scene",
"points": 1.6,
"desc": "next scene start"
}
]
},
"6": {
"type": "script",
"ele": "$.objects[?(@.name=~'하늘|날씨')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_scene_start",
"points": 1.6,
"desc": "scene start"
},
{
"type": "list",
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1]"
],
"answer": [
"dialog",
"아쉽지만 잘했어!",
"speak"
],
"points": 1.6,
"desc": "말하기"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 1.6,
"desc": "오브젝트 클릭 시"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"brightness",
"55"
],
"points": 1.6,
"desc": "add brightness 55 effect"
},
{
"type": "list",
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]",
"$[1][2].params[1]"
],
"answer": [
"dialog",
"처음부터 다시 실행합니다.",
"speak"
],
"points": 1.6,
"desc": "말하기"
},
{
"type": "list",
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]"
],
"points": 1.6,
"answer": [
"wait_second",
"2"
],
"desc": "wait 2 second"
},
{
"ele": "$[1][4].type",
"answer": "restart_project",
"points": 1.6,
"desc": "restart"
}
]
}
}

View File

@@ -0,0 +1,370 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='꽃밭')]",
"points": 2,
"desc": "배경 이름 변경"
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='당근')]",
"points": 2,
"desc": "물체 이름 변경"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='하트')]",
"points": 2,
"desc": "물체 이름 변경"
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='토끼')]",
"points": 2,
"desc": "물체 이름 변경"
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='상자')]",
"points": 2,
"desc": "물체 이름 변경"
},
"2": {
"type": "script",
"ele": "$.objects[?(@.name=='당근')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.57,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"points": 2.57,
"answer": "45",
"desc": "크기 지정"
},
{
"ele": "$[0][2]['params']",
"points": 2.57,
"answer": [
"FORWARD",
null
],
"desc": "물체 앞으로 보내기"
},
{
"ele": "$[0][3].type",
"points": 2.57,
"answer": "hide",
"desc": "숨기기"
},
{
"ele": "$[0][4].params[0]",
"answer": null,
"points": 2.57,
"desc": "반복하기 (계속)"
},
{
"ele": "$[0][4].statements[0][?@.type=='locate_xy'].params[*].params",
"answer": [
"0",
"-100"
],
"points": 2.57,
"desc": "x:0, y:-100 으로 이동"
},
{
"ele": "$[0][4].statements[0][1].type",
"points": 2.57,
"answer": "show",
"desc": "모양보이기"
},
{
"ele": "$[0][4].statements[0][2].params[0].params[0]",
"answer": "32",
"points": 2.57,
"desc": "스페이스(32) 를 눌렀을 때"
},
{
"ele": "$[0][4].statements[0][2].statements[0][0].params[0].params[0]",
"answer": "0.2",
"points": 2.57,
"desc": "0.2초 기다리기"
},
{
"type": "list",
"ele": [
"$[0][4].statements[0][2].statements[0][1].params[0].params[0]",
"$[0][4].statements[0][2].statements[0][1].params[1]"
],
"answer": [
"0.5",
"mouse"
],
"points": 2.57,
"desc": "0.5초 동안 마우스 좌표 위치로 이동"
},
{
"type": "list",
"ele": [
"$[0][4].statements[0][3].type",
"$[0][4].statements[0][3].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 2.57,
"desc": "if reach something"
},
{
"ele": "$[0][4].statements[0][3].statements[0][0].params[*].params",
"answer": [
"냠냠!",
"0.5"
],
"points": 2.57,
"desc": "dialog_time 냠냠!을 0.5초"
},
{
"type": "list",
"ele": [
"$[0][4].statements[0][4].type",
"$[0][4].statements[0][4].params[0].type",
"$[0][4].statements[0][4].params[0].params[1]"
],
"answer": [
"_if",
"reach_something",
"wall"
],
"points": 2.57,
"desc": "if reach something wall"
},
{
"type": "list",
"ele": [
"$[0][4].statements[0][4].statements[0][0].type",
"$[0][4].statements[0][4].statements[0][0].params[0]"
],
"answer": [
"stop_object",
"all"
],
"points": 2.57,
"desc": "모든 오브젝트 정지"
}
]
},
"3": {
"type": "script",
"ele": "$.objects[?name=~'하트'].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.57,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "50",
"points": 2.57,
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[0]",
"answer": "FRONT",
"points": 2.57,
"desc": "맨 앞으로 보내기"
},
{
"ele": "$[0][3].params[0]",
"answer": null,
"points": 2.57,
"desc": "반복하기 (계속)"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0]"
],
"answer": [
"locate",
"mouse"
],
"points": 2.57,
"desc": "마우스 위치로 이동"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0]",
"$[0][3].statements[0][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"0.5"
],
"points": 2.57,
"desc": "Add Color effect 0.5 duration"
}
]
},
"4": {
"type": "script",
"ele": "$.objects[?(@.name=='토끼')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.57,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "90",
"points": 2.57,
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"0",
"60"
],
"points": 2.57,
"desc": "x:0, y:60 으로 이동"
},
{
"ele": "$[0][3].params[0]",
"answer": null,
"points": 2.57,
"desc": "계속 반복하기"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][0].params[0].params[0]",
"$[0][3].statements[0][0].params[1].params[*].params[0]",
"$[0][3].statements[0][0].params[2].params[0]"
],
"answer": [
"2",
"-200",
"200",
"60"
],
"points": 2.57,
"desc": "2초 동안 무작위로 x:-200~200, y:60"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 2.57,
"desc": "if reach something"
},
{
"ele": "$[0][3].statements[0][1].statements[0][0].params[0].params[0]",
"answer": "10",
"points": 2.57,
"desc": "크기 지정"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].statements[0][1].type",
"$[0][3].statements[0][1].statements[0][1].params[0].params[0].type",
"$[0][3].statements[0][1].statements[0][1].params[0].params[0].params[3]",
"$[0][3].statements[0][1].statements[0][1].params[0].params[1]",
"$[0][3].statements[0][1].statements[0][1].params[0].params[2].params[0]"
],
"answer": [
"_if",
"coordinate_object",
"size",
"EQUAL",
"120"
],
"points": 2.57,
"desc": "비교 오브젝트의 크기가 120과 같을 때"
},
{
"ele": "$[0][3].statements[0][1].statements[0][1].statements[0][0].params[*].params",
"answer": [
"미션 성공!",
"2"
],
"points": 2.57,
"desc": "dialog_time 미션 성공!을 2초"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].statements[0][1].statements[0][1].type",
"$[0][3].statements[0][1].statements[0][1].statements[0][1].params[0]"
],
"answer": [
"stop_object",
"all"
],
"points": 2.57,
"desc": "모든 오브젝트 정지"
}
]
},
"5": {
"type": "script",
"ele": "$.objects[?name=~'상자'].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.57,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0]",
"points": 2.57,
"answer": "FORWARD",
"desc": "물체 앞으로 보내기"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"0",
"-100"
],
"points": 2.57,
"desc": "x:0, y:-100 으로 이동"
},
{
"ele": "$[0][3].params[0].params[0]",
"points": 2.57,
"answer": "90",
"desc": "크기 지정"
},
{
"ele": "$[0][4].params[*].params",
"answer": [
"시작!",
"0.5"
],
"points": 2.57,
"desc": "dialog_time 시작!을 0.5초"
}
]
}
}

View File

@@ -0,0 +1,382 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='약도')]",
"points": 2,
"desc": "배경 이름 변경"
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='놀이동산')]",
"points": 2,
"desc": "물체 이름 변경"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='백화점')]",
"points": 2,
"desc": "물체 이름 변경"
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='우리집')]",
"points": 2,
"desc": "물체 이름 변경"
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='어린이')]",
"points": 2,
"desc": "물체 이름 변경"
},
"2": {
"type": "script",
"ele": "$.objects[?(@.name=~'놀이동산')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"points": 2.43,
"answer": "90",
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"-25",
"60"
],
"points": 2.43,
"desc": "x:-25, y:60 으로 이동"
},
{
"ele": "$[1][0].params",
"points": 2.43,
"answer": [
null,
"49"
],
"desc": "키보드 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"30"
],
"points": 2.43,
"desc": "Add Color effect 30 duration"
},
{
"ele": "$[1][2].params[*].params",
"answer": [
"여기는 놀이동산!",
"1"
],
"points": 2.43,
"desc": "dialog_time 여기는 놀이동산 1초 "
},
{
"ele": "$[1][3].type",
"answer": "erase_all_effects",
"points": 2.43,
"desc": "효과 모두 삭제하기"
}
]
},
"3": {
"type": "script",
"ele": "$.objects[?(@.name=~'백화점|건물')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"points": 2.43,
"answer": "50",
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"180",
"50"
],
"points": 2.43,
"desc": "x:-25, y:60 으로 이동"
},
{
"ele": "$[1][0].params",
"points": 2.43,
"answer": [
null,
"50"
],
"desc": "키보드 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"40"
],
"points": 2.43,
"desc": "Add Color effect 30 duration"
},
{
"ele": "$[1][2].params[*].params",
"answer": [
"여기는 백화점!",
"1"
],
"points": 2.43,
"desc": "dialog_time 여기는 놀이동산 1초 "
},
{
"ele": "$[1][3].type",
"answer": "erase_all_effects",
"points": 2.43,
"desc": "효과 모두 삭제하기"
}
]
},
"4": {
"type": "script",
"ele": "$.objects[?(@.name=~'우리집|예쁜집')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"points": 2.43,
"answer": "60",
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"-190",
"-90"
],
"points": 2.43,
"desc": "x:-25, y:60 으로 이동"
},
{
"ele": "$[1][0].params",
"points": 2.43,
"answer": [
null,
"51"
],
"desc": "키보드 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"35"
],
"points": 2.43,
"desc": "Add Color effect 30 duration"
},
{
"ele": "$[1][2].type",
"answer": "erase_all_effects",
"points": 2.43,
"desc": "효과 모두 삭제하기"
}
]
},
"5": {
"type": "script",
"ele": "$.objects[?name=~'어린이'].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"points": 2.57,
"answer": "30",
"desc": "크기 지정"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"-100",
"-100"
],
"points": 2.43,
"desc": "x:-25, y:60 으로 이동"
},
{
"ele": "$[0][3].params[*].params",
"answer": [
"야호! 출발!",
"1"
],
"points": 2.43,
"desc": "dialog_time 여기는 놀이동산 1초 "
},
{
"ele": "$[1][0].params",
"points": 2.43,
"answer": [
null,
"49"
],
"desc": "키보드 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[1][1].type",
"$[1][1].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"points": 2.43,
"desc": "Locate Object 2 sec"
},
{
"ele": "$[1][2].type",
"points": 2.43,
"answer": "hide",
"desc": "숨기기"
},
{
"type": "list",
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]"
],
"points": 2.43,
"answer": [
"wait_second",
"1"
],
"desc": "wait second"
},
{
"ele": "$[1][4].type",
"points": 2.43,
"answer": "show",
"desc": "보이기"
},
{
"ele": "$[2][0].params",
"points": 2.43,
"answer": [
null,
"50"
],
"desc": "키보드 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[2][1].type",
"$[2][1].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"points": 2.43,
"desc": "Locate Object 2 sec"
},
{
"ele": "$[2][2].type",
"points": 2.43,
"answer": "hide",
"desc": "숨기기"
},
{
"type": "list",
"ele": [
"$[2][3].type",
"$[2][3].params[0].params[0]"
],
"points": 2.43,
"answer": [
"wait_second",
"1"
],
"desc": "wait second"
},
{
"ele": "$[2][4].type",
"points": 2.43,
"answer": "show",
"desc": "보이기"
},
{
"ele": "$[3][0].params",
"points": 2.43,
"answer": [
null,
"51"
],
"desc": "키보드 눌렀을 때"
},
{
"type": "list",
"ele": [
"$[3][1].type",
"$[3][1].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"points": 2.43,
"desc": "Locate Object 2 sec"
},
{
"ele": "$[3][2].params[*].params",
"answer": [
"다녀왔습니다!",
"1"
],
"points": 2.43,
"desc": "dialog_time 여기는 놀이동산 1초 "
}
]
}
}

656
correct/2504CAS2A.json Normal file
View File

@@ -0,0 +1,656 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='약도')]",
"points": 1.7,
"desc": "문제 1/장면 1/[배경] 이름 설정 1/이름 변경 없음"
},
"1-2": {
"type": "scene",
"ele": "$..objects[?(@.name=='나의 방')]",
"points": 1.7,
"desc": "문제 1/장면 2/[배경] 이름 설정 2/이름을 '나의 방'으로 변경하기"
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='놀이동산')]",
"points": 1.7,
"desc": "문제 1/놀이동산(1)/[개체] 이름 설정 1/이름을 '놀이동산'으로 변경하기"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='백화점')]",
"points": 1.7,
"desc": "문제 1/건물(6)/[개체] 이름 설정 2/이름을 '백화점'으로 변경하기"
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='우리집')]",
"points": 1.7,
"desc": "문제 1/예쁜집/[개체] 이름 설정 3/이름을 '우리집'으로 변경하기"
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='어린이')]",
"points": 1.7,
"desc": "문제 1/어린이(2)/[개체] 이름 설정 4/이름을 '어린이'로 변경하기"
},
"2": {
"type": "script",
"ele": "$.objects[?(@.name=~'놀이동산')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.56,
"desc": "문제2/놀이동산/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "100",
"points": 1.56,
"desc": "문제2/놀이동산/[시작]의 세부 동작 1/크기를 '100' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"-25",
"80"
],
"points": 1.56,
"desc": "문제2/놀이동산/[시작]의 세부 동작 2/x: '-25' y: '80' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 1.56,
"desc": "문제2/놀이동산/오브젝트/오브젝트를 클릭했을 때"
},
{
"ele": "$[1][1].params[*].params",
"answer": [
"여기는 놀이동산!",
"1"
],
"points": 1.56,
"desc": "문제2/놀이동산/[오브젝트]의 세부 동작/'여기는 놀이동산!' 을 '1' 초 동안 '말하기'"
}
]
},
"3": {
"type": "script",
"ele": "$.objects[?(@.name=~'화점|건물')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.56,
"desc": "문제2/백화점/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "80",
"points": 1.56,
"desc": "문제2/백화점/[시작]의 세부 동작 1/크기를 '80' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"170",
"-80"
],
"points": 1.56,
"desc": "문제2/백화점/[시작]의 세부 동작 2/x: '170' y: '-80' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 1.56,
"desc": "문제2/백화점/오브젝트/오브젝트를 클릭했을 때"
},
{
"ele": "$[1][1].params[*].params",
"answer": [
"여기는 백화점!",
"1"
],
"points": 1.56,
"desc": "문제2/백화점/[오브젝트]의 세부 동작/'여기는 백화점!' 을 '1' 초 동안 '말하기'"
}
]
},
"31": {
"type": "scene",
"ele": "$.messages[?(@.name=='놀이동산')]",
"points": 1.56,
"desc": "시그널 작성 여부"
},
"32": {
"type": "scene",
"ele": "$.messages[?(@.name=='백화점')]",
"points": 1.56,
"desc": "시그널 작성 여부"
},
"4": {
"type": "script",
"ele": "$.objects[?(@.name=~'우리집|예쁜')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.56,
"desc": "문제2/우리집/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "110",
"points": 1.56,
"desc": "문제2/우리집/[시작]의 세부 동작 1/크기를 '110' 으로 정하기 "
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"-170",
"-90"
],
"points": 1.56,
"desc": "문제2/우리집/[시작]의 세부 동작 2/x: '-170' y: '-90' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 1.56,
"desc": "문제2/우리집/오브젝트/오브젝트를 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0].params[0]"
],
"answer": [
"ask_and_wait",
"첫 번째로 방문할 장소는?"
],
"points": 1.56,
"desc": "문제2/우리집/[오브젝트]의 세부 동작 1/'첫 번째로 방문할 장소는?' 을 묻고 대답 기다리기",
"type": "list"
},
{
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]"
],
"answer": [
"wait_second",
"0.5"
],
"points": 1.56,
"desc": "문제2/우리집/[오브젝트]의 세부 동작 2/'0.5' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[1][3].type",
"$[1][3].params[0].type",
"$[1][3].params[0].params[0].type",
"$[1][3].params[0].params[1]",
"$[1][3].params[0].params[2].params[0]"
],
"answer": [
"_if",
"boolean_basic_operator",
"get_canvas_input_value",
"EQUAL",
"놀이동산"
],
"points": 1.56,
"desc": "문제2/우리집/만일 1/만일 '대답' = '놀이동산' 이라면 ",
"type": "list"
},
{
"ele": "$[1][3].statements[0][0].type",
"answer": "message_cast",
"points": 1.56,
"desc": "문제2/우리집/[만일 1]의 세부 동작/'놀이동산' 신호 보내기"
},
{
"ele": [
"$[1][4].type",
"$[1][4].params[0].type",
"$[1][4].params[0].params[0].type",
"$[1][4].params[0].params[1]",
"$[1][4].params[0].params[2].params[0]"
],
"answer": [
"_if",
"boolean_basic_operator",
"get_canvas_input_value",
"EQUAL",
"백화점"
],
"points": 1.56,
"desc": "문제2/우리집/만일 2/만일 '대답' = '백화점' 이라면 ",
"type": "list"
},
{
"ele": "$[1][4].statements[0][0].type",
"answer": "message_cast",
"points": 1.56,
"desc": "문제2/우리집/[만일 2]의 세부 동작/'백화점' 신호 보내기"
}
]
},
"5": {
"type": "script",
"ele": "$.objects[?(@.name=~'어린이')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.56,
"desc": "문제2/어린이/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "40",
"points": 1.56,
"desc": "문제2/어린이/[시작]의 세부 동작 1/크기를 '40' 으로 정하기 "
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"-170",
"-100"
],
"points": 1.56,
"desc": "문제2/어린이/[시작]의 세부 동작 2/x: '-170' y: '-100' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.56,
"desc": "문제2/어린이/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0].type",
"$[0][3].statements[0][0].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"39"
],
"points": 1.56,
"desc": "문제2/어린이/만일/만일 '오른쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].statements[0][0].type",
"$[0][3].statements[0][0].statements[0][0].params[0].params[0]",
"$[0][3].statements[0][0].statements[0][0].params[1].params[0]"
],
"answer": [
"locate_xy",
"-90",
"-100"
],
"points": 1.56,
"desc": "문제2/어린이/[만일]의 세부 동작/x: '-90' y: '-100' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_message_cast",
"points": 1.56,
"desc": "문제2/어린이/신호 1/'놀이동산' 신호를 받았을 때"
},
{
"ele": [
"$[1][1].type"
],
"answer": [
"repeat_while_true"
],
"points": 1.56,
"desc": "문제2/어린이/반복 1/'놀이동산' 에 닿았는가? '이 될 때까지' 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"points": 1.56,
"desc": "문제2/어린이/[반복 1]의 세부 동작 1/'2' 초 동안 '놀이동산' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.5"
],
"points": 1.56,
"desc": "문제2/어린이/[반복 1]의 세부 동작 2/'0.5' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[1][2].type"
],
"answer": [
"repeat_while_true"
],
"points": 1.56,
"desc": "문제2/어린이/반복 2/'백화점' 에 닿았는가? '이 될 때까지' 반복하기",
"type": "list"
},
{
"ele": [
"$[1][2].statements[0][0].type",
"$[1][2].statements[0][0].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"points": 1.56,
"desc": "문제2/어린이/[반복 2]의 세부 동작 1/'2' 초 동안 '백화점' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[1][2].statements[0][1].type",
"$[1][2].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"1"
],
"points": 1.56,
"desc": "문제2/어린이/[반복 2]의 세부 동작 2/'1' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]",
"$[1][3].params[1].params[0]",
"$[1][3].params[2].params[0]"
],
"answer": [
"locate_xy_time",
"2",
"-120",
"-100"
],
"points": 1.56,
"desc": "문제2/어린이/[신호 1]의 세부 동작 1/'2' 초 동안 x: '-120' y: '-100' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[1][4].params[*].params",
"answer": [
"집 도착!",
"1"
],
"points": 1.56,
"desc": "문제2/어린이/[신호 1]의 세부 동작 2/'집 도착!' 을 '1' 초 동안 '말하기'"
},
{
"ele": "$[1][5].type",
"answer": "start_neighbor_scene",
"points": 1.56,
"desc": "문제2/어린이/[신호 1]의 세부 동작 3/'다음' 장면 시작하기"
},
{
"ele": "$[2][0].type",
"answer": "when_message_cast",
"points": 1.56,
"desc": "문제2/어린이/신호 2/'백화점' 신호를 받았을 때"
},
{
"ele": [
"$[2][1].type"
],
"answer": [
"repeat_while_true"
],
"points": 1.56,
"desc": "문제2/어린이/반복 1/'백화점' 에 닿았는가? '이 될 때까지' 반복하기",
"type": "list"
},
{
"ele": [
"$[2][1].statements[0][0].type",
"$[2][1].statements[0][0].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"points": 1.56,
"desc": "문제2/어린이/[반복 1]의 세부 동작 1/'2' 초 동안 '백화점' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[2][1].statements[0][1].type",
"$[2][1].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.5"
],
"points": 1.56,
"desc": "문제2/어린이/[반복 1]의 세부 동작 2/'0.5' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[2][2].type"
],
"answer": [
"repeat_while_true"
],
"points": 1.56,
"desc": "문제2/어린이/반복 2/'놀이동산' 에 닿았는가? '이 될 때까지' 반복하기",
"type": "list"
},
{
"ele": [
"$[2][2].statements[0][0].type",
"$[2][2].statements[0][0].params[0].params[0]"
],
"answer": [
"locate_object_time",
"2"
],
"points": 1.56,
"desc": "문제2/어린이/[반복 2]의 세부 동작 1/'2' 초 동안 '놀이동산' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[2][2].statements[0][1].type",
"$[2][2].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"1"
],
"points": 1.56,
"desc": "문제2/어린이/[반복 2]의 세부 동작 2/'1' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[2][3].type",
"$[2][3].params[0].params[0]",
"$[2][3].params[1].params[0]",
"$[2][3].params[2].params[0]"
],
"answer": [
"locate_xy_time",
"2",
"-120",
"-100"
],
"points": 1.56,
"desc": "문제2/어린이/[신호 1]의 세부 동작 1/'2' 초 동안 x: '-120' y: '-100' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[2][4].params[*].params",
"answer": [
"집 도착!",
"1"
],
"points": 1.56,
"desc": "문제2/어린이/[신호 1]의 세부 동작 2/'집 도착!' 을 '1' 초 동안 '말하기'"
},
{
"ele": "$[2][5].type",
"answer": "start_neighbor_scene",
"points": 1.56,
"desc": "문제2/어린이/[신호 1]의 세부 동작 3/'다음' 장면 시작하기"
}
]
},
"6": {
"type": "script",
"ele": "$.objects[?(@.name=~'나의|방')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_scene_start",
"points": 1.56,
"desc": "문제2/나의 방/장면/장면이 시작되었을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0]"
],
"answer": [
"set_visible_answer",
"HIDE"
],
"points": 1.56,
"desc": "문제2/나의 방/[장면]의 세부 동작 1/대답 '숨기기'",
"type": "list"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1]"
],
"answer": [
"dialog",
"my room!",
"speak"
],
"points": 1.56,
"desc": "문제2/나의 방/[장면]의 세부 동작 2/'my room!' 을 '말하기'",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 2,
"desc": "문제 3/나의 방/오브젝트/오브젝트를 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"brightness",
"10"
],
"points": 2,
"desc": "문제 3/나의 방/[오브젝트]의 세부 동작 1/'밝기' 효과를 '10' 만큼 주기",
"type": "list"
},
{
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]",
"$[1][2].params[1]"
],
"answer": [
"dialog",
"처음부터 다시 실행합니다.",
"speak"
],
"points": 2,
"desc": "문제 3/나의 방/[오브젝트]의 세부 동작 2/'처음부터 다시 실행합니다.' 를 '말하기'",
"type": "list"
},
{
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]"
],
"answer": [
"wait_second",
"2"
],
"points": 2,
"desc": "문제 3/나의 방/[오브젝트]의 세부 동작 3/'2' 초 기다리기",
"type": "list"
},
{
"ele": "$[1][4].type",
"answer": "restart_project",
"points": 2,
"desc": "문제 3/나의 방/[오브젝트]의 세부 동작 4/처음부터 다시 실행하기"
}
]
}
}

482
correct/2505CAT3A.json Normal file
View File

@@ -0,0 +1,482 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='바다')]",
"points": 2,
"desc": "문제 1/바닷속(3)/[배경] 이름 설정/이름을 '바다'로 변경하기"
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='신비한 열매')]",
"points": 2,
"desc": "문제 1/블루베리/[개체] 이름 설정 1/이름을 '신비한 열매'로 변경하기"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='쓰레기')]",
"points": 2,
"desc": "문제 1/쓰레기/[개체] 이름 설정 2/이름 변경 없음"
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='물고기')]",
"points": 2,
"desc": "문제 1/빨간 물고기/[개체] 이름 설정 3/이름을 '물고기'로 변경하기"
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='상어')]",
"points": 2,
"desc": "문제 1/상어(1)/[개체] 이름 설정 4/이름을 '상어'로 변경하기"
},
"2": {
"type": "script",
"ele": "$.objects[?(@.name=~'열매|블루베|신비한열매')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.19,
"desc": "문제 2/신비한 열매/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].type",
"answer": "hide",
"points": 2.19,
"desc": "문제 2/신비한 열매/[시작]의 세부 동작 1/모양 숨기기"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "40",
"points": 2.19,
"desc": "문제 2/신비한 열매/[시작]의 세부 동작 2/크기를 '40' 으로 정하기"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 2.19,
"desc": "문제 2/신비한 열매/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0].params[*].params[0]",
"$[0][3].statements[0][0].params[1].params[*].params[0]"
],
"answer": [
"locate_xy",
"-200",
"200",
"-120",
"120"
],
"points": 2.19,
"desc": "문제 2/신비한 열매/[반복]의 세부 동작 1/x: '-200 부터 200 사이의 무작위 수' y: '-120 부터 120 사이의 무작위 수' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"1"
],
"points": 2.19,
"desc": "문제 2/신비한 열매/[반복]의 세부 동작 2/'1' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][3].statements[0][2].type",
"answer": "show",
"points": 2.19,
"desc": "문제 2/신비한 열매/[반복]의 세부 동작 3/모양 보이기"
}
]
},
"3": {
"type": "script",
"ele": "$.objects[?(@.name=~'쓰레기|변경없음')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.19,
"desc": "문제 2/쓰레기/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].type",
"answer": "hide",
"points": 2.19,
"desc": "문제 2/쓰레기/[시작]의 세부 동작 1/모양 숨기기"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "30",
"points": 2.19,
"desc": "문제 2/쓰레기/[시작]의 세부 동작 2/크기를 '30' 으로 정하기"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 2.19,
"desc": "문제 2/쓰레기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0].params[*].params[0]",
"$[0][3].statements[0][0].params[1].params[*].params[0]"
],
"answer": [
"locate_xy",
"-200",
"200",
"-120",
"120"
],
"points": 2.19,
"desc": "문제 2/쓰레기/[반복]의 세부 동작 1/x: '-200 부터 200 사이의 무작위 수' y: '-120 부터 120 사이의 무작위 수' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"1"
],
"points": 2.19,
"desc": "문제 2/쓰레기/[반복]의 세부 동작 2/'1' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][3].statements[0][2].type",
"answer": "show",
"points": 2.19,
"desc": "문제 2/쓰레기/[반복]의 세부 동작 3/모양 보이기"
}
]
},
"4": {
"type": "script",
"ele": "$.objects[?(@.name=~'물고기')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.19,
"desc": "문제 2/물고기/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"100",
"60"
],
"points": 2.19,
"desc": "문제 2/물고기/[시작]의 세부 동작 1/x: '100' y: '60' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "50",
"points": 2.19,
"desc": "문제 2/물고기/[시작]의 세부 동작 2/크기를 '50' 으로 정하기"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 2.19,
"desc": "문제 2/물고기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0].type",
"$[0][3].statements[0][0].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"37"
],
"points": 2.19,
"desc": "문제 2/물고기/만일 1/만일 '왼쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].statements[0][0].type",
"$[0][3].statements[0][0].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"-5"
],
"points": 2.19,
"desc": "문제 2/물고기/[만일 1]의 세부 동작/x 좌표를 '-5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].type",
"$[0][3].statements[0][1].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"39"
],
"points": 2.19,
"desc": "문제 2/물고기/만일 2/만일 '오른쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][1].statements[0][0].type",
"$[0][3].statements[0][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"5"
],
"points": 2.19,
"desc": "문제 2/물고기/[만일 2]의 세부 동작/x 좌표를 '5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][2].type",
"$[0][3].statements[0][2].params[0].type",
"$[0][3].statements[0][2].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"38"
],
"points": 2.19,
"desc": "문제 2/물고기/만일 3/만일 '위쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][2].statements[0][0].type",
"$[0][3].statements[0][2].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"5"
],
"points": 2.19,
"desc": "문제 2/물고기/[만일 3]의 세부 동작/y 좌표를 '5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][3].type",
"$[0][3].statements[0][3].params[0].type",
"$[0][3].statements[0][3].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"40"
],
"points": 2.19,
"desc": "문제 2/물고기/만일 4/만일 '아래쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][3].statements[0][0].type",
"$[0][3].statements[0][3].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"-5"
],
"points": 2.19,
"desc": "문제 2/물고기/[만일 4]의 세부 동작/y 좌표를 '-5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][4].type",
"$[0][3].statements[0][4].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 2.19,
"desc": "문제 2/물고기/만일 5/만일 '신비한 열매' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": "$[0][3].statements[0][4].statements[0][0].params[*].params",
"answer": [
"냠냠!",
"2"
],
"points": 2.19,
"desc": "문제 2/물고기/[만일 5]의 세부 동작 1/'냠냠!' 을 '2' 초 동안 '말하기'"
},
{
"ele": "$[0][3].statements[0][4].statements[0][1].params[0].params[0]",
"answer": "120",
"points": 2.19,
"desc": "문제 2/물고기/[만일 5]의 세부 동작 2/크기를 '120' 으로 정하기"
},
{
"ele": "$[0][3].statements[0][4].statements[0][2].type",
"answer": "hide",
"points": 2.19,
"desc": "문제 2/물고기/[만일 5]의 세부 동작 3/모양 숨기기"
},
{
"ele": [
"$[0][3].statements[0][5].type",
"$[0][3].statements[0][5].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 2.19,
"desc": "문제 2/물고기/만일 6/만일 '쓰레기' 에 닿았는가? 라면",
"type": "list"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][5].statements[0][0].type",
"$[0][3].statements[0][5].statements[0][0].params[0]",
"$[0][3].statements[0][5].statements[0][0].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"30"
],
"points": 2.19,
"desc": "문제 2/물고기/[만일 6]의 세부 동작 1/'색깔' 효과를 '30' 만큼 주기"
},
{
"ele": "$[0][3].statements[0][5].statements[0][1].params[*].params",
"answer": [
"으악!",
"2"
],
"points": 2.19,
"desc": "문제 2/물고기/[만일 6]의 세부 동작 2/'으악!' 을 '2' 초 동안 '말하기'"
},
{
"ele": "$[0][3].statements[0][5].statements[0][2].type",
"answer": "erase_all_effects",
"points": 2.19,
"desc": "문제 2/물고기/[만일 6]의 세부 동작 3/효과 모두 지우기"
}
]
},
"5": {
"type": "script",
"ele": "$.objects[?(@.name=~'상어')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.19,
"desc": "문제 2/상어/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].type",
"answer": "hide",
"points": 2.19,
"desc": "문제 2/상어/[시작]의 세부 동작 1/모양 숨기기"
},
{
"type": "list",
"ele": [
"$[0][2].type",
"$[0][2].params[0].type",
"$[0][2].params[0].params[1]",
"$[0][2].params[0].params[2].params[0]"
],
"answer": [
"wait_until_true",
"boolean_basic_operator",
"EQUAL",
"120"
],
"points": 2.19,
"desc": "문제 2/상어/[시작]의 세부 동작 2/'물고기' 의 '크기' = '120' 이 될 때까지 기다리기"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"stop_object",
"other_objects"
],
"points": 2.19,
"desc": "문제 2/상어/[시작]의 세부 동작 3/'다른 오브젝트의' 코드 멈추기",
"type": "list"
},
{
"ele": "$[0][4].type",
"answer": "locate",
"points": 2.19,
"desc": "문제 2/상어/[시작]의 세부 동작 4/'물고기' 위치로 이동하기"
},
{
"ele": "$[0][5].type",
"answer": "show",
"points": 2.19,
"desc": "문제 2/상어/[시작]의 세부 동작 5/모양 보이기"
},
{
"ele": "$[0][6].params[*].params",
"answer": [
"상어로 변했어!",
"2"
],
"points": 2.19,
"desc": "문제 2/상어/[시작]의 세부 동작 6/'상어로 변했어!' 를 '2' 초 동안 '말하기'"
}
]
}
}

870
correct/2506_CAS_2_A.json Normal file
View File

@@ -0,0 +1,870 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='바다1')]",
"points": 1.8,
"desc": "문제 1/장면 1/[배경] 이름 설정 1/이름을 '바다1'로 변경하기",
"sort": 11
},
"1-2": {
"type": "scene",
"ele": "$..objects[?(@.name=='바다2')]",
"points": 1.8,
"desc": "문제 1/장면 2/[배경] 이름 설정 2/이름을 '바다2'로 변경하기",
"sort": 12
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='빨간 물고기')]",
"points": 1.6,
"desc": "문제 1/빨간 물고기/[개체] 이름 설정 1/이름 변경 없음",
"sort": 13
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='노란 물고기')]",
"points": 1.6,
"desc": "문제 1/물고기/[개체] 이름 설정 2/이름을 '노란 물고기'로 변경하기",
"sort": 14
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='쓰레기')]",
"points": 1.6,
"desc": "문제 1/쓰레기/[개체] 이름 설정 3/이름 변경 없음",
"sort": 15
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='상어')]",
"points": 1.6,
"desc": "문제 1/상어(1)/[개체] 이름 설정 4/이름을 '상어'로 변경하기",
"sort": 16
},
"1-7": {
"type": "scene",
"ele": "$..variables[?(@.name=='물고기 수')]",
"points": 1,
"desc": "문제 2/빨간 물고기/변수/'물고기 수' 변수 만들기",
"sort": 101
},
"2-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'빨간 물고기')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/빨간 물고기/시작1/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "30",
"points": 1.2,
"desc": "문제 2/빨간 물고기/[시작1]의 세부 동작 1/크기를 '30' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/만일/만일 '상어' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][0].type",
"$[0][2].statements[0][0].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"1"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 1/'물고기 수'에 '1' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][1].type",
"$[0][2].statements[0][0].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.01"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 2/'0.01' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][2].type",
"answer": "hide",
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 3/모양 숨기기"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][3].type",
"$[0][2].statements[0][0].statements[0][3].params[0].type",
"$[0][2].statements[0][0].statements[0][3].params[0].params[1].params[0]",
"$[0][2].statements[0][0].statements[0][3].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"0.5",
"3"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 4/'0.5 부터 3 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][4].type",
"answer": "show",
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 5/모양 보이기"
},
{
"ele": "$[1][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/빨간 물고기/시작2/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_direction",
null
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[반복]의 세부 동작 1/이동 방향으로 '1 부터 2 사이의 무작위 수' 만큼 움직이기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].type",
"$[1][1].statements[0][1].params[0].params[1].params[0]",
"$[1][1].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"direction_relative",
"calc_rand",
"-1",
"1"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[반복]의 세부 동작 2/이동 방향을 '-1 부터 1 사이의 무작위 수' 만큼 회전하기",
"type": "list"
},
{
"ele": "$[1][1].statements[0][2].type",
"answer": "bounce_wall",
"points": 1.2,
"desc": "문제 2/빨간 물고기/[반복]의 세부 동작 3/화면 끝에 닿으면 튕기기"
}
],
"sort": 102,
"list": [
"set_scale_size",
"repeat_inf"
]
},
"3-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'노란 물고기|물고')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/노란 물고기/시작1/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "30",
"points": 1.2,
"desc": "문제 2/노란 물고기/[시작1]의 세부 동작 1/크기를 '30' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/노란 물고기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/만일/만일 '상어' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][0].type",
"$[0][2].statements[0][0].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"2"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 1/물고기 수'에 '2' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][1].type",
"$[0][2].statements[0][0].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.01"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 2/'0.01' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][2].type",
"answer": "hide",
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 3/모양 숨기기"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][3].type",
"$[0][2].statements[0][0].statements[0][3].params[0].type",
"$[0][2].statements[0][0].statements[0][3].params[0].params[1].params[0]",
"$[0][2].statements[0][0].statements[0][3].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"0.5",
"1.5"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 4/'0.5' 부터 '1.5' 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][4].type",
"answer": "show",
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 5/모양 보이기"
},
{
"ele": "$[1][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/노란 물고기/시작2/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/노란 물고기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_direction",
null
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[반복]의 세부 동작 1/이동 방향으로 '1 부터 2 사이의 무작위 수' 만큼 움직이기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].type",
"$[1][1].statements[0][1].params[0].params[1].params[0]",
"$[1][1].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"direction_relative",
"calc_rand",
"-1",
"1"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[반복]의 세부 동작 2/이동 방향을 '-1 부터 1 사이의 무작위 수' 만큼 회전하기",
"type": "list"
},
{
"ele": "$[1][1].statements[0][2].type",
"answer": "bounce_wall",
"points": 1.2,
"desc": "문제 2/노란 물고기/[반복]의 세부 동작 3/화면 끝에 닿으면 튕기기"
}
],
"sort": 117,
"list": [
"set_scale_size",
"repeat_inf"
]
},
"4-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'쓰레기')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/쓰레기/시작1/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "30",
"points": 1.2,
"desc": "문제 2/쓰레기/[시작1]의 세부 동작 1/크기를 '30' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/쓰레기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.2,
"desc": "문제 2/쓰레기/만일/만일 '상어' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][0].type",
"$[0][2].statements[0][0].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"-1"
],
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 1/물고기 수'에 '-1' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][1].type",
"$[0][2].statements[0][0].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.01"
],
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 2/'0.01' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][2].type",
"answer": "hide",
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 3/모양 숨기기"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][3].type",
"$[0][2].statements[0][0].statements[0][3].params[0].type",
"$[0][2].statements[0][0].statements[0][3].params[0].params[1].params[0]",
"$[0][2].statements[0][0].statements[0][3].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"0.5",
"3"
],
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 4/'0.5 부터 3 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][4].type",
"answer": "show",
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 5/모양 보이기"
},
{
"ele": "$[1][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/쓰레기/시작2/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/쓰레기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_direction",
null
],
"points": 1.2,
"desc": "문제 2/쓰레기/[반복]의 세부 동작 1/이동 방향으로 '1 부터 2 사이의 무작위 수' 만큼 움직이기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].type",
"$[1][1].statements[0][1].params[0].params[1].params[0]",
"$[1][1].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"direction_relative",
"calc_rand",
"-1",
"1"
],
"points": 1.2,
"desc": "문제 2/쓰레기/[반복]의 세부 동작 2/이동 방향을 '-1 부터 1 사이의 무작위 수' 만큼 회전하기",
"type": "list"
},
{
"ele": "$[1][1].statements[0][2].type",
"answer": "bounce_wall",
"points": 1.2,
"desc": "문제 2/쓰레기/[반복]의 세부 동작 3/화면 끝에 닿으면 튕기기"
}
],
"sort": 131,
"list": [
"set_scale_size",
"repeat_inf"
]
},
"44-0": {
"ele": "$.messages[?(@.name=='성공')]",
"points": 1,
"desc": "문제 2/상어/신호/'성공'신호 만들기",
"type": "scene",
"sort": 144
},
"5-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'상어')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/상어/시작1/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "50",
"points": 1.2,
"desc": "문제 2/상어/[시작]의 세부 동작 1/크기를 '50' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"-100",
"0"
],
"points": 1.2,
"desc": "문제 2/상어/[시작]의 세부 동작 2/x: '-100' y: '0' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/상어/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0].type",
"$[0][3].statements[0][0].params[0].params[0].type",
"$[0][3].statements[0][0].params[0].params[1]",
"$[0][3].statements[0][0].params[0].params[2].params[0]"
],
"answer": [
"_if",
"boolean_basic_operator",
"get_variable",
"GREATER",
"10"
],
"points": 1.2,
"desc": "문제 2/상어/만일/만일 '물고기 수' 값 > '10' 이라면",
"type": "list"
},
{
"ele": "$[0][3].statements[0][0].statements[0][0].type",
"answer": "message_cast",
"points": 1.2,
"desc": "문제 2/상어/[만일]의 세부 동작 1/성공' 신호보내기"
},
{
"ele": [
"$[0][3].statements[0][0].statements[0][1].type",
"$[0][3].statements[0][0].statements[0][1].params[0]"
],
"answer": [
"stop_object",
"thisOnly"
],
"points": 1.2,
"desc": "문제 2/상어/[만일]의 세부 동작 2/자신의' 코드 멈추기",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/상어/시작2/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/상어/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"37"
],
"points": 1.2,
"desc": "문제 2/상어/만일1/만일 '왼쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].statements[0][0].type",
"$[1][1].statements[0][0].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"-5"
],
"points": 1.2,
"desc": "문제 2/상어/[만일1]의 세부 동작 1/x 좌표를 '-5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].type",
"$[1][1].statements[0][1].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"39"
],
"points": 1.2,
"desc": "문제 2/상어/만일2/만일 '오른쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].statements[0][0].type",
"$[1][1].statements[0][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"5"
],
"points": 1.2,
"desc": "문제 2/상어/[만일2]의 세부 동작 1/x 좌표를 '5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][2].type",
"$[1][1].statements[0][2].params[0].type",
"$[1][1].statements[0][2].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"38"
],
"points": 1.2,
"desc": "문제 2/상어/만일3/만일 '위쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][2].statements[0][0].type",
"$[1][1].statements[0][2].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"5"
],
"points": 1.2,
"desc": "문제 2/상어/[만일3]의 세부 동작 1/y 좌표를 '5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][3].type",
"$[1][1].statements[0][3].params[0].type",
"$[1][1].statements[0][3].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"40"
],
"points": 1.2,
"desc": "문제 2/상어/만일4/만일 '아래쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][3].statements[0][0].type",
"$[1][1].statements[0][3].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"-5"
],
"points": 1.2,
"desc": "문제 2/상어/[만일4]의 세부 동작 1/y 좌표를 '-5' 만큼 바꾸기",
"type": "list"
},
{
"ele": "$[2][0].type",
"answer": "when_message_cast",
"points": 1.2,
"desc": "문제 2/상어/신호/'성공' 신호를 받았을 때 "
},
{
"ele": "$[2][1].params[*].params",
"answer": [
"배부르다!",
"1"
],
"points": 1.2,
"desc": "문제 2/상어/[신호]의 세부 동작 1/'배부르다!' 를 '1'초 동안 '말하기'"
},
{
"ele": "$[2][2].type",
"answer": "start_neighbor_scene",
"points": 1.2,
"desc": "문제 2/상어/[신호]의 세부 동작 2/'다음' 장면 시작하기"
}
],
"sort": 145,
"list": [
"set_scale_size",
"repeat_inf",
"dialog_time"
]
},
"6-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'바다2|바닷속\\(3\\)1')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_scene_start",
"points": 1.2,
"desc": "문제 2/바다2/장면 2/장면이 시작되었을 때"
},
{
"ele": "$[0][1].type",
"answer": "hide_variable",
"points": 1.2,
"desc": "문제 2/바다2/[장면 2]의 세부 동작 1/변수 '물고기 수' 숨기기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1]"
],
"answer": [
"dialog",
"미션성공!",
"speak"
],
"points": 1.2,
"desc": "문제 2/바다2/[장면 2]의 세부 동작 2/'미션성공!' 을 '말하기'",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 2,
"desc": "문제 3/바다2/오브젝트/오브젝트를 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"30"
],
"points": 2,
"desc": "문제 3/바다2/[오브젝트]의 세부 동작 1/'색깔' 효과를 '30' 만큼 주기",
"type": "list"
},
{
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]",
"$[1][2].params[1]"
],
"answer": [
"dialog",
"처음부터 다시 실행!",
"speak"
],
"points": 2,
"desc": "문제 3/바다2/[오브젝트]의 세부 동작 2/'처음부터 다시 실행!' 을 '말하기'",
"type": "list"
},
{
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]"
],
"answer": [
"wait_second",
"2"
],
"points": 2,
"desc": "문제 3/바다2/[오브젝트]의 세부 동작 3/'2' 초 기다리기",
"type": "list"
},
{
"ele": "$[1][4].type",
"answer": "restart_project",
"points": 2,
"desc": "문제 3/바다2/[오브젝트]의 세부 동작 4/처음부터 다시 실행하기"
}
],
"sort": 166,
"list": [
"hide_variable",
"add_effect_amount"
]
}
}

362
correct/2507_CAT_3_A.json Normal file
View File

@@ -0,0 +1,362 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='실험실')]",
"points": 2,
"desc": "문제 1/교실 뒤(3)/[배경] 이름 설정/이름을 '실험실'으로 변경하기"
},
"1-2": {
"type": "scene",
"ele": "$..objects[?(@.name=='새로운 약')]",
"points": 2,
"desc": "문제 1/물약(빨강)/[개체] 이름 설정 1/이름을 '새로운 약'으로 변경하기"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='불')]",
"points": 2,
"desc": "문제 1/불(2)/[개체] 이름 설정 2/이름을 '불'로 변경하기"
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='마법사')]",
"points": 2,
"desc": "문제 1/꼬마 마법사/[개체] 이름 설정 3/이름을 '마법사'로 변경하기"
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='마법의 약')]",
"points": 2,
"desc": "문제 1/마법의 약/[개체] 이름 설정 4/이름 변경 없음"
},
"2-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'새로운 약|물약')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "문제 2/새로운 약/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": ["locate_xy", "50", "5"],
"points": 2.43,
"desc": "문제 2/새로운 약/[시작]의 세부 동작 1/x: '50' y: '5' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "60",
"points": 2.43,
"desc": "문제 2/새로운 약/[시작]의 세부 동작 2/크기를 '60' 으로 정하기"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 2.43,
"desc": "문제 2/새로운 약/오브젝트/오브젝트를 클릭했을 때"
},
{
"ele": ["$[1][1].type", "$[1][1].params[0]"],
"answer": ["repeat_inf", null],
"points": 2.43,
"desc": "문제 2/새로운 약/반복/계속 반복하기",
"type": "list"
},
{
"ele": "$[1][1].statements[0][0].type",
"answer": "locate",
"points": 2.43,
"desc": "문제 2/새로운 약/[반복]의 세부 동작/'마우스 포인터' 위치로 이동하기"
}
]
},
"3-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'불')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "문제 2/불/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": ["locate_xy", "-150", "-30"],
"points": 2.43,
"desc": "문제 2/불/[시작]의 세부 동작 1/x: '-150' y: '-30' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "90",
"points": 2.43,
"desc": "문제 2/불/[시작]의 세부 동작 2/크기를 '90' 으로 정하기"
},
{
"ele": ["$[0][3].type", "$[0][3].params[0]"],
"answer": ["repeat_inf", null],
"points": 2.43,
"desc": "문제 2/불/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0].params[1].params[0]",
"$[0][3].statements[0][0].params[0].params[3].params[0]",
"$[0][3].statements[0][0].params[1].params[1].params[0]",
"$[0][3].statements[0][0].params[1].params[3].params[0]"
],
"answer": ["locate_xy", "-150", "0", "-10", "40"],
"points": 2.43,
"desc": "문제 2/불/[반복]의 세부 동작 1/x: '-150 부터 0 사이의 무작위 수' y: '-10 부터 40 사이의 무작위 수' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][3].statements[0][1].type",
"answer": "hide",
"points": 2.43,
"desc": "문제 2/불/[반복]의 세부 동작 2/모양 숨기기"
},
{
"ele": [
"$[0][3].statements[0][2].type",
"$[0][3].statements[0][2].params[0].type",
"$[0][3].statements[0][2].params[0].params[1].params[0]",
"$[0][3].statements[0][2].params[0].params[3].params[0]"
],
"answer": ["wait_second", "calc_rand", "1", "2"],
"points": 2.43,
"desc": "문제 2/불/[반복]의 세부 동작 3/'1 부터 2 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][3].statements[0][3].type",
"answer": "show",
"points": 2.43,
"desc": "문제 2/불/[반복]의 세부 동작 4/모양 보이기"
},
{
"ele": [
"$[0][3].statements[0][4].type",
"$[0][3].statements[0][4].params[0].params[0]"
],
"answer": ["wait_second", "0.5"],
"points": 2.43,
"desc": "문제 2/불/[반복]의 세부 동작 5/'0.5' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][5].type",
"$[0][3].statements[0][5].params[0].type"
],
"answer": ["_if", "reach_something"],
"points": 2.43,
"desc": "문제 2/불/만일/만일 '새로운 약' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": "$[0][3].statements[0][5].statements[0][0].params[0].params[0]",
"answer": "300",
"points": 2.43,
"desc": "문제 2/불/[만일]의 세부 동작 1/크기를 '300' 으로 정하기"
},
{
"ele": [
"$[0][3].statements[0][5].statements[0][1].type",
"$[0][3].statements[0][5].statements[0][1].params[0].params[0]",
"$[0][3].statements[0][5].statements[0][1].params[1]"
],
"answer": ["dialog", "마법 실패", "speak"],
"points": 2.43,
"desc": "문제 2/불/[만일]의 세부 동작 2/'마법 실패' 를 '말하기'",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][5].statements[0][2].type",
"$[0][3].statements[0][5].statements[0][2].params[0]"
],
"answer": ["stop_object", "all"],
"points": 2.43,
"desc": "문제 2/불/[만일]의 세부 동작 3/'모든' 코드 멈추기",
"type": "list"
}
]
},
"4-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'마법사')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "문제 2/마법사/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": ["locate_xy", "135", "-20"],
"points": 2.43,
"desc": "문제 2/마법사/[시작]의 세부 동작 1/x: '135' y: '-20' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "180",
"points": 2.43,
"desc": "문제 2/마법사/[시작]의 세부 동작 2/크기를 '180' 으로 정하기"
},
{
"ele": "$[0][3].params[*].params",
"answer": ["마법 실험을 해봐야지!", "2"],
"points": 2.43,
"desc": "문제 2/마법사/[시작]의 세부 동작 3/'마법 실험을 해봐야지!' 를 '2' 초 동안 '말하기'"
}
]
},
"5-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'마법의 약')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "문제 2/마법의 약/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": ["locate_xy", "-40", "10"],
"points": 2.43,
"desc": "문제 2/마법의 약/[시작]의 세부 동작 1/x: '-40' y: '10' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "50",
"points": 2.43,
"desc": "문제 2/마법의 약/[시작]의 세부 동작 2/크기를 '50' 으로 정하기"
},
{
"ele": ["$[0][3].type", "$[0][3].params[0]"],
"answer": ["repeat_inf", null],
"points": 2.43,
"desc": "문제 2/마법의 약/반복/계속 반복하기",
"type": "list"
},
{
"ele": "$[0][3].statements[0][0].type",
"answer": "hide",
"points": 2.43,
"desc": "문제 2/마법의 약/[반복]의 세부 동작 1/모양 숨기기"
},
{
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].params[1].params[0]",
"$[0][3].statements[0][1].params[0].params[3].params[0]"
],
"answer": ["locate_x", "-160", "60"],
"points": 2.43,
"desc": "문제 2/마법의 약/[반복]의 세부 동작 2/x: '-160 부터 60 사이의 무작위 수' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][2].type",
"$[0][3].statements[0][2].params[0].params[0]"
],
"answer": ["wait_second", "2"],
"points": 2.43,
"desc": "문제 2/마법의 약/[반복]의 세부 동작 3/ '2' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][3].statements[0][3].type",
"answer": "show",
"points": 2.43,
"desc": "문제 2/마법의 약/[반복]의 세부 동작 4/모양 보이기"
},
{
"ele": [
"$[0][3].statements[0][4].type",
"$[0][3].statements[0][4].params[0].params[0]"
],
"answer": ["wait_second", "0.5"],
"points": 2.43,
"desc": "문제 2/마법의 약/[반복]의 세부 동작 5/'0.5' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][5].type",
"$[0][3].statements[0][5].params[0].type"
],
"answer": ["_if", "reach_something"],
"points": 2.43,
"desc": "문제 2/마법의 약/만일/만일 '새로운 약' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": "$[0][3].statements[0][5].statements[0][0].params[0].params[0]",
"answer": "100",
"points": 2.43,
"desc": "문제 2/마법의 약/[만일]의 세부 동작 1/크기를 '100' 으로 정하기"
},
{
"ele": [
"$[0][3].statements[0][5].statements[0][1].type",
"$[0][3].statements[0][5].statements[0][1].params[0]",
"$[0][3].statements[0][5].statements[0][1].params[1].params[0]"
],
"answer": ["add_effect_amount", "color", "70"],
"points": 2.43,
"desc": "문제 2/마법의 약/[만일]의 세부 동작 2/'색깔' 효과를 '70' 만큼 주기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][5].statements[0][2].type",
"$[0][3].statements[0][5].statements[0][2].params[0].params[0]",
"$[0][3].statements[0][5].statements[0][2].params[1]"
],
"answer": ["dialog", "마법 성공", "speak"],
"points": 2.43,
"desc": "문제 2/마법의 약/[만일]의 세부 동작 3/'마법 성공' 을 '말하기'",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][5].statements[0][3].type",
"$[0][3].statements[0][5].statements[0][3].params[0]"
],
"answer": ["stop_object", "all"],
"points": 2.43,
"desc": "문제 2/마법의 약/[만일]의 세부 동작 4/'모든' 코드 멈추기",
"type": "list"
}
]
}
}

774
correct/2508_CAS_2_A.json Normal file
View File

@@ -0,0 +1,774 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='우주')]",
"points": 1.7,
"desc": "문제 1/장면 1/[배경] 이름 설정 1/이름을 '우주'로 변경하기",
"sort": 11
},
"1-2": {
"type": "scene",
"ele": "$..objects[?(@.name=='우주정거장')]",
"points": 1.5,
"desc": "문제 1/장면 2/[배경] 이름 설정 2/이름 변경 없음",
"sort": 12
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='에너지원')]",
"points": 1.7,
"desc": "문제 1/물약(빨강)/[개체] 이름 설정 1/이름을 '에너지원'으로 변경하기",
"sort": 13
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='운석')]",
"points": 1.7,
"desc": "문제 1/검은 돌멩이/[개체] 이름 설정 2/이름을 '운석'으로 변경하기",
"sort": 14
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='행성')]",
"points": 1.7,
"desc": "문제 1/행성(5)/[개체] 이름 설정 3/이름을 '행성'으로 변경하기",
"sort": 15
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='우주선')]",
"points": 1.7,
"desc": "문제 1/우주선 탄 엔트리봇/[개체] 이름 설정 4/이름을 '우주선'으로 변경하기",
"sort": 16
},
"1-0": {
"ele": "$..variables[?(@.name=='연료')]",
"points": 1.38,
"desc": "문제 2/에너지원/변수 1/'연료' 변수 만들기 (변수 기본값은 '100', '모든 오브젝트에 사용' 설정하기)",
"type": "scene",
"sort": 101
},
"2-0": {
"ele": "$..variables[?(@.name=='점수')]",
"points": 1.38,
"desc": "문제 2/에너지원/변수 2/'점수' 변수 만들기 (변수 기본값은 '0', '모든 오브젝트에 사용' 설정하기)",
"type": "scene",
"sort": 102
},
"3-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'에너지원')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.38,
"desc": "문제 2/에너지원/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "50",
"points": 1.38,
"desc": "문제 2/에너지원/[시작]의 세부 동작/크기를 '50' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.38,
"desc": "문제 2/에너지원/반복/계속 반복하기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].type",
"answer": "hide",
"points": 1.38,
"desc": "문제 2/에너지원/[반복]의 세부 동작 1/모양 숨기기"
},
{
"ele": [
"$[0][2].statements[0][1].type",
"$[0][2].statements[0][1].params[0].params[1].params[0]",
"$[0][2].statements[0][1].params[0].params[3].params[0]",
"$[0][2].statements[0][1].params[1].params[1].params[0]",
"$[0][2].statements[0][1].params[1].params[3].params[0]"
],
"answer": [
"locate_xy",
"-200",
"200",
"-100",
"100"
],
"points": 1.38,
"desc": "문제 2/에너지원/[반복]의 세부 동작 2/x: '-200 부터 200 사이의 무작위 수' y: '-100 부터 100 사이의 무작위 수' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][2].type",
"$[0][2].statements[0][2].params[0].type",
"$[0][2].statements[0][2].params[0].params[1].params[0]",
"$[0][2].statements[0][2].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"1",
"2"
],
"points": 1.38,
"desc": "문제 2/에너지원/[반복]의 세부 동작 3/'1 부터 2 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][3].type",
"answer": "show",
"points": 1.38,
"desc": "문제 2/에너지원/[반복]의 세부 동작 4/모양 보이기"
},
{
"ele": [
"$[0][2].statements[0][4].type",
"$[0][2].statements[0][4].params[0].params[0]"
],
"answer": [
"wait_second",
"1"
],
"points": 1.38,
"desc": "문제 2/에너지원/[반복]의 세부 동작 5/'1' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][5].type",
"$[0][2].statements[0][5].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.38,
"desc": "문제 2/에너지원/만일/만일 '우주선' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][5].statements[0][0].type",
"$[0][2].statements[0][5].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"10"
],
"points": 1.38,
"desc": "문제 2/에너지원/[만일]의 세부 동작 1/'점수' 에 '10' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][5].statements[0][1].type",
"$[0][2].statements[0][5].statements[0][1].params[1].params[0]"
],
"answer": [
"change_variable",
"50"
],
"points": 1.38,
"desc": "문제 2/에너지원/[만일]의 세부 동작 2/'연료' 에 '50' 만큼 더하기",
"type": "list"
}
],
"sort": 105
},
"4-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'운석|검은 돌멩')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.38,
"desc": "문제 2/운석/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "30",
"points": 1.38,
"desc": "문제 2/운석/[시작]의 세부 동작/크기를 '30' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.38,
"desc": "문제 2/운석/반복/계속 반복하기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].type",
"answer": "hide",
"points": 1.38,
"desc": "문제 2/운석/[반복]의 세부 동작 1/모양 숨기기"
},
{
"ele": [
"$[0][2].statements[0][1].type",
"$[0][2].statements[0][1].params[0].params[1].params[0]",
"$[0][2].statements[0][1].params[0].params[3].params[0]",
"$[0][2].statements[0][1].params[1].params[1].params[0]",
"$[0][2].statements[0][1].params[1].params[3].params[0]"
],
"answer": [
"locate_xy",
"-200",
"200",
"-100",
"100"
],
"points": 1.38,
"desc": "문제 2/운석/[반복]의 세부 동작 2/x: '-200 부터 200 사이의 무작위 수' y: '-100 부터 100 사이의 무작위 수' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][2].type",
"$[0][2].statements[0][2].params[0].type",
"$[0][2].statements[0][2].params[0].params[1].params[0]",
"$[0][2].statements[0][2].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"0",
"3"
],
"points": 1.38,
"desc": "문제 2/운석/[반복]의 세부 동작 3/'0 부터 3 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][3].type",
"answer": "show",
"points": 1.38,
"desc": "문제 2/운석/[반복]의 세부 동작 4/모양 보이기"
},
{
"ele": [
"$[0][2].statements[0][4].type",
"$[0][2].statements[0][4].params[0].params[0]"
],
"answer": [
"wait_second",
"0.5"
],
"points": 1.38,
"desc": "문제 2/운석/[반복]의 세부 동작 5/'0.5' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][5].type",
"$[0][2].statements[0][5].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.38,
"desc": "문제 2/운석/만일/만일 '우주선' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][5].statements[0][0].type",
"$[0][2].statements[0][5].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"-5"
],
"points": 1.38,
"desc": "문제 2/운석/[만일]의 세부 동작/'점수' 에 '-5' 만큼 더하기",
"type": "list"
}
],
"sort": 115
},
"5-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'행성')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.38,
"desc": "문제 2/행성/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"150",
"80"
],
"points": 1.38,
"desc": "문제 2/행성/[시작]의 세부 동작/x: '150' y: '80' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.38,
"desc": "문제 2/행성/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.38,
"desc": "문제 2/행성/만일/만일 '우주선' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][0].type",
"$[0][2].statements[0][0].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"50"
],
"points": 1.38,
"desc": "문제 2/행성/[만일]의 세부 동작 1/'연료' 에 '50' 만큼 더하기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][1].type",
"answer": "hide",
"points": 1.38,
"desc": "문제 2/행성/[만일]의 세부 동작 2/모양 숨기기"
},
{
"ele": [
"$[0][2].statements[0][1].type",
"$[0][2].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"1"
],
"points": 1.38,
"desc": "문제 2/행성/[반복]의 세부 동작 1/'1' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][2].type",
"answer": "show",
"points": 1.38,
"desc": "문제 2/행성/[반복]의 세부 동작 2/모양 보이기"
}
],
"sort": 125
},
"32-0": {
"ele": "$.messages[?(@.name=='탐사 성공')]",
"points": 1.38,
"desc": "문제 2/우주선/신호/'탐사 성공' 신호 만들기",
"type": "scene",
"sort": 132
},
"6-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'우주선')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.38,
"desc": "문제 2/우주선/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.38,
"desc": "문제 2/우주선/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][0].type",
"$[0][1].statements[0][0].params[0].type",
"$[0][1].statements[0][0].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"37"
],
"points": 1.38,
"desc": "문제 2/우주선/만일 1/만일 '왼쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][0].statements[0][0].type",
"$[0][1].statements[0][0].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"-5"
],
"points": 1.38,
"desc": "문제 2/우주선/[만일 1]의 세부 동작 1/x 좌표를 '-5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][0].statements[0][1].type",
"$[0][1].statements[0][0].statements[0][1].params[1].params[0]"
],
"answer": [
"change_variable",
"-1"
],
"points": 1.38,
"desc": "문제 2/우주선/[만일 1]의 세부 동작 2/'연료' 에 '-1' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][1].type",
"$[0][1].statements[0][1].params[0].type",
"$[0][1].statements[0][1].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"39"
],
"points": 1.38,
"desc": "문제 2/우주선/만일 2/만일 '오른쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][1].statements[0][0].type",
"$[0][1].statements[0][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"5"
],
"points": 1.38,
"desc": "문제 2/우주선/[만일 2]의 세부 동작 1/x 좌표를 '5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][1].statements[0][1].type",
"$[0][1].statements[0][1].statements[0][1].params[1].params[0]"
],
"answer": [
"change_variable",
"-1"
],
"points": 1.38,
"desc": "문제 2/우주선/[만일 2]의 세부 동작 2/'연료' 에 '-1' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][2].type",
"$[0][1].statements[0][2].params[0].type",
"$[0][1].statements[0][2].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"38"
],
"points": 1.38,
"desc": "문제 2/우주선/만일 3/만일 '위쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][2].statements[0][0].type",
"$[0][1].statements[0][2].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"5"
],
"points": 1.38,
"desc": "문제 2/우주선/[만일 3]의 세부 동작 1/y 좌표를 '5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][2].statements[0][1].type",
"$[0][1].statements[0][2].statements[0][1].params[1].params[0]"
],
"answer": [
"change_variable",
"-1"
],
"points": 1.38,
"desc": "문제 2/우주선/[만일 3]의 세부 동작 2/'연료' 에 '-1' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][3].type",
"$[0][1].statements[0][3].params[0].type",
"$[0][1].statements[0][3].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"40"
],
"points": 1.38,
"desc": "문제 2/우주선/만일 4/만일 '아래쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][3].statements[0][0].type",
"$[0][1].statements[0][3].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"-5"
],
"points": 1.38,
"desc": "문제 2/우주선/[만일 4]의 세부 동작 1/y 좌표를 '-5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][3].statements[0][1].type",
"$[0][1].statements[0][3].statements[0][1].params[1].params[0]"
],
"answer": [
"change_variable",
"-1"
],
"points": 1.38,
"desc": "문제 2/우주선/[만일 4]의 세부 동작 2/'연료' 에 '-1' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][1].statements[0][4].type",
"$[0][1].statements[0][4].params[0].type"
],
"answer": [
"_if",
"boolean_and_or"
],
"points": 1.38,
"desc": "문제 2/우주선/만일 5/만일 '점수' 값 ≥ '30' '그리고' '연료' 값 > '0'",
"type": "list"
},
{
"ele": "$[0][1].statements[0][4].statements[0][0].params[*].params",
"answer": [
"탐사성공!",
"1"
],
"points": 1.38,
"desc": "문제 2/우주선/[만일 5]의 세부 동작 1/'탐사성공!' 을 '1' 초 동안 '말하기'"
},
{
"ele": "$[0][1].statements[0][4].statements[0][1].type",
"answer": "message_cast",
"points": 1.38,
"desc": "문제 2/우주선/[만일 5]의 세부 동작 2/'탐사 성공' 신호 보내기"
},
{
"ele": [
"$[0][1].statements[0][5].type",
"$[0][1].statements[0][5].params[0].type",
"$[0][1].statements[0][5].params[0].params[0].type",
"$[0][1].statements[0][5].params[0].params[1]",
"$[0][1].statements[0][5].params[0].params[2].params[0]"
],
"answer": [
"_if",
"boolean_basic_operator",
"get_variable",
"LESS_OR_EQUAL",
"0"
],
"points": 1.38,
"desc": "문제 2/우주선/만일 6/만일 '연료' 값 ≤ '0' 이라면",
"type": "list"
},
{
"ele": "$[0][1].statements[0][5].statements[0][0].params[*].params",
"answer": [
"미션실패",
"2"
],
"points": 1.38,
"desc": "문제 2/우주선/[만일 6]의 세부 동작 1/'미션실패' 를 '2' 초 동안 '말하기'"
},
{
"ele": [
"$[0][1].statements[0][5].statements[0][1].type",
"$[0][1].statements[0][5].statements[0][1].params[0]"
],
"answer": [
"stop_object",
"all"
],
"points": 1.38,
"desc": "문제 2/우주선/[만일 6]의 세부 동작 2/'모든' 코드 멈추기",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_message_cast",
"points": 1.38,
"desc": "문제 2/우주선/탐사 성공/'탐사 성공' 신호를 받았을 때 "
},
{
"ele": "$[1][1].type",
"answer": "start_neighbor_scene",
"points": 1.38,
"desc": "문제 2/우주선/[탐사 성공]의 세부 동작/'다음' 장면 시작하기"
}
],
"sort": 133
},
"7-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'우주정거장')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_scene_start",
"points": 1.38,
"desc": "문제 2/우주정거장/장면/장면이 시작되었을 때"
},
{
"ele": "$[0][1].type",
"answer": "hide_variable",
"points": 1.38,
"desc": "문제 2/우주정거장/[장면 2]의 세부 동작 1/변수 '연료' 숨기기"
},
{
"ele": "$[0][2].type",
"answer": "hide_variable",
"points": 1.38,
"desc": "문제 2/우주정거장/[장면 2]의 세부 동작 2/변수 '점수' 숨기기"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0].params[0]",
"$[0][3].params[1]"
],
"answer": [
"dialog",
"탐사 완료!",
"speak"
],
"points": 1.38,
"desc": "문제 2/우주정거장/[장면 2]의 세부 동작 3/'탐사 완료!' 를 '말하기'",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 2,
"desc": "문제 3/우주정거장/오브젝트/오브젝트를 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"50"
],
"points": 2,
"desc": "문제 3/우주정거장/[오브젝트]의 세부 동작 1/'색깔' 효과를 '50' 만큼 주기",
"type": "list"
},
{
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]",
"$[1][2].params[1]"
],
"answer": [
"dialog",
"처음부터 다시 실행합니다.",
"speak"
],
"points": 2,
"desc": "문제 3/우주정거장/[오브젝트]의 세부 동작 2/'처음부터 다시 실행합니다.' 를 '말하기'",
"type": "list"
},
{
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]"
],
"answer": [
"wait_second",
"2"
],
"points": 2,
"desc": "문제 3/우주정거장/[오브젝트]의 세부 동작 3/'2' 초 기다리기",
"type": "list"
},
{
"ele": "$[1][4].type",
"answer": "restart_project",
"points": 2,
"desc": "문제 3/우주정거장/[오브젝트]의 세부 동작 4/처음부터 다시 실행하기"
}
],
"sort": 156
}
}

825
correct/2508_CAS_2_B.json Normal file
View File

@@ -0,0 +1,825 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='체육관')]",
"points": 1.7,
"desc": "문제 1/장면 1/[배경] 이름 설정 1/이름을 '체육관'으로 변경하기",
"sort": 11
},
"1-2": {
"type": "scene",
"ele": "$..objects[?(@.name=='복도')]",
"points": 1.7,
"desc": "문제 1/장면 2/[배경] 이름 설정 2/이름을 '복도'로 변경하기",
"sort": 12
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='곰인형')]",
"points": 1.6,
"desc": "문제 1/곰인형/[개체] 이름 설정 1/이름 변경 없음",
"sort": 13
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='풍선')]",
"points": 1.6,
"desc": "문제 1/풍선/[개체] 이름 설정 2/이름 변경 없음",
"sort": 14
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='다트 날개')]",
"points": 1.7,
"desc": "문제 1/빛나는 효과/[개체] 이름 설정 3/이름을 '다트 날개'로 변경하기",
"sort": 15
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='다트')]",
"points": 1.7,
"desc": "문제 1/룰렛 화살표/[개체] 이름 설정 4/이름을 '다트'로 변경하기",
"sort": 16
},
"1-0": {
"ele": "$..variables[?(@.name=='다트 개수')]",
"points": 1.29,
"desc": "문제 2/곰인형/변수 1/'다트 개수' 변수 만들기 (변수 기본값은 '0', '모든 오브젝트에 사용' 설정하기)",
"type": "scene",
"sort": 101
},
"2-0": {
"ele": "$..variables[?(@.name=='점수')]",
"points": 1.29,
"desc": "문제 2/곰인형/변수 2/'점수' 변수 만들기 (변수 기본값은 '0', '모든 오브젝트에 사용' 설정하기)",
"type": "scene",
"sort": 102
},
"3-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'곰인형')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.29,
"desc": "문제 2/곰인형/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"180",
"-70"
],
"points": 1.29,
"desc": "문제 2/곰인형/[시작]의 세부 동작 1/x: '180' y: '-70' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "25",
"points": 1.29,
"desc": "문제 2/곰인형/[시작]의 세부 동작 2/크기를 '25' 로 정하기"
},
{
"ele": "$[0][3].type",
"answer": "hide",
"points": 1.29,
"desc": "문제 2/곰인형/[시작]의 세부 동작 3/모양 숨기기"
},
{
"ele": [
"$[0][4].type",
"$[0][4].params[0].params[0]"
],
"answer": [
"repeat_basic",
"3"
],
"points": 1.29,
"desc": "문제 2/곰인형/반복/'3' 번 반복하기",
"type": "list"
},
{
"ele": [
"$[0][4].statements[0][0].type",
"$[0][4].statements[0][0].params[0]"
],
"answer": [
"create_clone",
"self"
],
"points": 1.29,
"desc": "문제 2/곰인형/[반복]의 세부 동작 1/'자신' 의 복제본 만들기",
"type": "list"
},
{
"ele": [
"$[0][4].statements[0][1].type",
"$[0][4].statements[0][1].params[0].params[0]"
],
"answer": [
"move_y",
"70"
],
"points": 1.29,
"desc": "문제 2/곰인형/[반복]의 세부 동작 2/y 좌표를 '70' 만큼 바꾸기",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_clone_start",
"points": 1.29,
"desc": "문제 2/곰인형/복제본/복제본이 처음 생성되었을 때"
},
{
"ele": "$[1][1].type",
"answer": "show",
"points": 1.29,
"desc": "문제 2/곰인형/[복제본]의 세부 동작/모양 보이기"
},
{
"ele": [
"$[1][2].type",
"$[1][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.29,
"desc": "문제 2/곰인형/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][2].statements[0][0].type",
"$[1][2].statements[0][0].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.29,
"desc": "문제 2/곰인형/만일/만일 '다트'에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][2].statements[0][0].statements[0][0].type",
"$[1][2].statements[0][0].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"-5"
],
"points": 1.29,
"desc": "문제 2/곰인형/[만일]의 세부 동작 1/'점수' 에 '-5' 만큼 더하기",
"type": "list"
},
{
"ele": "$[1][2].statements[0][0].statements[0][1].type",
"answer": "delete_clone",
"points": 1.29,
"desc": "문제 2/곰인형/[만일]의 세부 동작 2/이 복제본 삭제하기"
}
],
"sort": 105
},
"4-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'풍선')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.29,
"desc": "문제 2/풍선/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"130",
"-100"
],
"points": 1.29,
"desc": "문제 2/풍선/[시작]의 세부 동작 1/x: '130' y: '-100' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "30",
"points": 1.29,
"desc": "문제 2/풍선/[시작]의 세부 동작 2/크기를 '30' 으로 정하기"
},
{
"ele": "$[0][3].type",
"answer": "hide",
"points": 1.29,
"desc": "문제 2/풍선/[시작]의 세부 동작 3/모양 숨기기"
},
{
"ele": [
"$[0][4].type",
"$[0][4].params[0].params[0]"
],
"answer": [
"repeat_basic",
"6"
],
"points": 1.29,
"desc": "문제 2/풍선/반복/'6' 번 반복하기",
"type": "list"
},
{
"ele": [
"$[0][4].statements[0][0].type",
"$[0][4].statements[0][0].params[0]"
],
"answer": [
"create_clone",
"self"
],
"points": 1.29,
"desc": "문제 2/풍선/[반복]의 세부 동작 1/'자신' 의 복제본 만들기",
"type": "list"
},
{
"ele": [
"$[0][4].statements[0][1].type",
"$[0][4].statements[0][1].params[0].params[0]"
],
"answer": [
"move_y",
"40"
],
"points": 1.29,
"desc": "문제 2/풍선/[반복]의 세부 동작 2/y 좌표를 '40' 만큼 바꾸기",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_clone_start",
"points": 1.29,
"desc": "문제 2/풍선/복제본/복제본이 처음 생성되었을 때"
},
{
"ele": "$[1][1].type",
"answer": "show",
"points": 1.29,
"desc": "문제 2/풍선/[복제본]의 세부 동작/모양 보이기"
},
{
"ele": [
"$[1][2].type",
"$[1][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.29,
"desc": "문제 2/풍선/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][2].statements[0][0].type",
"$[1][2].statements[0][0].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.29,
"desc": "문제 2/풍선/만일/만일 '다트' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][2].statements[0][0].statements[0][0].type",
"$[1][2].statements[0][0].statements[0][0].params[0].type"
],
"answer": [
"change_to_some_shape",
"get_pictures"
],
"points": 1.29,
"desc": "문제 2/풍선/[만일]의 세부 동작 1/'풍선_터짐' 모양으로 바꾸기",
"type": "list"
},
{
"ele": [
"$[1][2].statements[0][0].statements[0][1].type",
"$[1][2].statements[0][0].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.5"
],
"points": 1.29,
"desc": "문제 2/풍선/[만일]의 세부 동작 2/'0.5' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[1][2].statements[0][0].statements[0][2].type",
"$[1][2].statements[0][0].statements[0][2].params[1].params[0]"
],
"answer": [
"change_variable",
"10"
],
"points": 1.29,
"desc": "문제 2/풍선/[만일]의 세부 동작 3/'점수' 에 '10' 만큼 더하기",
"type": "list"
},
{
"ele": "$[1][2].statements[0][0].statements[0][3].type",
"answer": "delete_clone",
"points": 1.29,
"desc": "문제 2/풍선/[만일]의 세부 동작 4/이 복제본 삭제하기"
}
],
"sort": 117
},
"5-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'다트 날개|빛나는 효')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.29,
"desc": "문제 2/다트 날개/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "50",
"points": 1.29,
"desc": "문제 2/다트 날개/[시작]의 세부 동작/크기를 '50' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.29,
"desc": "문제 2/다트 날개/반복/계속 반복하기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].type",
"answer": "locate",
"points": 1.29,
"desc": "문제 2/다트 날개/[반복]의 세부 동작 1/'다트' 위치로 이동하기"
},
{
"ele": [
"$[0][2].statements[0][1].type",
"$[0][2].statements[0][1].params[0].params[0]"
],
"answer": [
"move_x",
"-20"
],
"points": 1.29,
"desc": "문제 2/다트 날개/[반복]의 세부 동작 2/x 좌표를 '-20' 만큼 바꾸기",
"type": "list"
}
],
"sort": 132
},
"6-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'다트|룰렛 화살')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.29,
"desc": "문제 2/다트/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[1].params[0]"
],
"answer": [
"set_variable",
"10"
],
"points": 1.29,
"desc": "문제 2/다트/[시작]의 세부 동작 1/'다트 개수' 를 '10' 으로 정하기",
"type": "list"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"-180",
"-20"
],
"points": 1.29,
"desc": "문제 2/다트/[시작]의 세부 동작 2/x: '-180' y: '-20' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0].params[0]"
],
"answer": [
"rotate_absolute",
"90"
],
"points": 1.29,
"desc": "문제 2/다트/[시작]의 세부 동작 3/방향을 '90°' 로 정하기",
"type": "list"
},
{
"ele": "$[0][4].params[0].params[0]",
"answer": "40",
"points": 1.29,
"desc": "문제 2/다트/[시작]의 세부 동작 4/크기를 '40' 으로 정하기"
},
{
"ele": [
"$[0][5].type",
"$[0][5].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.29,
"desc": "문제 2/다트/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][5].statements[0][0].type",
"$[0][5].statements[0][0].params[0].type",
"$[0][5].statements[0][0].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"38"
],
"points": 1.29,
"desc": "문제 2/다트/만일 1/만일 '위쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][5].statements[0][0].statements[0][0].type",
"$[0][5].statements[0][0].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"3"
],
"points": 1.29,
"desc": "문제 2/다트/[만일 1]의 세부 동작/y 좌표를 '3' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][5].statements[0][1].type",
"$[0][5].statements[0][1].params[0].type",
"$[0][5].statements[0][1].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"40"
],
"points": 1.29,
"desc": "문제 2/다트/만일 2/만일 '아래쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][5].statements[0][1].statements[0][0].type",
"$[0][5].statements[0][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"-3"
],
"points": 1.29,
"desc": "문제 2/다트/[만일 2]의 세부 동작/y 좌표를 '-3' 만큼 바꾸기",
"type": "list"
},
{
"ele": "$[1][0].params",
"answer": [
null,
"32"
],
"points": 1.29,
"desc": "문제 2/다트/스페이스/'스페이스' 키를 눌렀을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0].type",
"$[1][1].params[0].params[0].type",
"$[1][1].params[0].params[1]",
"$[1][1].params[0].params[2].params[0]"
],
"answer": [
"if_else",
"boolean_basic_operator",
"get_variable",
"GREATER_OR_EQUAL",
"50"
],
"points": 1.29,
"desc": "문제 2/다트/만일/만일 '점수' 값 ≥ '50' 이라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0]"
],
"answer": [
"stop_object",
"all"
],
"points": 1.29,
"desc": "문제 2/다트/[만일]의 세부 동작/'모든' 코드 멈추기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[1][0].type",
"$[1][1].statements[1][0].params[0].params[0]",
"$[1][1].statements[1][0].params[1].params[0]",
"$[1][1].statements[1][0].params[2].params[0]"
],
"answer": [
"locate_xy_time",
"1",
"330",
null
],
"points": 1.29,
"desc": "문제 2/다트/[아니면]의 세부 동작 1/'1' 초 동안 x: '330' y: '자신의 y 좌푯값' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[1][1].type",
"$[1][1].statements[1][1].params[0].params[0]",
"$[1][1].statements[1][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"-180",
"-20"
],
"points": 1.29,
"desc": "문제 2/다트/[아니면]의 세부 동작 2/x: '-180' y: '-20' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[1][2].type",
"$[1][1].statements[1][2].params[1].params[0]"
],
"answer": [
"change_variable",
"-1"
],
"points": 1.29,
"desc": "문제 2/다트/[아니면]의 세부 동작 3/'다트 개수' 에 '-1' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[1][3].type",
"$[1][1].statements[1][3].params[0].params[0]"
],
"answer": [
"wait_second",
"0.1"
],
"points": 1.29,
"desc": "문제 2/다트/[아니면]의 세부 동작 4/'0.1' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[1][4].type",
"$[1][1].statements[1][4].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.29,
"desc": "문제 2/다트/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[1][4].statements[0][0].type",
"$[1][1].statements[1][4].statements[0][0].params[0].type",
"$[1][1].statements[1][4].statements[0][0].params[0].params[0].params[0].type",
"$[1][1].statements[1][4].statements[0][0].params[0].params[0].params[1]",
"$[1][1].statements[1][4].statements[0][0].params[0].params[0].params[2].params[0]",
"$[1][1].statements[1][4].statements[0][0].params[0].params[1]",
"$[1][1].statements[1][4].statements[0][0].params[0].params[2].type",
"$[1][1].statements[1][4].statements[0][0].params[0].params[2].params[0].type",
"$[1][1].statements[1][4].statements[0][0].params[0].params[2].params[1]",
"$[1][1].statements[1][4].statements[0][0].params[0].params[2].params[2].params[0]"
],
"answer": [
"_if",
"boolean_and_or",
"get_variable",
"EQUAL",
"0",
"AND",
"boolean_basic_operator",
"get_variable",
"LESS",
"50"
],
"points": 1.31,
"desc": "문제 2/다트/만일 1/만일 '다트 개수' 값 = '0' '그리고' '점수 값' < '50' 이라면",
"type": "list"
},
{
"ele": "$[1][1].statements[1][4].statements[0][0].statements[0][0].type",
"answer": "start_neighbor_scene",
"points": 1.29,
"desc": "문제 2/다트/[만일 1]의 세부 동작/'다음' 장면 시작하기"
},
{
"ele": [
"$[1][1].statements[1][4].statements[0][1].type",
"$[1][1].statements[1][4].statements[0][1].params[0].type",
"$[1][1].statements[1][4].statements[0][1].params[0].params[0].type",
"$[1][1].statements[1][4].statements[0][1].params[0].params[1]",
"$[1][1].statements[1][4].statements[0][1].params[0].params[2].params[0]"
],
"answer": [
"_if",
"boolean_basic_operator",
"get_variable",
"GREATER_OR_EQUAL",
"50"
],
"points": 1.29,
"desc": "문제 2/다트/만일 2/만일 '점수' 값 ≥ '50' 이라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[1][4].statements[0][1].statements[0][0].type",
"$[1][1].statements[1][4].statements[0][1].statements[0][0].params[0].params[0]",
"$[1][1].statements[1][4].statements[0][1].statements[0][0].params[1]"
],
"answer": [
"dialog",
"미션 성공!",
"speak"
],
"points": 1.29,
"desc": "문제 2/다트/[만일 2]의 세부 동작 1/'미션 성공!' 을 '말하기'",
"type": "list"
},
{
"ele": [
"$[1][1].statements[1][4].statements[0][1].statements[0][1].type",
"$[1][1].statements[1][4].statements[0][1].statements[0][1].params[0]"
],
"answer": [
"stop_object",
"all"
],
"points": 1.29,
"desc": "문제 2/다트/[만일 2]의 세부 동작 2/'모든' 코드 멈추기",
"type": "list"
}
],
"sort": 137
},
"7-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'복도|장면 ')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_scene_start",
"points": 1.29,
"desc": "문제 2/복도/장면/장면이 시작되었을 때"
},
{
"ele": "$[0][1].type",
"answer": "hide_variable",
"points": 1.29,
"desc": "문제 2/복도/[장면 2]의 세부 동작 1/변수 '다트 개수' 숨기기"
},
{
"ele": "$[0][2].type",
"answer": "hide_variable",
"points": 1.29,
"desc": "문제 2/복도/[장면 2]의 세부 동작 2/변수 '점수' 숨기기"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0].params[0]",
"$[0][3].params[1]"
],
"answer": [
"dialog",
"미션 실패!",
"speak"
],
"points": 1.29,
"desc": "문제 2/복도/[장면 2]의 세부 동작 3/'미션 실패!' 를 '말하기'",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 2,
"desc": "문제 3/복도/오브젝트/오브젝트를 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"60"
],
"points": 2,
"desc": "문제 3/복도/[오브젝트]의 세부 동작 1/'색깔' 효과를 '60' 만큼 주기",
"type": "list"
},
{
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]",
"$[1][2].params[1]"
],
"answer": [
"dialog",
"처음부터 다시 실행합니다.",
"speak"
],
"points": 2,
"desc": "문제 3/복도/[오브젝트]의 세부 동작 2/'처음부터 다시 실행합니다.' 를 '말하기'",
"type": "list"
},
{
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]"
],
"answer": [
"wait_second",
"2"
],
"points": 2,
"desc": "문제 3/복도/[오브젝트]의 세부 동작 3/'2' 초 기다리기",
"type": "list"
},
{
"ele": "$[1][4].type",
"answer": "restart_project",
"points": 2,
"desc": "문제 3/복도/[오브젝트]의 세부 동작 4/처음부터 다시 실행하기"
}
],
"sort": 160
}
}

557
correct/2509_CAT_3_A.json Normal file
View File

@@ -0,0 +1,557 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='화산')]",
"points": 2,
"desc": "문제 1/화산섬/[배경] 이름 설정/이름을 '화산'으로 변경하기",
"sort": 11
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='불')]",
"points": 2,
"desc": "문제 1/불(2)/[개체] 이름 설정 1/이름을 '불'로 변경하기",
"sort": 13
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='공룡')]",
"points": 2,
"desc": "문제 1/공룡/[개체] 이름 설정 2/이름 변경 없음",
"sort": 14
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='알')]",
"points": 2,
"desc": "문제 1/계란/[개체] 이름 설정 3/이름을 '알'로 변경하기",
"sort": 15
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='바위')]",
"points": 2,
"desc": "문제 1/바위(4)/[개체] 이름 설정 4/이름을 '바위'로 변경하기",
"sort": 16
},
"2-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'불')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.14,
"desc": "문제 2/불/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"120",
"90"
],
"points": 2.14,
"desc": "문제 2/불/[시작]의 세부 동작 1/x: '120' y: '90' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "130",
"points": 2.14,
"desc": "문제 2/불/[시작]의 세부 동작 2/크기를 '130' 으로 정하기"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 2.14,
"desc": "문제 2/불/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0].type"
],
"answer": [
"change_to_some_shape",
"get_pictures"
],
"points": 2.14,
"desc": "문제 2/불/[반복]의 세부 동작 1/'불(2)_3' 모양으로 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.5"
],
"points": 2.14,
"desc": "문제 2/불/[반복]의 세부 동작 2/'0.5' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][2].type",
"$[0][3].statements[0][2].params[0].type"
],
"answer": [
"change_to_some_shape",
"get_pictures"
],
"points": 2.14,
"desc": "문제 2/불/[반복]의 세부 동작 3/'불(2)_1' 모양으로 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][3].type",
"$[0][3].statements[0][3].params[0].params[0]"
],
"answer": [
"wait_second",
"0.5"
],
"points": 2.14,
"desc": "문제 2/불/[반복]의 세부 동작 4/'0.5' 초 기다리기",
"type": "list"
}
],
"sort": 102
},
"3-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'공룡')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.14,
"desc": "문제 2/공룡/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"0",
"-20"
],
"points": 2.14,
"desc": "문제 2/공룡/[시작]의 세부 동작 1/x: '0' y: '-20' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"공룡알을 구하자",
"1"
],
"points": 2.14,
"desc": "문제 2/공룡/[시작]의 세부 동작 2/'공룡알을 구하자' 를 '1' 초 동안 '말하기'"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 2.14,
"desc": "문제 2/공룡/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0].type",
"$[0][3].statements[0][0].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"38"
],
"points": 2.14,
"desc": "문제 2/공룡/만일 1/만일 '위쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].statements[0][0].type",
"$[0][3].statements[0][0].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"5"
],
"points": 2.14,
"desc": "문제 2/공룡/[만일 1]의 세부 동작/y 좌표를 '5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].type",
"$[0][3].statements[0][1].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"40"
],
"points": 2.14,
"desc": "문제 2/공룡/만일 2/만일 '아래쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][1].statements[0][0].type",
"$[0][3].statements[0][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"-5"
],
"points": 2.14,
"desc": "문제 2/공룡/[만일 2]의 세부 동작/y 좌표를 '-5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][2].type",
"$[0][3].statements[0][2].params[0].type",
"$[0][3].statements[0][2].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"37"
],
"points": 2.14,
"desc": "문제 2/공룡/만일 3/만일 '왼쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][2].statements[0][0].type",
"$[0][3].statements[0][2].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"-5"
],
"points": 2.14,
"desc": "문제 2/공룡/[만일 3]의 세부 동작/x 좌표를 '-5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][3].type",
"$[0][3].statements[0][3].params[0].type",
"$[0][3].statements[0][3].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"39"
],
"points": 2.14,
"desc": "문제 2/공룡/만일 4/만일 '오른쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][3].statements[0][0].type",
"$[0][3].statements[0][3].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"5"
],
"points": 2.14,
"desc": "문제 2/공룡/[만일 4]의 세부 동작/x 좌표를 '5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][4].type",
"$[0][3].statements[0][4].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 2.14,
"desc": "문제 2/공룡/만일 5/만일 '불' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][4].statements[0][0].type",
"$[0][3].statements[0][4].statements[0][0].params[0].params[0]",
"$[0][3].statements[0][4].statements[0][0].params[1]"
],
"answer": [
"dialog",
"앗 뜨거워!",
"speak"
],
"points": 2.14,
"desc": "문제 2/공룡/[만일 5]의 세부 동작 1/'앗 뜨거워!' 를 '말하기'",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][4].statements[0][1].type",
"$[0][3].statements[0][4].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"1"
],
"points": 2.14,
"desc": "문제 2/공룡/[만일 5]의 세부 동작 2/'1' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][4].statements[0][2].type",
"$[0][3].statements[0][4].statements[0][2].params[0]"
],
"answer": [
"stop_object",
"all"
],
"points": 2.14,
"desc": "문제 2/공룡/[만일 5]의 세부 동작 3/'모든' 코드 멈추기",
"type": "list"
}
],
"sort": 110
},
"4-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'알|계')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.14,
"desc": "문제 2/알/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "50",
"points": 2.14,
"desc": "문제 2/알/[시작]의 세부 동작 1/크기를 '50' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]"
],
"answer": [
"rotate_absolute",
"270"
],
"points": 2.14,
"desc": "문제 2/알/[시작]의 세부 동작 2/방향을 '270°' 로 정하기",
"type": "list"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 2.14,
"desc": "문제 2/알/반복/계속 반복하기",
"type": "list"
},
{
"ele": "$[0][3].statements[0][0].type",
"answer": "show",
"points": 2.14,
"desc": "문제 2/알/[반복]의 세부 동작 1/모양 보이기"
},
{
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].params[1].params[0]",
"$[0][3].statements[0][1].params[0].params[3].params[0]",
"$[0][3].statements[0][1].params[1].params[1].params[0]",
"$[0][3].statements[0][1].params[1].params[3].params[0]"
],
"answer": [
"locate_xy",
"55",
"160",
"5",
"10"
],
"points": 2.2,
"desc": "문제 2/알/[반복]의 세부 동작 2/x: '55 부터 160 사이의 무작위 수' y: '5 부터 10 사이의 무작위 수' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][2].type",
"$[0][3].statements[0][2].params[0].params[0]",
"$[0][3].statements[0][2].params[1].params[1].params[0]",
"$[0][3].statements[0][2].params[1].params[3].params[0]",
"$[0][3].statements[0][2].params[2].params[0]"
],
"answer": [
"move_xy_time",
"2",
"-200",
"200",
"-140"
],
"points": 2.2,
"desc": "문제 2/알/[반복]의 세부 동작 3/'2' 초 동안 x: '-200 부터 200 사이의 무작위 수' y: '-140' 만큼 움직이기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][3].type",
"$[0][3].statements[0][3].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 2.14,
"desc": "문제 2/알/만일/만일 '바위' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": "$[0][3].statements[0][3].statements[0][0].params[*].params",
"answer": [
"공룡알이 깨졌다!",
"0.2"
],
"points": 2.14,
"desc": "문제 2/알/[만일]의 세부 동작 1/'공룡알이 깨졌다!' 를 '0.2' 초 동안 '말하기'"
},
{
"ele": "$[0][3].statements[0][3].statements[0][1].type",
"answer": "hide",
"points": 2.14,
"desc": "문제 2/알/[만일]의 세부 동작 2/모양 숨기기"
},
{
"ele": "$[1][0].params",
"answer": [
null,
"32"
],
"points": 2.14,
"desc": "문제 2/알/스페이스/'스페이스' 키를 눌렀을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 2.14,
"desc": "문제 2/알/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 2.14,
"desc": "문제 2/알/만일/만일 '공룡' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": "$[1][1].statements[0][0].statements[0][0].type",
"answer": "locate",
"points": 2.14,
"desc": "문제 2/알/[만일]의 세부 동작 1/'공룡' 위치로 이동하기"
},
{
"ele": [
"$[1][1].statements[0][0].statements[0][1].type",
"$[1][1].statements[0][0].statements[0][1].params[0].params[0]"
],
"answer": [
"move_x",
"-20"
],
"points": 2.14,
"desc": "문제 2/알/[만일]의 세부 동작 2/x 좌표를 '-20' 만큼 바꾸기",
"type": "list"
}
],
"sort": 126
},
"5-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'바위')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.14,
"desc": "문제 2/바위/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": [
"locate_xy",
"130",
"-120"
],
"points": 2.14,
"desc": "문제 2/바위/[시작]의 세부 동작 1/x: '130' y: '-120' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "150",
"points": 2.14,
"desc": "문제 2/바위/[시작]의 세부 동작 2/크기를 '150' 으로 정하기"
}
],
"sort": 141
}
}

1008
correct/2510_CAS_2_A.json Normal file

File diff suppressed because it is too large Load Diff

877
correct/_2508_CAS_2_A.json Normal file
View File

@@ -0,0 +1,877 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='우주')]",
"points": 1.8,
"desc": "장면 1/[배경] 이름 설정 1/이름을 ‘우주’로 변경하기",
"sort": 11
},
"1-2": {
"type": "scene",
"ele": "$..objects[?(@.name=='우주정거장')]",
"points": 1.8,
"desc": "장면 2/[배경] 이름 설정 2/이름 변경 없음",
"sort": 12
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='에너지원')]",
"points": 1.6,
"desc": "물약(빨강)/[개체] 이름 설정 1/이름을 ‘에너지원’으로 변경하기",
"sort": 13
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='운석')]",
"points": 1.6,
"desc": "검은 돌멩이/[개체] 이름 설정 2/이름을 ‘운석’으로 변경하기",
"sort": 14
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='행성')]",
"points": 1.6,
"desc": "행성(5)/[개체] 이름 설정 3/이름을 ‘행성’으로 변경하기",
"sort": 15
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='우주선')]",
"points": 1.6,
"desc": "우주선 탄 엔트리봇/[개체] 이름 설정 4/이름을 ‘우주선’으로 변경하기",
"sort": 16
},
"1-7": {
"type": "scene",
"ele": "$..variables[?(@.name=='연료')]",
"points": 1,
"desc": "문제 2/에너지원/변수 1/‘연료’변수 만들기 (변수 기본값은 100, ‘모든 오브젝트에 사용’ 설정하기)",
"sort": 101
},
"1-8": {
"type": "scene",
"ele": "$..variables[?(@.name=='점수')]",
"points": 1,
"desc": "문제 2/에너지원/변수 2/‘점수’ 변수 만들기 (변수 기본값은 0, ‘모든 오브젝트에 사용’ 설정하기)",
"sort": 102
},
"2-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'에너지원')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/에너지원/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "50",
"points": 1.2,
"desc": "문제 2/에너지원/[시작]의 세부 동작/크기를 50 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/에너지원/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0]"
],
"answer": [
"hide",
null
],
"points": 1.2,
"desc": "문제 2/에너지원/[반복]의 세부 동작 1/모양 숨기기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][0].type",
"$[0][2].statements[0][0].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"1"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 1/'물고기 수'에 '1' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][1].type",
"$[0][2].statements[0][0].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.01"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 2/'0.01' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][2].type",
"answer": "hide",
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 3/모양 숨기기"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][3].type",
"$[0][2].statements[0][0].statements[0][3].params[0].type",
"$[0][2].statements[0][0].statements[0][3].params[0].params[1].params[0]",
"$[0][2].statements[0][0].statements[0][3].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"0.5",
"3"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 4/'0.5 부터 3 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][4].type",
"answer": "show",
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 5/모양 보이기"
},
{
"ele": "$[1][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/빨간 물고기/시작2/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_direction",
null
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[반복]의 세부 동작 1/이동 방향으로 '1 부터 2 사이의 무작위 수' 만큼 움직이기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].type",
"$[1][1].statements[0][1].params[0].params[1].params[0]",
"$[1][1].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"direction_relative",
"calc_rand",
"-1",
"1"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[반복]의 세부 동작 2/이동 방향을 '-1 부터 1 사이의 무작위 수' 만큼 회전하기",
"type": "list"
},
{
"ele": "$[1][1].statements[0][2].type",
"answer": "bounce_wall",
"points": 1.2,
"desc": "문제 2/빨간 물고기/[반복]의 세부 동작 3/화면 끝에 닿으면 튕기기"
}
],
"sort": 102,
"list": [
"set_scale_size",
"repeat_inf"
]
},
"3-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'노란 물고기|물고')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/노란 물고기/시작1/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "30",
"points": 1.2,
"desc": "문제 2/노란 물고기/[시작1]의 세부 동작 1/크기를 '30' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/노란 물고기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/만일/만일 '상어' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][0].type",
"$[0][2].statements[0][0].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"2"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 1/물고기 수'에 '2' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][1].type",
"$[0][2].statements[0][0].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.01"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 2/'0.01' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][2].type",
"answer": "hide",
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 3/모양 숨기기"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][3].type",
"$[0][2].statements[0][0].statements[0][3].params[0].type",
"$[0][2].statements[0][0].statements[0][3].params[0].params[1].params[0]",
"$[0][2].statements[0][0].statements[0][3].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"0.5",
"1.5"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 4/'0.5' 부터 '1.5' 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][4].type",
"answer": "show",
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 5/모양 보이기"
},
{
"ele": "$[1][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/노란 물고기/시작2/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/노란 물고기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_direction",
null
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[반복]의 세부 동작 1/이동 방향으로 '1 부터 2 사이의 무작위 수' 만큼 움직이기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].type",
"$[1][1].statements[0][1].params[0].params[1].params[0]",
"$[1][1].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"direction_relative",
"calc_rand",
"-1",
"1"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[반복]의 세부 동작 2/이동 방향을 '-1 부터 1 사이의 무작위 수' 만큼 회전하기",
"type": "list"
},
{
"ele": "$[1][1].statements[0][2].type",
"answer": "bounce_wall",
"points": 1.2,
"desc": "문제 2/노란 물고기/[반복]의 세부 동작 3/화면 끝에 닿으면 튕기기"
}
],
"sort": 117,
"list": [
"set_scale_size",
"repeat_inf"
]
},
"4-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'쓰레기')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/쓰레기/시작1/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "30",
"points": 1.2,
"desc": "문제 2/쓰레기/[시작1]의 세부 동작 1/크기를 '30' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/쓰레기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.2,
"desc": "문제 2/쓰레기/만일/만일 '상어' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][0].type",
"$[0][2].statements[0][0].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"-1"
],
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 1/물고기 수'에 '-1' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][1].type",
"$[0][2].statements[0][0].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.01"
],
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 2/'0.01' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][2].type",
"answer": "hide",
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 3/모양 숨기기"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][3].type",
"$[0][2].statements[0][0].statements[0][3].params[0].type",
"$[0][2].statements[0][0].statements[0][3].params[0].params[1].params[0]",
"$[0][2].statements[0][0].statements[0][3].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"0.5",
"3"
],
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 4/'0.5 부터 3 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][4].type",
"answer": "show",
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 5/모양 보이기"
},
{
"ele": "$[1][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/쓰레기/시작2/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/쓰레기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_direction",
null
],
"points": 1.2,
"desc": "문제 2/쓰레기/[반복]의 세부 동작 1/이동 방향으로 '1 부터 2 사이의 무작위 수' 만큼 움직이기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].type",
"$[1][1].statements[0][1].params[0].params[1].params[0]",
"$[1][1].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"direction_relative",
"calc_rand",
"-1",
"1"
],
"points": 1.2,
"desc": "문제 2/쓰레기/[반복]의 세부 동작 2/이동 방향을 '-1 부터 1 사이의 무작위 수' 만큼 회전하기",
"type": "list"
},
{
"ele": "$[1][1].statements[0][2].type",
"answer": "bounce_wall",
"points": 1.2,
"desc": "문제 2/쓰레기/[반복]의 세부 동작 3/화면 끝에 닿으면 튕기기"
}
],
"sort": 131,
"list": [
"set_scale_size",
"repeat_inf"
]
},
"44-0": {
"ele": "$.messages[?(@.name=='성공')]",
"points": 1,
"desc": "문제 2/상어/신호/'성공'신호 만들기",
"type": "scene",
"sort": 144
},
"5-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'상어')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/상어/시작1/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "50",
"points": 1.2,
"desc": "문제 2/상어/[시작]의 세부 동작 1/크기를 '50' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"-100",
"0"
],
"points": 1.2,
"desc": "문제 2/상어/[시작]의 세부 동작 2/x: '-100' y: '0' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/상어/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0].type",
"$[0][3].statements[0][0].params[0].params[0].type",
"$[0][3].statements[0][0].params[0].params[1]",
"$[0][3].statements[0][0].params[0].params[2].params[0]"
],
"answer": [
"_if",
"boolean_basic_operator",
"get_variable",
"GREATER",
"10"
],
"points": 1.2,
"desc": "문제 2/상어/만일/만일 '물고기 수' 값 > '10' 이라면",
"type": "list"
},
{
"ele": "$[0][3].statements[0][0].statements[0][0].type",
"answer": "message_cast",
"points": 1.2,
"desc": "문제 2/상어/[만일]의 세부 동작 1/성공' 신호보내기"
},
{
"ele": [
"$[0][3].statements[0][0].statements[0][1].type",
"$[0][3].statements[0][0].statements[0][1].params[0]"
],
"answer": [
"stop_object",
"thisOnly"
],
"points": 1.2,
"desc": "문제 2/상어/[만일]의 세부 동작 2/자신의' 코드 멈추기",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/상어/시작2/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/상어/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"37"
],
"points": 1.2,
"desc": "문제 2/상어/만일1/만일 '왼쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].statements[0][0].type",
"$[1][1].statements[0][0].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"-5"
],
"points": 1.2,
"desc": "문제 2/상어/[만일1]의 세부 동작 1/x 좌표를 '-5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].type",
"$[1][1].statements[0][1].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"39"
],
"points": 1.2,
"desc": "문제 2/상어/만일2/만일 '오른쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].statements[0][0].type",
"$[1][1].statements[0][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"5"
],
"points": 1.2,
"desc": "문제 2/상어/[만일2]의 세부 동작 1/x 좌표를 '5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][2].type",
"$[1][1].statements[0][2].params[0].type",
"$[1][1].statements[0][2].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"38"
],
"points": 1.2,
"desc": "문제 2/상어/만일3/만일 '위쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][2].statements[0][0].type",
"$[1][1].statements[0][2].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"5"
],
"points": 1.2,
"desc": "문제 2/상어/[만일3]의 세부 동작 1/y 좌표를 '5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][3].type",
"$[1][1].statements[0][3].params[0].type",
"$[1][1].statements[0][3].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"40"
],
"points": 1.2,
"desc": "문제 2/상어/만일4/만일 '아래쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][3].statements[0][0].type",
"$[1][1].statements[0][3].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"-5"
],
"points": 1.2,
"desc": "문제 2/상어/[만일4]의 세부 동작 1/y 좌표를 '-5' 만큼 바꾸기",
"type": "list"
},
{
"ele": "$[2][0].type",
"answer": "when_message_cast",
"points": 1.2,
"desc": "문제 2/상어/신호/'성공' 신호를 받았을 때 "
},
{
"ele": "$[2][1].params[*].params",
"answer": [
"배부르다!",
"1"
],
"points": 1.2,
"desc": "문제 2/상어/[신호]의 세부 동작 1/'배부르다!' 를 '1'초 동안 '말하기'"
},
{
"ele": "$[2][2].type",
"answer": "start_neighbor_scene",
"points": 1.2,
"desc": "문제 2/상어/[신호]의 세부 동작 2/'다음' 장면 시작하기"
}
],
"sort": 145,
"list": [
"set_scale_size",
"repeat_inf",
"dialog_time"
]
},
"6-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'바다2|바닷속\\(3\\)1')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_scene_start",
"points": 1.2,
"desc": "문제 2/바다2/장면 2/장면이 시작되었을 때"
},
{
"ele": "$[0][1].type",
"answer": "hide_variable",
"points": 1.2,
"desc": "문제 2/바다2/[장면 2]의 세부 동작 1/변수 '물고기 수' 숨기기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1]"
],
"answer": [
"dialog",
"미션성공!",
"speak"
],
"points": 1.2,
"desc": "문제 2/바다2/[장면 2]의 세부 동작 2/'미션성공!' 을 '말하기'",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 2,
"desc": "문제 3/바다2/오브젝트/오브젝트를 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"30"
],
"points": 2,
"desc": "문제 3/바다2/[오브젝트]의 세부 동작 1/'색깔' 효과를 '30' 만큼 주기",
"type": "list"
},
{
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]",
"$[1][2].params[1]"
],
"answer": [
"dialog",
"처음부터 다시 실행!",
"speak"
],
"points": 2,
"desc": "문제 3/바다2/[오브젝트]의 세부 동작 2/'처음부터 다시 실행!' 을 '말하기'",
"type": "list"
},
{
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]"
],
"answer": [
"wait_second",
"2"
],
"points": 2,
"desc": "문제 3/바다2/[오브젝트]의 세부 동작 3/'2' 초 기다리기",
"type": "list"
},
{
"ele": "$[1][4].type",
"answer": "restart_project",
"points": 2,
"desc": "문제 3/바다2/[오브젝트]의 세부 동작 4/처음부터 다시 실행하기"
}
],
"sort": 166,
"list": [
"hide_variable",
"add_effect_amount"
]
}
}

870
correct/_2508_CAS_2_B.json Normal file
View File

@@ -0,0 +1,870 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='바다1')]",
"points": 1.8,
"desc": "문제 1/장면 1/[배경] 이름 설정 1/이름을 '바다1'로 변경하기",
"sort": 11
},
"1-2": {
"type": "scene",
"ele": "$..objects[?(@.name=='바다2')]",
"points": 1.8,
"desc": "문제 1/장면 2/[배경] 이름 설정 2/이름을 '바다2'로 변경하기",
"sort": 12
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='빨간 물고기')]",
"points": 1.6,
"desc": "문제 1/빨간 물고기/[개체] 이름 설정 1/이름 변경 없음",
"sort": 13
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='노란 물고기')]",
"points": 1.6,
"desc": "문제 1/물고기/[개체] 이름 설정 2/이름을 '노란 물고기'로 변경하기",
"sort": 14
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='쓰레기')]",
"points": 1.6,
"desc": "문제 1/쓰레기/[개체] 이름 설정 3/이름 변경 없음",
"sort": 15
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='상어')]",
"points": 1.6,
"desc": "문제 1/상어(1)/[개체] 이름 설정 4/이름을 '상어'로 변경하기",
"sort": 16
},
"1-7": {
"type": "scene",
"ele": "$..variables[?(@.name=='물고기 수')]",
"points": 1,
"desc": "문제 2/빨간 물고기/변수/'물고기 수' 변수 만들기",
"sort": 101
},
"2-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'빨간 물고기')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/빨간 물고기/시작1/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "30",
"points": 1.2,
"desc": "문제 2/빨간 물고기/[시작1]의 세부 동작 1/크기를 '30' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/만일/만일 '상어' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][0].type",
"$[0][2].statements[0][0].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"1"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 1/'물고기 수'에 '1' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][1].type",
"$[0][2].statements[0][0].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.01"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 2/'0.01' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][2].type",
"answer": "hide",
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 3/모양 숨기기"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][3].type",
"$[0][2].statements[0][0].statements[0][3].params[0].type",
"$[0][2].statements[0][0].statements[0][3].params[0].params[1].params[0]",
"$[0][2].statements[0][0].statements[0][3].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"0.5",
"3"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 4/'0.5 부터 3 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][4].type",
"answer": "show",
"points": 1.2,
"desc": "문제 2/빨간 물고기/[만일]의 세부 동작 5/모양 보이기"
},
{
"ele": "$[1][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/빨간 물고기/시작2/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_direction",
null
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[반복]의 세부 동작 1/이동 방향으로 '1 부터 2 사이의 무작위 수' 만큼 움직이기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].type",
"$[1][1].statements[0][1].params[0].params[1].params[0]",
"$[1][1].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"direction_relative",
"calc_rand",
"-1",
"1"
],
"points": 1.2,
"desc": "문제 2/빨간 물고기/[반복]의 세부 동작 2/이동 방향을 '-1 부터 1 사이의 무작위 수' 만큼 회전하기",
"type": "list"
},
{
"ele": "$[1][1].statements[0][2].type",
"answer": "bounce_wall",
"points": 1.2,
"desc": "문제 2/빨간 물고기/[반복]의 세부 동작 3/화면 끝에 닿으면 튕기기"
}
],
"sort": 102,
"list": [
"set_scale_size",
"repeat_inf"
]
},
"3-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'노란 물고기|물고')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/노란 물고기/시작1/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "30",
"points": 1.2,
"desc": "문제 2/노란 물고기/[시작1]의 세부 동작 1/크기를 '30' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/노란 물고기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/만일/만일 '상어' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][0].type",
"$[0][2].statements[0][0].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"2"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 1/물고기 수'에 '2' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][1].type",
"$[0][2].statements[0][0].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.01"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 2/'0.01' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][2].type",
"answer": "hide",
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 3/모양 숨기기"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][3].type",
"$[0][2].statements[0][0].statements[0][3].params[0].type",
"$[0][2].statements[0][0].statements[0][3].params[0].params[1].params[0]",
"$[0][2].statements[0][0].statements[0][3].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"0.5",
"1.5"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 4/'0.5' 부터 '1.5' 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][4].type",
"answer": "show",
"points": 1.2,
"desc": "문제 2/노란 물고기/[만일]의 세부 동작 5/모양 보이기"
},
{
"ele": "$[1][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/노란 물고기/시작2/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/노란 물고기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_direction",
null
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[반복]의 세부 동작 1/이동 방향으로 '1 부터 2 사이의 무작위 수' 만큼 움직이기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].type",
"$[1][1].statements[0][1].params[0].params[1].params[0]",
"$[1][1].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"direction_relative",
"calc_rand",
"-1",
"1"
],
"points": 1.2,
"desc": "문제 2/노란 물고기/[반복]의 세부 동작 2/이동 방향을 '-1 부터 1 사이의 무작위 수' 만큼 회전하기",
"type": "list"
},
{
"ele": "$[1][1].statements[0][2].type",
"answer": "bounce_wall",
"points": 1.2,
"desc": "문제 2/노란 물고기/[반복]의 세부 동작 3/화면 끝에 닿으면 튕기기"
}
],
"sort": 117,
"list": [
"set_scale_size",
"repeat_inf"
]
},
"4-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'쓰레기')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/쓰레기/시작1/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "30",
"points": 1.2,
"desc": "문제 2/쓰레기/[시작1]의 세부 동작 1/크기를 '30' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/쓰레기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].type",
"$[0][2].statements[0][0].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.2,
"desc": "문제 2/쓰레기/만일/만일 '상어' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][0].type",
"$[0][2].statements[0][0].statements[0][0].params[1].params[0]"
],
"answer": [
"change_variable",
"-1"
],
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 1/물고기 수'에 '-1' 만큼 더하기",
"type": "list"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][1].type",
"$[0][2].statements[0][0].statements[0][1].params[0].params[0]"
],
"answer": [
"wait_second",
"0.01"
],
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 2/'0.01' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][2].type",
"answer": "hide",
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 3/모양 숨기기"
},
{
"ele": [
"$[0][2].statements[0][0].statements[0][3].type",
"$[0][2].statements[0][0].statements[0][3].params[0].type",
"$[0][2].statements[0][0].statements[0][3].params[0].params[1].params[0]",
"$[0][2].statements[0][0].statements[0][3].params[0].params[3].params[0]"
],
"answer": [
"wait_second",
"calc_rand",
"0.5",
"3"
],
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 4/'0.5 부터 3 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][2].statements[0][0].statements[0][4].type",
"answer": "show",
"points": 1.2,
"desc": "문제 2/쓰레기/[만일]의 세부 동작 5/모양 보이기"
},
{
"ele": "$[1][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/쓰레기/시작2/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/쓰레기/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_direction",
null
],
"points": 1.2,
"desc": "문제 2/쓰레기/[반복]의 세부 동작 1/이동 방향으로 '1 부터 2 사이의 무작위 수' 만큼 움직이기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].type",
"$[1][1].statements[0][1].params[0].params[1].params[0]",
"$[1][1].statements[0][1].params[0].params[3].params[0]"
],
"answer": [
"direction_relative",
"calc_rand",
"-1",
"1"
],
"points": 1.2,
"desc": "문제 2/쓰레기/[반복]의 세부 동작 2/이동 방향을 '-1 부터 1 사이의 무작위 수' 만큼 회전하기",
"type": "list"
},
{
"ele": "$[1][1].statements[0][2].type",
"answer": "bounce_wall",
"points": 1.2,
"desc": "문제 2/쓰레기/[반복]의 세부 동작 3/화면 끝에 닿으면 튕기기"
}
],
"sort": 131,
"list": [
"set_scale_size",
"repeat_inf"
]
},
"44-0": {
"ele": "$.messages[?(@.name=='성공')]",
"points": 1,
"desc": "문제 2/상어/신호/'성공'신호 만들기",
"type": "scene",
"sort": 144
},
"5-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'상어')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/상어/시작1/시작하기 버튼을 클릭했을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"answer": "50",
"points": 1.2,
"desc": "문제 2/상어/[시작]의 세부 동작 1/크기를 '50' 으로 정하기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1].params[0]"
],
"answer": [
"locate_xy",
"-100",
"0"
],
"points": 1.2,
"desc": "문제 2/상어/[시작]의 세부 동작 2/x: '-100' y: '0' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][3].type",
"$[0][3].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/상어/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0].type",
"$[0][3].statements[0][0].params[0].params[0].type",
"$[0][3].statements[0][0].params[0].params[1]",
"$[0][3].statements[0][0].params[0].params[2].params[0]"
],
"answer": [
"_if",
"boolean_basic_operator",
"get_variable",
"GREATER",
"10"
],
"points": 1.2,
"desc": "문제 2/상어/만일/만일 '물고기 수' 값 > '10' 이라면",
"type": "list"
},
{
"ele": "$[0][3].statements[0][0].statements[0][0].type",
"answer": "message_cast",
"points": 1.2,
"desc": "문제 2/상어/[만일]의 세부 동작 1/성공' 신호보내기"
},
{
"ele": [
"$[0][3].statements[0][0].statements[0][1].type",
"$[0][3].statements[0][0].statements[0][1].params[0]"
],
"answer": [
"stop_object",
"thisOnly"
],
"points": 1.2,
"desc": "문제 2/상어/[만일]의 세부 동작 2/자신의' 코드 멈추기",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_run_button_click",
"points": 1.2,
"desc": "문제 2/상어/시작2/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]"
],
"answer": [
"repeat_inf",
null
],
"points": 1.2,
"desc": "문제 2/상어/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].type",
"$[1][1].statements[0][0].params[0].type",
"$[1][1].statements[0][0].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"37"
],
"points": 1.2,
"desc": "문제 2/상어/만일1/만일 '왼쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][0].statements[0][0].type",
"$[1][1].statements[0][0].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"-5"
],
"points": 1.2,
"desc": "문제 2/상어/[만일1]의 세부 동작 1/x 좌표를 '-5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].type",
"$[1][1].statements[0][1].params[0].type",
"$[1][1].statements[0][1].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"39"
],
"points": 1.2,
"desc": "문제 2/상어/만일2/만일 '오른쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][1].statements[0][0].type",
"$[1][1].statements[0][1].statements[0][0].params[0].params[0]"
],
"answer": [
"move_x",
"5"
],
"points": 1.2,
"desc": "문제 2/상어/[만일2]의 세부 동작 1/x 좌표를 '5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][2].type",
"$[1][1].statements[0][2].params[0].type",
"$[1][1].statements[0][2].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"38"
],
"points": 1.2,
"desc": "문제 2/상어/만일3/만일 '위쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][2].statements[0][0].type",
"$[1][1].statements[0][2].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"5"
],
"points": 1.2,
"desc": "문제 2/상어/[만일3]의 세부 동작 1/y 좌표를 '5' 만큼 바꾸기",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][3].type",
"$[1][1].statements[0][3].params[0].type",
"$[1][1].statements[0][3].params[0].params[0]"
],
"answer": [
"_if",
"is_press_some_key",
"40"
],
"points": 1.2,
"desc": "문제 2/상어/만일4/만일 '아래쪽 화살표' 키가 눌러져 있는가? 라면",
"type": "list"
},
{
"ele": [
"$[1][1].statements[0][3].statements[0][0].type",
"$[1][1].statements[0][3].statements[0][0].params[0].params[0]"
],
"answer": [
"move_y",
"-5"
],
"points": 1.2,
"desc": "문제 2/상어/[만일4]의 세부 동작 1/y 좌표를 '-5' 만큼 바꾸기",
"type": "list"
},
{
"ele": "$[2][0].type",
"answer": "when_message_cast",
"points": 1.2,
"desc": "문제 2/상어/신호/'성공' 신호를 받았을 때 "
},
{
"ele": "$[2][1].params[*].params",
"answer": [
"배부르다!",
"1"
],
"points": 1.2,
"desc": "문제 2/상어/[신호]의 세부 동작 1/'배부르다!' 를 '1'초 동안 '말하기'"
},
{
"ele": "$[2][2].type",
"answer": "start_neighbor_scene",
"points": 1.2,
"desc": "문제 2/상어/[신호]의 세부 동작 2/'다음' 장면 시작하기"
}
],
"sort": 145,
"list": [
"set_scale_size",
"repeat_inf",
"dialog_time"
]
},
"6-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'바다2|바닷속\\(3\\)1')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_scene_start",
"points": 1.2,
"desc": "문제 2/바다2/장면 2/장면이 시작되었을 때"
},
{
"ele": "$[0][1].type",
"answer": "hide_variable",
"points": 1.2,
"desc": "문제 2/바다2/[장면 2]의 세부 동작 1/변수 '물고기 수' 숨기기"
},
{
"ele": [
"$[0][2].type",
"$[0][2].params[0].params[0]",
"$[0][2].params[1]"
],
"answer": [
"dialog",
"미션성공!",
"speak"
],
"points": 1.2,
"desc": "문제 2/바다2/[장면 2]의 세부 동작 2/'미션성공!' 을 '말하기'",
"type": "list"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 2,
"desc": "문제 3/바다2/오브젝트/오브젝트를 클릭했을 때"
},
{
"ele": [
"$[1][1].type",
"$[1][1].params[0]",
"$[1][1].params[1].params[0]"
],
"answer": [
"add_effect_amount",
"color",
"30"
],
"points": 2,
"desc": "문제 3/바다2/[오브젝트]의 세부 동작 1/'색깔' 효과를 '30' 만큼 주기",
"type": "list"
},
{
"ele": [
"$[1][2].type",
"$[1][2].params[0].params[0]",
"$[1][2].params[1]"
],
"answer": [
"dialog",
"처음부터 다시 실행!",
"speak"
],
"points": 2,
"desc": "문제 3/바다2/[오브젝트]의 세부 동작 2/'처음부터 다시 실행!' 을 '말하기'",
"type": "list"
},
{
"ele": [
"$[1][3].type",
"$[1][3].params[0].params[0]"
],
"answer": [
"wait_second",
"2"
],
"points": 2,
"desc": "문제 3/바다2/[오브젝트]의 세부 동작 3/'2' 초 기다리기",
"type": "list"
},
{
"ele": "$[1][4].type",
"answer": "restart_project",
"points": 2,
"desc": "문제 3/바다2/[오브젝트]의 세부 동작 4/처음부터 다시 실행하기"
}
],
"sort": 166,
"list": [
"hide_variable",
"add_effect_amount"
]
}
}

24
logging_config.py Normal file
View File

@@ -0,0 +1,24 @@
import logging
import os
def setup_logging():
log_dir = "logs"
os.makedirs(log_dir, exist_ok=True)
log_file = os.path.join(log_dir, "cat.log")
log_format = "[%(asctime)s] [%(levelname)s] [%(module)s:%(lineno)d] %(message)s"
date_format = "%Y-%m-%d %H:%M:%S"
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(logging.Formatter(log_format, date_format))
file_handler = logging.FileHandler(log_file, encoding="utf-8")
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(logging.Formatter(log_format, date_format))
logger.addHandler(console_handler)
logger.addHandler(file_handler)

1127
logs/2503CAT3A.log Normal file

File diff suppressed because it is too large Load Diff

88
logs/2504CAS2A-정답.log Normal file
View File

@@ -0,0 +1,88 @@
Processing: ./sample/제2504회 코딩활용능력 2급 A형 정답/temp/project.json
example: 1-1
elements found for $..objects[?(@.name=='약도')]
$..objects[?(@.name=='약도')] found
example: 1-2
elements found for $..objects[?(@.name=='나의 방')]
$..objects[?(@.name=='나의 방')] found
example: 1-3
elements found for $..objects[?(@.name=='놀이동산')]
$..objects[?(@.name=='놀이동산')] found
example: 1-4
elements found for $..objects[?(@.name=='백화점')]
$..objects[?(@.name=='백화점')] found
example: 1-5
elements found for $..objects[?(@.name=='우리집')]
$..objects[?(@.name=='우리집')] found
example: 1-6
elements found for $..objects[?(@.name=='어린이')]
$..objects[?(@.name=='어린이')] found
example: 2
2-1: when_run_button_click == when_run_button_click
2-2: 100 == 100
2-3: ['locate_xy', '-25', '80'] == ['locate_xy', '-25', '80']
2-4: when_object_click == when_object_click
2-5: ['여기는 놀이동산!', '1'] == ['여기는 놀이동산!', '1']
example: 3
3-1: when_run_button_click == when_run_button_click
3-2: 80 == 80
3-3: ['locate_xy', '170', '-80'] == ['locate_xy', '170', '-80']
3-4: when_object_click == when_object_click
3-5: ['여기는 백화점!', '1'] == ['여기는 백화점!', '1']
example: 31
elements found for $.messages[?(@.name=='놀이동산')]
$.messages[?(@.name=='놀이동산')] found
example: 32
elements found for $.messages[?(@.name=='백화점')]
$.messages[?(@.name=='백화점')] found
example: 4
4-1: when_run_button_click == when_run_button_click
4-2: 110 == 110
4-3: ['locate_xy', '-170', '-90'] == ['locate_xy', '-170', '-90']
4-4: when_object_click == when_object_click
4-5: ['ask_and_wait', '첫 번째로 방문할 장소는?'] == ['ask_and_wait', '첫 번째로 방문할 장소는?']
4-6: ['wait_second', '0.5'] == ['wait_second', '0.5']
4-7: ['_if', 'boolean_basic_operator', 'get_canvas_input_value', 'EQUAL', '놀이동산'] == ['_if', 'boolean_basic_operator', 'get_canvas_input_value', 'EQUAL', '놀이동산']
4-8: message_cast == message_cast
4-9: ['_if', 'boolean_basic_operator', 'get_canvas_input_value', 'EQUAL', '백화점'] == ['_if', 'boolean_basic_operator', 'get_canvas_input_value', 'EQUAL', '백화점']
4-10: message_cast == message_cast
example: 5
5-1: when_run_button_click == when_run_button_click
5-2: 40 == 40
5-3: ['locate_xy', '-170', '-100'] == ['locate_xy', '-170', '-100']
5-4: ['repeat_inf', 'None'] == ['repeat_inf', 'None']
5-5: ['_if', 'is_press_some_key', '39'] == ['_if', 'is_press_some_key', '39']
5-6: ['locate_xy', '-90', '-100'] == ['locate_xy', '-90', '-100']
5-7: when_message_cast == when_message_cast
5-8: ['repeat_while_true'] == ['repeat_while_true']
5-9: ['locate_object_time', '2'] == ['locate_object_time', '2']
5-10: ['wait_second', '0.5'] == ['wait_second', '0.5']
5-11: ['repeat_while_true'] == ['repeat_while_true']
5-12: ['locate_object_time', '2'] == ['locate_object_time', '2']
5-13: ['wait_second', '1'] == ['wait_second', '1']
5-14: ['locate_xy_time', '2', '-120', '-100'] == ['locate_xy_time', '2', '-120', '-100']
5-15: ['집 도착!', '1'] == ['집 도착!', '1']
5-16: start_neighbor_scene == start_neighbor_scene
5-17: when_message_cast == when_message_cast
5-18: ['repeat_while_true'] == ['repeat_while_true']
5-19: ['locate_object_time', '2'] == ['locate_object_time', '2']
5-20: ['wait_second', '0.5'] == ['wait_second', '0.5']
5-21: ['repeat_while_true'] == ['repeat_while_true']
5-22: ['locate_object_time', '2'] == ['locate_object_time', '2']
5-23: ['wait_second', '1'] == ['wait_second', '1']
5-24: ['locate_xy_time', '2', '-120', '-100'] == ['locate_xy_time', '2', '-120', '-100']
5-25: ['집 도착!', '1'] == ['집 도착!', '1']
5-26: start_neighbor_scene == start_neighbor_scene
example: 6
6-1: when_scene_start == when_scene_start
6-2: ['set_visible_answer', 'HIDE'] == ['set_visible_answer', 'HIDE']
6-3: ['dialog', 'my room!', 'speak'] == ['dialog', 'my room!', 'speak']
6-4: when_object_click == when_object_click
6-5: ['add_effect_amount', 'brightness', '10'] == ['add_effect_amount', 'brightness', '10']
6-6: ['dialog', '처음부터 다시 실행합니다.', 'speak'] == ['dialog', '처음부터 다시 실행합니다.', 'speak']
6-7: ['wait_second', '2'] == ['wait_second', '2']
6-8: restart_project == restart_project
Total Points for ['temp', 1.7, 1.7, 1.7, 1.7, 1.7, 1.7, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 1.56, 2, 2, 2, 2, 2, 99.76000000000008]
Results saved to ./sample/제2504회 코딩활용능력 2급 A형 정답/results.xlsx

7379
logs/2504CAS2A.log Normal file

File diff suppressed because it is too large Load Diff

3123
logs/2505CAT3A.log Normal file

File diff suppressed because it is too large Load Diff

9797
logs/2506_CAS_2_A.log Normal file

File diff suppressed because it is too large Load Diff

259
logs/cat.log Normal file
View File

@@ -0,0 +1,259 @@
[2025-07-31 15:50:20] [ERROR] [main:381] Error processing ./output/2507_CAT_3_A/2507회코딩활용능력3급A형정답\project.json: cannot access local variable 'student_id' where it is not associated with a value
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 375, in main
points.insert(0, student_id)
^^^^^^^^^^
UnboundLocalError: cannot access local variable 'student_id' where it is not associated with a value
[2025-07-31 15:52:50] [ERROR] [main:380] 🚫Error processing ./output/2507_CAT_3_A/2507회코딩활용능력3급A형정답\project.json: cannot access local variable 'student_id' where it is not associated with a value
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 375, in main
points.insert(0, student_id)
^^^^^^^^^^
UnboundLocalError: cannot access local variable 'student_id' where it is not associated with a value
[2025-09-01 15:17:33] [ERROR] [main:299] 🚫Error processing ./output/2508_CAS_2_A/2508_CAS_2_A_정답\project.json: unsupported operand type(s) for +=: 'int' and 'NoneType'
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 294, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 162, in process_project
total_points += question_points
TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'
[2025-09-01 15:17:34] [ERROR] [main:299] 🚫Error processing ./output/2508_CAS_2_B/2508_CAS_2_B_정답\project.json: unsupported operand type(s) for +=: 'int' and 'NoneType'
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 294, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 162, in process_project
total_points += question_points
TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'
[2025-10-01 15:43:18] [ERROR] [main:300] 🚫Error processing ./output/2509_CAT_3_A/2509_CAT_3_A\project.json: unsupported operand type(s) for +=: 'int' and 'NoneType'
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 295, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 162, in process_project
total_points += question_points
TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'
[2025-10-30 16:24:04] [ERROR] [main:301] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: unsupported operand type(s) for +=: 'int' and 'NoneType'
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 296, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 162, in process_project
total_points += question_points
TypeError: unsupported operand type(s) for +=: 'int' and 'NoneType'
[2025-10-30 16:26:32] [ERROR] [main:301] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: unsupported operand type(s) for +=: 'float' and 'NoneType'
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 296, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 212, in process_project
total_points += block_points
TypeError: unsupported operand type(s) for +=: 'float' and 'NoneType'
[2025-10-31 17:08:00] [ERROR] [main:322] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: 'NoneType' object is not iterable
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 317, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 167, in process_project
for block in block_list
^^^^^^^^^^
TypeError: 'NoneType' object is not iterable
[2025-10-31 17:14:04] [ERROR] [main:324] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: unhashable type: 'list'
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 319, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 168, in process_project
if block.get("answer") in target_event_answers
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: unhashable type: 'list'
[2025-10-31 17:17:42] [ERROR] [main:327] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: unhashable type: 'list'
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 322, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 171, in process_project
if answer in target_event_answers: # 조건에 맞는지 확인
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: unhashable type: 'list'
[2025-10-31 17:51:14] [ERROR] [main:360] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: 'list' object has no attribute 'get'
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 355, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 234, in process_project
script_data = reorder_script_by_event_order(script_json, block_event_order)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 149, in reorder_script_by_event_order
if script.get("type") == event_type:
^^^^^^^^^^
AttributeError: 'list' object has no attribute 'get'
[2025-10-31 17:56:20] [ERROR] [main:360] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: 'list' object has no attribute 'get'
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 355, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 234, in process_project
script_data = reorder_script_by_event_order(script_json, block_event_order)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 149, in reorder_script_by_event_order
if script.get("type") == event_type:
^^^^^^^^^^
AttributeError: 'list' object has no attribute 'get'
[2025-10-31 17:56:40] [ERROR] [main:360] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: 'list' object has no attribute 'get'
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 355, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 234, in process_project
script_data = reorder_script_by_event_order(script_json, block_event_order)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 149, in reorder_script_by_event_order
if script.get("type") == event_type:
^^^^^^^^^^
AttributeError: 'list' object has no attribute 'get'
[2025-10-31 17:58:18] [ERROR] [main:361] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: 'list' object has no attribute 'get'
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 356, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 235, in process_project
script_data = reorder_script_by_event_order(script_json, block_event_order)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 150, in reorder_script_by_event_order
if script.get("type") == event_type:
^^^^^^^^^^
AttributeError: 'list' object has no attribute 'get'
[2025-11-03 16:09:35] [ERROR] [main:399] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: list indices must be integers or slices, not str
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 394, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 270, in process_project
script_data = reorder_script_all_cases(script_json, block_event_order)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 167, in reorder_script_all_cases
type_map.setdefault(s["type"], []).append(s)
~^^^^^^^^
TypeError: list indices must be integers or slices, not str
[2025-11-03 17:15:12] [ERROR] [main:433] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: 0
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 428, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 310, in process_project
block_elements = find_element(single_script, block_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 33, in find_element
for match in jsonpath_expr.find(item):
^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\jsonpath.py", line 268, in find
for subdata in self.left.find(datum)
^^^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\jsonpath.py", line 270, in find
for submatch in self.right.find(subdata)]
^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\jsonpath.py", line 680, in find
return self._find_base(datum, create=False)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\jsonpath.py", line 692, in _find_base
return [DatumInContext(datum.value[self.index], path=self, context=datum)]
~~~~~~~~~~~^^^^^^^^^^^^
KeyError: 0
[2025-11-03 17:20:20] [ERROR] [main:417] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: 0
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 412, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 300, in process_project
block_elements = find_element(data, block_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 33, in find_element
for match in jsonpath_expr.find(item):
^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\jsonpath.py", line 268, in find
for subdata in self.left.find(datum)
^^^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\jsonpath.py", line 270, in find
for submatch in self.right.find(subdata)]
^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\jsonpath.py", line 680, in find
return self._find_base(datum, create=False)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\jsonpath.py", line 692, in _find_base
return [DatumInContext(datum.value[self.index], path=self, context=datum)]
~~~~~~~~~~~^^^^^^^^^^^^
KeyError: 0
[2025-11-03 17:21:39] [ERROR] [main:407] 🚫Error processing ./output/2510_CAS_2_A/2510_CAS_2_A(정답)\project.json: 1
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 402, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 288, in process_project
block_elements = find_list_element(data, block_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 48, in find_list_element
result.append([match.value for match in jsonpath_expr.find(data)])
^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\jsonpath.py", line 268, in find
for subdata in self.left.find(datum)
^^^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\jsonpath.py", line 270, in find
for submatch in self.right.find(subdata)]
^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\jsonpath.py", line 680, in find
return self._find_base(datum, create=False)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\project\Entry\Entry-Scoring\.venv\Lib\site-packages\jsonpath_ng\jsonpath.py", line 692, in _find_base
return [DatumInContext(datum.value[self.index], path=self, context=datum)]
~~~~~~~~~~~^^^^^^^^^^^^
KeyError: 1
[2025-11-04 15:36:56] [ERROR] [main:423] 🚫Error processing ./output/2510_CAS_2_A/코딩활용능력2급(엔트리)-000139-성지환\project.json: 'NoneType' object is not iterable
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 268, in process_project
script_data = reorder_script_all_cases(script_json, block_event_order)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 167, in reorder_script_all_cases
for s in script_json:
^^^^^^^^^^^
TypeError: 'NoneType' object is not iterable
[2025-11-04 16:20:44] [ERROR] [main:423] 🚫Error processing ./output/2510_CAS_2_A/코딩활용능력2급(엔트리)-000139-성지환\project.json: 'NoneType' object is not iterable
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 268, in process_project
script_data = reorder_script_all_cases(script_json, block_event_order)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 167, in reorder_script_all_cases
for s in script_json:
^^^^^^^^^^^
TypeError: 'NoneType' object is not iterable
[2025-11-04 17:11:33] [ERROR] [main:423] 🚫Error processing ./output/2510_CAS_2_A/코딩활용능력2급(엔트리)-000139-성지환\project.json: 'NoneType' object is not iterable
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 268, in process_project
script_data = reorder_script_all_cases(script_json, block_event_order)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 167, in reorder_script_all_cases
for s in script_json:
^^^^^^^^^^^
TypeError: 'NoneType' object is not iterable
[2025-11-05 16:02:42] [ERROR] [main:423] 🚫Error processing ./output/00_test/코딩활용능력2급(엔트리)-000139-성지환\project.json: 'NoneType' object is not iterable
Traceback (most recent call last):
File "D:\project\Entry\Entry-Scoring\main.py", line 418, in main
points = process_project(project_data, scoring_data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 268, in process_project
script_data = reorder_script_all_cases(script_json, block_event_order)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\project\Entry\Entry-Scoring\main.py", line 167, in reorder_script_all_cases
for s in script_json:
^^^^^^^^^^^
TypeError: 'NoneType' object is not iterable

79
logs/main-김세연.log Normal file
View File

@@ -0,0 +1,79 @@
Processing: output/2502 CAT 2급 A형/cas-000549-김세연/temp/project.json
example: 1-1
Element '$..objects[?(@.name=='들길')]' not found
example: 1-2
Element '$..objects[?(@.name=='하늘')]' not found
example: 1-3
Element '$..objects[?(@.name=='나무')]' not found
example: 1-4
Element '$..objects[?(@.name=='돌')]' not found
example: 1-5
Element '$..objects[?(@.name=='행인')]' not found
example: 1-6
Element '$..objects[?(@.name=='마라토너')]' not found
example: 2
2-1: when_run_button_click == when_run_button_click
2-2: hide == hide
2-3: ['repeat_inf', 'None'] == ['repeat_inf', 'None']
2-4: ['create_clone', 'self'] == ['create_clone', 'self']
2-5: ['wait_second', 'calc_rand', '1', '3'] == ['wait_second', 'calc_rand', '1', '3']
2-6: when_clone_start == when_clone_start
2-7: ['locate_xy', '240', '-20'] == ['locate_xy', '240', '-20']
2-8: show == show
2-9: ['repeat_while_true', 'x', 'LESS', '-240'] == ['repeat_while_true', 'x', 'LESS', '-240']
2-10: ['move_x', '-3'] == ['move_x', '-3']
2-11: delete_clone == delete_clone
example: 3
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
3-1: Script Not exist
example: 4
4-1: when_run_button_click == when_run_button_click
4-2: ['locate_xy', '240', '-30'] == ['locate_xy', '240', '-30']
4-3: ['repeat_inf', 'None'] == ['repeat_inf', 'None']
4-4: ['move_direction', '-1'] == ['move_direction', '-1']
example: 28
elements found for $.messages[?(@.name=='넘어짐')]
$.messages[?(@.name=='넘어짐')] found
example: 5
5-1: when_run_button_click == when_run_button_click
5-2: flip_y == flip_y
5-3: ['locate_xy', '-150', '-70'] == ['locate_xy', '-150', '-70']
5-4: ['repeat_inf', 'None'] == ['repeat_inf', 'None']
5-5: next == next
5-6: ['wait_second', '0.1'] == ['wait_second', '0.1']
5-7: ['_if', 'is_press_some_key', '32'] == ['_if', 'is_press_some_key', '32']
5-8: ['repeat_basic', '20'] == ['repeat_basic', '20']
5-9: ['move_y', '5'] == ['move_y', '5']
5-10: ['repeat_basic', '20'] == ['repeat_basic', '20']
5-11: ['move_y', '-5'] == ['move_y', '-5']
5-12: ['_if', 'reach_something'] == ['_if', 'reach_something']
5-13: message_cast == message_cast
5-14: when_message_cast == when_message_cast
5-15: ['rotate_relative', 'angle', '40'] == ['rotate_relative', 'angle', '40']
5-16: ['locate_xy_time', '0.2', '-140', '-100'] == ['locate_xy_time', '0.2', '-140', '-100']
5-17: ['dialog', '아야!', 'speak'] == ['dialog', '아야!', 'speak']
5-18: ['stop_object', 'otherThread'] == ['stop_object', 'otherThread']
5-19: ['wait_second', '1'] == ['wait_second', '1']
5-20: start_neighbor_scene == start_neighbor_scene
example: 6
6-1: when_scene_start == when_scene_start
6-2: ['dialog', '아쉽지만 잘했어!', 'speak'] == ['dialog', '아쉽지만 잘했어!', 'speak']
6-3: when_object_click == when_object_click
6-4: ['add_effect_amount', 'brightness', '55'] == ['add_effect_amount', 'brightness', '55']
6-5: ['dialog', '처음부터 다시 실행합니다.', 'speak'] == ['dialog', '처음부터 다시 실행합니다.', 'speak']
6-6: ['wait_second', '2'] == ['wait_second', '2']
6-7: restart_project == restart_project
Total Points for ['cas-000549-김세연', 0, 0, 0, 0, 0, 0, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', '확인 필요', 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 1.6, 68.80000000000001]
Results saved to output/2502 CAT 2급 A형/cas-000549-김세연/results.xlsx

36943
logs/main.log Normal file

File diff suppressed because it is too large Load Diff

461
main.py
View File

@@ -1,10 +1,19 @@
from jsonpath_ng.ext import parse
import json
from itertools import chain
import os
import pandas as pd # 추가된 import
import unicodedata # 상단에 import 추가
import re # 상단에 추가
from datetime import datetime
import logging
from logging_config import setup_logging # logging 설정을 위한 import
import traceback
import itertools
import copy
# 파일 경로 설정
project_json_path = './sample/제2502회 코딩활용능력 2급 B형 정답/project.json'
scoring_json_path = './scoring.json'
from script_utils import extract_and_format_scripts # 스크립트 추출 함수 import
setup_logging() # logging 설정 호출
# JSON 파일 읽기
def read_json(file_path):
@@ -13,9 +22,13 @@ def read_json(file_path):
# 요소 탐색 함수
def find_element(project_data, jsonpath_expr):
jsonpath_expr = parse(jsonpath_expr)
return [match.value for match in jsonpath_expr.find(project_data)]
"""
주어진 데이터(project_data)에서 jsonpath 표현식에 일치하는 모든 값들을 찾아
리스트로 반환합니다.
"""
parsed_expr = parse(jsonpath_expr)
return [match.value for match in parsed_expr.find(project_data)]
# 요소 탐색 함수
def find_script_element(project_data, jsonpath_expr):
jsonpath_expr = parse(jsonpath_expr)
@@ -28,96 +41,380 @@ def find_script_element(project_data, jsonpath_expr):
# jsonpath_expr_list 로 넘어온 jsonpath들을 하나씩 parse 해주고 결과를 result 리스트로 반환
def find_list_element(data, jsonpath_expr_list):
"""
주어진 데이터(data)에서 여러 jsonpath 표현식들에 일치하는 값들을 찾아
결과를 리스트의 리스트 형태로 반환합니다.
"""
return [
[match.value for match in parse(expr).find(data)]
for expr in jsonpath_expr_list
]
# 스크립트 채점 진행 전 스크립트 블럭 순서가 when_run_button_click 1번째, when_clone_start 2번째 배열에 없으면
# 리스트 순서 스왑해서 각각 0, 1번 순서로 배치될 수 있도록 함
# when_scene_start 1번째, when_message_cast 2번째 동일한 순서로 리스트 순서 스왑해서 정렬
# when_scene_start = [장면이 시작되었을 때]
# when_message_cast = ["성공"신호를 받았을 때]
def swap_script(origin):
"""스크립트 블록 순서 정렬 함수"""
if not origin or len(origin) == 0:
return origin
# 스크립트 블록 분류를 위한 임시 저장소
run_button_blocks = []
key_press_blocks = []
clone_start_block = None
message_cast_block = []
other_blocks = []
# 각 블록을 타입별로 분류
for i, block in enumerate(origin):
if not block or len(block) == 0:
continue
block_type = block[0].get("type")
# # 기존 로직: run_button과 scene_start 처리
# if (block_type == "when_run_button_click" or block_type == "when_scene_start") and i > 0:
# print(f"swap script run button or scene start")
# swap = origin[0]
# origin[0] = origin[i]
# origin[i] = swap
# # 기존 로직: clone_start와 message_cast 처리
# elif (block_type == "when_clone_start" or block_type == "when_message_cast") and i > 0:
# print(f"swap script clone start or msg cast")
# swap = origin[1]
# origin[1] = origin[i]
# origin[i] = swap
# 새로운 로직: 키 이벤트 처리
if block_type == "when_run_button_click":
run_button_blocks.append(block)
elif block_type == "when_some_key_pressed":
# params[1]에서 키 값 확인 (49, 50, 51) 아스키코드 값이므로 필요하면 추가 가능
key_value = block[0].get("params")[1]
if key_value in ["32","49","50","51"]:
key_press_blocks.append((key_value, block))
elif block_type == "when_clone_start":
clone_start_block = block
elif block_type == "when_message_cast":
message_cast_block.append(block)
else:
other_blocks.append(block)
# 결과 배열 재구성
result = []
for jsonpath_expr in jsonpath_expr_list:
jsonpath_expr = parse(jsonpath_expr)
result.append([match.value for match in jsonpath_expr.find(data)])
return result
# 1. when_run_button_click 블록을 첫 번째로 추가
if run_button_blocks:
result.extend(run_button_blocks)
# main 함수
def main():
project_data = read_json(project_json_path)
scoring_data = read_json(scoring_json_path)
total_points = 0
# 2. when_some_key_pressed 블록들을 키 값 순서대로 정렬하여 추가
key_press_blocks.sort(key=lambda x: int(x[0]) if x[0] else 0)
result.extend([block for _, block in key_press_blocks])
for key, value in scoring_data.items():
ele = value.get('ele')
type = value.get('type')
blocks = value.get('blocks')
# 정답
answer = value.get('answer')
# 3. clone_start와 message_cast 블록 추가
if message_cast_block:
result.extend(message_cast_block)
if clone_start_block:
result.append(clone_start_block)
# 4. 나머지 블록 추가
result.extend(other_blocks)
# 결과가 비어있으면 원본 반환
return result if result else origin
def reorder_script_all_cases(script_json, block_event_order):
"""
script_json의 'type' 순서를 block_event_order 순서에 맞게 재정렬합니다.
Args:
script_json (list[dict]): 각 요소가 {'type': '...', ...} 형태의 리스트
block_event_order (list[str]): 원하는 type 순서 예: ['when_run_button_click', 'when_message_cast']
Returns:
list[dict]: block_event_order 순서대로 재정렬된 리스트
"""
# 타입별로 스크립트를 분류
type_map = {}
for s in script_json:
type_map.setdefault(s[0]["type"], []).append(s)
results = []
def backtrack(order_idx, used_counts, current):
# ✅ 모든 이벤트 순서를 처리했으면 결과에 추가
if order_idx == len(block_event_order):
results.append(copy.deepcopy(current))
return
event_type = block_event_order[order_idx]
available_scripts = type_map.get(event_type, [])
# 아직 사용하지 않은 script만 선택
for i, script in enumerate(available_scripts):
if used_counts[event_type][i]:
continue
used_counts[event_type][i] = True
current.append(script)
backtrack(order_idx + 1, used_counts, current)
current.pop()
used_counts[event_type][i] = False
# 사용 여부 초기화
used_counts = {t: [False] * len(lst) for t, lst in type_map.items()}
backtrack(0, used_counts, [])
return results
def clean_string(text):
"""문자열 끝의 . 또는 ! 제거"""
if isinstance(text, str):
# 문자열 끝의 . 또는 ! 제거
return re.sub(r'', '', text.strip())
return text
def convert_to_str(value):
"""값을 문자열로 변환"""
if isinstance(value, (list, tuple)):
return [convert_to_str(v) for v in value]
return str(value)
def process_project(project_data, scoring_data):
total_points = 0
score_list = []
# - 시작하기 버튼을 클릭했을 때 : when_run_button_click
# - (특정) 신호를 받았을 때 : when_message_cast
# - 복제본이 생성 되었을 때 : when_clone_start
# - 장면이 시작 되었을 때 : when_scene_start
# - 오브젝트를 클릭 했을 때 : when_object_click
# 이벤트 블록이 존재하는지 여부 확인용 변수
target_event_type = {
"when_run_button_click",
"when_message_cast",
"when_clone_start",
"when_scene_start",
"when_object_click"
}
for question_key, question_info in scoring_data.items():
element_path = question_info.get('ele')
question_type = question_info.get('type')
block_list = question_info.get('blocks')
expected_answer = question_info.get('answer')
question_points = question_info.get('point')
print(f"example: {key}")
if type == "scene":
exists = find_element(project_data, ele)
if exists:
print(f"elements found for {ele}")
if exists == answer:
total_points += value.get('points')
elif exists and answer == None:
total_points += value.get('points')
print(f"{ele} found ");
else :
print(f"{exists} not found");
block_event_order = [] # 결과를 저장할 리스트 생성
# target_event_type 리스트 중
# 채점기준표의 block_list의 answer 키값과 일치하는 값이 있으면
# block_event_order 리스트에 추가
if isinstance(block_list, list) and block_list:
for block in block_list:
answer = block.get("answer") # answer 키값을 안전하게 가져오기
if isinstance(answer, str) and answer in target_event_type:
block_event_order.append(answer) # 리스트에 추가
print(f"▶ Processing question: {question_key}")
# ✅ SCENE TYPE 처리
if question_type == "scene":
scene_elements = find_element(project_data, element_path)
if scene_elements:
print(f"🟨 Found elements for '{element_path}'")
scene_elements = [convert_to_str(x) for x in scene_elements]
if scene_elements == expected_answer or (expected_answer is None and scene_elements):
total_points += question_points
score_list.append(question_points)
# print(f"✅ Matched: {scene_elements}")
else:
score_list.append(0)
print(f"❌ Mismatch: {scene_elements} vs {expected_answer}")
else:
print(f"Element '{ele}' exists in project.json: {exists}")
if type == "script":
exists = find_script_element(project_data, ele)
if exists == None:
temp = None
else:
temp = json.loads(exists)
innerKey= 1;
for block in blocks:
innerType = block.get('type')
if temp == None:
print(f"{key}-{innerKey}: Script Not exist")
innerKey = innerKey + 1
print(f"🟥 Element '{element_path}' not found")
score_list.append(0)
# ✅ SCRIPT TYPE 처리
elif question_type == "script":
script_raw = find_script_element(project_data, element_path)
script_json = json.loads(script_raw) if script_raw else None
# 스크립트 블록 순서 재정렬
script_data = reorder_script_all_cases(script_json, block_event_order) if script_json else None
block_index = 1
for block in block_list:
block_type = block.get('type')
block_path = block.get('ele')
block_answer = block.get('answer', None)
block_points = block.get('point')
if script_data is None:
print(f"{question_key}-{block_index}: Script Not Found")
score_list.append("확인 필요")
block_index += 1
continue
if innerType == "list":
block_exists = find_list_element(temp, block.get('ele'))
# 1. 현재 블록(문제)이 정답인지 판별하는 플래그
is_block_correct = False
# 2. 로깅을 위해 마지막으로 찾은 값을 저장할 변수
last_found_values = None
# 3. script_data가 단일 객체여도 처리 가능하도록 리스트로 통일
scripts_to_check = script_data if isinstance(script_data, list) else [script_data]
else:
block_exists = find_element(temp, block.get('ele'))
# 4. 여러 스크립트 뭉치를 순회하며 정답이 하나라도 있는지 확인
for single_script in scripts_to_check:
# 단일 스크립트 객체(single_script)에 대해 블록 요소 검색
if block_type == "list":
block_elements = find_list_element(single_script, block_path)
else:
block_elements = find_element(single_script, block_path)
# 정답
answer = block.get('answer', None)
if isinstance(answer, list):
flat_matches = list(chain.from_iterable(block_exists))
# 결과값 정리
if block_elements and isinstance(block_answer, list):
# 1. 비어있는 sublist를 ['None']으로 먼저 치환합니다.
# - sublist가 비어있지 않으면(if sublist) sublist를 그대로 사용하고,
# - 비어있으면 ['None']으로 대체합니다.
processed_elements = [sublist if sublist else ['None'] for sublist in block_elements]
found_values = [convert_to_str(x) for x in itertools.chain.from_iterable(processed_elements)]
else:
found_values = convert_to_str(block_elements[0]) if block_elements else None
else:
flat_matches = block_exists[0]
# 실패 시 출력할 값을 위해 마지막으로 찾은 값을 저장
last_found_values = found_values
expected_str = convert_to_str(block_answer) if block_answer is not None else None
# 블록에 따라 params 값이나 statements 값이 있는 경우 처리 추가 필요
if block_exists:
if answer is not None and answer != flat_matches:
print(f"{key}-{innerKey}: {answer} != {flat_matches}")
elif answer is not None and answer == flat_matches:
print(f"{key}-{innerKey}: {answer} == {flat_matches}")
total_points += block.get('points')
elif answer is None and block_exists:
total_points += block.get('points')
print(f"{key}-{innerKey}: exist ele: {block_exists}")
# 정답 조건 확인
if block_elements:
# 5-1. 정답(block_answer)이 없고, 요소만 찾으면 되는 경우
if block_answer is None:
is_block_correct = True
# 5-2. 정답이 있고, 찾은 값과 일치하는 경우
elif expected_str == found_values:
is_block_correct = True
# 6. 정답을 찾았으면, 더 이상 다른 스크립트를 확인할 필요 없이 내부 반복문 탈출
if is_block_correct:
break # for single_script in scripts_to_check: 루프를 중단
# 7. 내부 반복문 종료 후, 플래그를 기반으로 최종 점수 처리
if is_block_correct:
# 정답을 맞힌 경우
if block_answer is not None:
print(f"{question_key}-{block_index}: ✅ {expected_str} == {last_found_values}")
else:
print(f"{question_key}-{block_index}: Element Exists")
total_points += block_points
score_list.append(block_points)
else:
print(f"No elements found for {block.get('ele')}")
# 모든 스크립트를 확인했지만 정답이 없는 경우
if last_found_values is not None: # 요소는 찾았으나 값이 틀린 경우
print(f"{question_key}-{block_index}: ❌ {expected_str} != {last_found_values}")
else: # 요소를 전혀 찾지 못한 경우
print(f"{question_key}-{block_index}: No elements found for {block_path}")
score_list.append(0)
block_index += 1
# total_points = round(total_points, ndigits=0) # 총점 반올림
score_list.append(total_points)
return score_list
def normalize_path(path):
"""한글 경로명을 NFC 방식으로 정규화"""
return unicodedata.normalize('NFC', path)
innerKey = innerKey + 1
def main():
timestamp = datetime.now().strftime("%y%m%d")
test_mode = False # 테스트 모드 설정
# test_mode = True # 테스트 모드 설정
exam_round = "2510"
# exam_names = ["CAT_3_A"] # 여러 시험명을 리스트로 설정
exam_names = ["CAS_2_A"] # 여러 시험명을 리스트로 설정
excel_list = []
print(f"Total Points: {total_points}")
for exam_name in exam_names:
scoring_json_path = f'./correct/{exam_round}_{exam_name}.json'
project_json_path = f'./output/{"00_test" if test_mode else exam_round+"_"+exam_name}/'
excel_path = f'{timestamp}_{exam_round}_{exam_name}_{"TEST" if test_mode else "채점결과"}.xlsx'
scoring_data = read_json(scoring_json_path)
student_score_list = []
# 컬럼명 생성
columns = ['학생명']
idx = 1
for key in scoring_data.keys():
if scoring_data[key].get('type') == 'scene':
columns.append(f'{idx}')
idx = idx + 1
elif scoring_data[key].get('type') == 'script':
for i in range(len(scoring_data[key].get('blocks', []))):
columns.append(f'{idx}')
idx = idx + 1
columns.append('총점')
# os.walk 결과를 리스트로 변환하고 정렬
walk_results = []
for root, dirs, files in os.walk(project_json_path):
# 디렉토리명 정규화
normalized_root = normalize_path(root)
normalized_dirs = [normalize_path(d) for d in dirs]
normalized_files = [normalize_path(f) for f in files]
normalized_dirs.sort() # 정규화된 디렉토리 정렬
walk_results.append((normalized_root, normalized_dirs, normalized_files))
# 정렬된 결과를 바탕으로 처리
for root, dirs, files in sorted(walk_results):
for file in sorted(files): # 파일도 정렬
if file == 'project.json':
full_path = os.path.join(root, file)
print(f"\n🟠 Processing: {full_path}")
try:
# 디렉토리 패스 내에 학생 이름만 뽑아서 엑셀 컬럼 명으로 추가
match = re.search(r'(\d{6}[-_][^\\/]+)[\\/]', full_path)
if match:
student_id = match.group(1)
else:
if '정답' in full_path:
student_id = '정답'
else:
student_id = '000000'
# project.json 파일 내용
project_data = read_json(full_path)
if project_data:
extract_and_format_scripts(project_data, root)
points = process_project(project_data, scoring_data)
points.insert(0, student_id)
student_score_list.append(points)
print(f"Total Points for {points}")
except Exception as e:
logging.exception(f"🚫Error processing {full_path}: {str(e)}")
continue
# DataFrame 생성 및 엑셀 저장
df = pd.DataFrame(student_score_list, columns=columns).transpose()
df.columns = df.iloc[0]
df = df[1:]
df.to_excel(excel_path, index=False)
excel_list.append(excel_path)
if excel_list:
print(f"\nResults saved to {excel_list}")
if __name__ == "__main__":
main()

BIN
results.xlsx Normal file

Binary file not shown.

View File

@@ -41,7 +41,7 @@ def calculate_points(project_data, scoring_data):
return total_points
def main():
project_data = load_json('sample/제2410회 코딩활용능력 2급 B형 정답/project.json')
project_data = load_json(r'D:\project\Entry\Entry-Scoring\sample\제2506회 코딩활용능력 2급 A형 정답\temp\project.json')
scoring_data = load_json('scoring.json')
total_points = calculate_points(project_data, scoring_data)

View File

@@ -1,235 +0,0 @@
{
"1-1": {
"type": "scene",
"ele": "$.scenes[0].name",
"answer": "꽃밭",
"points": 1.77,
"desc": "장면 1 이름 변경"
},
"1-2": {
"type": "scene",
"ele": "$.scenes[1].name",
"answer": "숲속",
"points": 1.77,
"desc": "장면 2 이름 변경"
},
"1-3": {
"type": "scene",
"ele": "$..objects[?(@.name=='당근')]",
"points": 1.77,
"desc": "장면 2 이름 변경"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='하트')]",
"points": 1.77,
"desc": "장면 2 이름 변경"
},
"2-1": {
"type": "scene",
"ele": "$.variables[?(@.name=='당근')]['value', 'object']",
"answer": [
"10",
null
],
"points": 1.77,
"desc": "변수 기본값, 전체 사용 여부"
},
"2-2": {
"type": "scene",
"ele": "$.variables[?(@.name=='점수')]['value', 'object']",
"answer": [
0,
null
],
"points": 1.77,
"desc": "변수 기본값, 전체 사용 여부"
},
"2-3": {
"type": "scene",
"ele": "$.messages[?@.name=='종료']",
"points": 1.77,
"desc": "시그널 작성 여부"
},
"2": {
"type": "script",
"ele": "$.objects[?(@.name=='당근')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.77,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[0][1].params[0].params[0]",
"points": 1.77,
"answer": "45",
"desc": "크기 지정"
},
{
"ele": "$[0][2]['params']",
"points": 1.77,
"answer": [
"FORWARD",
null
],
"desc": "물체 앞으로 보내기"
},
{
"type": "list",
"ele": [
"$[0][3].params[0].params[?(@.type=='get_variable')].type",
"$[0][3].params[0].params[?(@=='LESS')]",
"$[0][3].params[0].params[?(@.type=='text')].params[0]"
],
"answer": [
"get_variable",
"LESS",
"1"
],
"points": 1.77,
"desc": "x:0, y:-100 으로 이동"
},
{
"ele": "$[0][3].statements[0][?@.type=='locate_xy'].params[*].params",
"answer": [
"0",
"-120"
],
"points": 1.77,
"desc": "x:0, y:-120 으로 이동"
},
{
"ele": "$[0][3].statements[0][1].params[0].params[0]",
"answer": "32",
"points": 1.77,
"desc": "스페이스(32) 를 눌렀을 때"
},
{
"ele": "$[0][3].statements[0][1].statements[0][0].params[0].params[0]",
"answer": "0.2",
"points": 1.77,
"desc": "0.2초 기다리기"
},
{
"ele": "$[0][3].statements[0][1].statements[0][1].params[1].params[0]",
"answer": "-1",
"points": 1.77,
"desc": "변수에 -1"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][1].statements[0][2].params[0].params[0]",
"$[0][3].statements[0][1].statements[0][2].params[1]"
],
"answer": [
"0.5",
"mouse"
],
"points": 1.77,
"desc": "0.5초 동안 마우스 좌표 위치로 이동"
},
{
"type": "list",
"ele": [
"$[0][3].statements[0][2].type",
"$[0][3].statements[0][2].params[0].type"
],
"answer": [
"_if",
"reach_something"
],
"points": 1.77,
"desc": "if reach something"
},
{
"ele": "$[0][3].statements[0][2].statements[0][0].params[1].params[0]",
"answer": "10",
"points": 1.77,
"desc": "변수에 10"
},
{
"ele": "$[0][3].statements[0][2].statements[0][1].params[*].params",
"answer": [
"성공!",
"0.5"
],
"points": 1.77,
"desc": "dialog_time 시작!을 0.5초"
},
{
"ele": "$[0][4].type",
"answer": "message_cast",
"points": 1.77,
"desc": "신호 보내기"
},
{
"ele": "$[0][5].type",
"answer": "hide",
"points": 1.77,
"desc": "신호 보내기"
}
]
},
"3": {
"type": "script",
"ele": "$.objects[?(@.name=='하트')].script",
"blocks": []
},
"5": {
"type": "script",
"ele": "$.objects[?(@.name=='상자')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 1.77,
"desc": "시작하기 버튼을 눌렀을 때"
},
{
"ele": "$[*][?(@.type=='change_object_index')].params[0]",
"points": 1.77,
"answer": "FORWARD",
"desc": "물체 앞으로 보내기"
},
{
"ele": "$[0][2].params[*].params",
"answer": [
"0",
"-100"
],
"points": 1.77,
"desc": "x:0, y:-100 으로 이동"
},
{
"ele": "$[0][3].params[0].params[0]",
"points": 1.77,
"answer": "90",
"desc": "크기 지정"
},
{
"ele": "$[0][4].params[*].params",
"answer": [
"시작!",
"0.5"
],
"points": 1.77,
"desc": "dialog_time 시작!을 0.5초"
},
{
"ele": "$[1][0].type",
"answer": "when_message_cast",
"points": 1.77,
"desc": "신호를 받았을 때"
},
{
"ele": "$[1][1].type",
"answer": "hide",
"points": 1.77,
"desc": "숨기기"
}
]
}
}

78
script_utils.py Normal file
View File

@@ -0,0 +1,78 @@
import os
import json
def extract_and_format_scripts(project_data, output_directory="script_outputs"):
"""
읽어온 project_data에서 각 객체의 스크립트를 추출하여
별도의 포맷팅된 JSON 파일로 저장합니다.
:param project_data: read_json을 통해 읽어온 딕셔너리 데이터
:param output_directory: 결과 파일을 저장할 폴더 이름
"""
if not project_data:
print("오류: 유효한 프로젝트 데이터가 없습니다.")
return
# 결과물을 저장할 폴더 생성 (없으면)
if not os.path.exists(output_directory):
os.makedirs(output_directory)
print(f"'{output_directory}' 폴더를 생성했습니다.")
objects_list = project_data.get("objects", [])
for obj in objects_list:
object_name = obj.get("name")
script_string = obj.get("script")
# 객체 이름과 스크립트 문자열이 모두 유효한 경우에만 처리
if object_name and script_string:
try:
# 1. 스크립트 문자열을 파이썬 객체(리스트)로 파싱
script_data = json.loads(script_string)
# 2. 저장할 파일 경로 설정
file_name = f"{object_name}.json"
output_path = os.path.join(output_directory, file_name)
# 3. 보기 좋은 형태의 JSON 파일로 저장
with open(output_path, 'w', encoding='utf-8') as f:
json.dump(script_data, f, indent=2, ensure_ascii=False)
print(f"성공: '{output_path}' 파일이 생성되었습니다.")
except json.JSONDecodeError:
print(f"주의: '{object_name}'의 스크립트는 비어있거나 파싱할 수 없어 건너뜁니다.")
except Exception as e:
print(f"오류: '{object_name}' 스크립트 처리 중 예외 발생 - {e}")
def read_json(file_path):
""" JSON 파일을 읽어 Python dict 로 반환 """
if not os.path.exists(file_path):
print(f"오류: 파일 '{file_path}' 을(를) 찾을 수 없습니다.")
return None
try:
with open(file_path, "r", encoding="utf-8") as f:
return json.load(f)
except Exception as e:
print(f"JSON 읽기 오류: {e}")
return None
def main():
# base_dir을 코드 내에서 직접 지정
base_dir = r"D:\project\Entry\Entry-Scoring\output\2509_CAS_3_A" # 원하는 최상위 디렉토리 경로로 수정
# 하위 디렉토리 순회
for root, dirs, files in os.walk(base_dir):
if "project.json" in files:
json_path = os.path.join(root, "project.json")
output_directory = root # project.json이 있는 동일한 경로
print(f"▶ Processing: {json_path}")
project_data = read_json(json_path)
if project_data:
extract_and_format_scripts(project_data, output_directory)
if __name__ == "__main__":
main()

View File

@@ -1,500 +0,0 @@
[
[
{
"id": "om8f",
"x": 50,
"y": 70,
"type": "when_run_button_click",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "y31p",
"x": 0,
"y": 0,
"type": "set_scale_size",
"params": [
{
"id": "vohi",
"x": 0,
"y": 0,
"type": "number",
"params": [
"45"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "ybwv",
"x": 0,
"y": 0,
"type": "change_object_index",
"params": [
"FORWARD",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "g6zh",
"x": 0,
"y": 0,
"type": "repeat_while_true",
"params": [
{
"id": "t4xt",
"x": 0,
"y": 0,
"type": "boolean_basic_operator",
"params": [
{
"id": "fe87",
"x": 0,
"y": 0,
"type": "get_variable",
"params": [
"ofvf",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"LESS",
{
"id": "7eqj",
"x": 0,
"y": 0,
"type": "text",
"params": [
"1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"until",
null
],
"statements": [
[
{
"id": "6dad",
"x": 0,
"y": 0,
"type": "locate_xy",
"params": [
{
"id": "bj58",
"x": 0,
"y": 0,
"type": "number",
"params": [
"0"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "oeup",
"x": 0,
"y": 0,
"type": "number",
"params": [
"-120"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "bdne",
"x": 0,
"y": 0,
"type": "_if",
"params": [
{
"id": "kzo7",
"x": 0,
"y": 0,
"type": "is_press_some_key",
"params": [
"32",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [
[
{
"id": "skya",
"x": 0,
"y": 0,
"type": "wait_second",
"params": [
{
"id": "lw8x",
"x": 0,
"y": 0,
"type": "number",
"params": [
"0.2"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "cwhq",
"x": 0,
"y": 0,
"type": "change_variable",
"params": [
"ofvf",
{
"id": "zzzs",
"x": 0,
"y": 0,
"type": "text",
"params": [
"-1"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "fi2n",
"x": 0,
"y": 0,
"type": "locate_object_time",
"params": [
{
"id": "kwih",
"x": 0,
"y": 0,
"type": "number",
"params": [
"0.5"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"mouse",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "w10m",
"x": 0,
"y": 0,
"type": "_if",
"params": [
{
"id": "3mja",
"x": 0,
"y": 0,
"type": "reach_something",
"params": [
null,
"1dcp",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [
[
{
"id": "1o2h",
"x": 0,
"y": 0,
"type": "change_variable",
"params": [
"cyzm",
{
"id": "v14q",
"x": 0,
"y": 0,
"type": "text",
"params": [
"10"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "f6lo",
"x": 0,
"y": 0,
"type": "dialog_time",
"params": [
{
"id": "sydb",
"x": 0,
"y": 0,
"type": "text",
"params": [
"성공!"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "qxvc",
"x": 0,
"y": 0,
"type": "number",
"params": [
"0.5"
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
"speak",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "b4zg",
"x": 0,
"y": 0,
"type": "message_cast",
"params": [
"4tjs",
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
},
{
"id": "937f",
"x": 0,
"y": 0,
"type": "hide",
"params": [
null
],
"statements": [],
"movable": null,
"deletable": 1,
"emphasized": false,
"readOnly": null,
"copyable": true,
"assemble": true,
"extensions": []
}
]
]

1
temp.csv Normal file
View File

@@ -0,0 +1 @@
'cas-000039-정승혁', 0, 0, 1.77, 1.77, 0, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 0, 0, 0, 0, 0, 0, 0, 1.77, 1.77, 0, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 1.77, 58.41000000000004
1 'cas-000039-정승혁' 0 0 1.77 1.77 0 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 0 0 0 0 0 0 0 1.77 1.77 0 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 1.77 58.41000000000004

View File

@@ -0,0 +1,362 @@
{
"1-1": {
"type": "scene",
"ele": "$..objects[?(@.name=='실험실')]",
"points": 2,
"desc": "문제 1/교실 뒤(3)/[배경] 이름 설정/이름을 '실험실'으로 변경하기"
},
"1-2": {
"type": "scene",
"ele": "$..objects[?(@.name=='새로운 약')]",
"points": 2,
"desc": "문제 1/물약(빨강)/[개체] 이름 설정 1/이름을 '새로운 약'으로 변경하기"
},
"1-4": {
"type": "scene",
"ele": "$..objects[?(@.name=='불')]",
"points": 2,
"desc": "문제 1/불(2)/[개체] 이름 설정 2/이름을 '불'로 변경하기"
},
"1-5": {
"type": "scene",
"ele": "$..objects[?(@.name=='마법사')]",
"points": 2,
"desc": "문제 1/꼬마 마법사/[개체] 이름 설정 3/이름을 '마법사'로 변경하기"
},
"1-6": {
"type": "scene",
"ele": "$..objects[?(@.name=='마법의 약')]",
"points": 2,
"desc": "문제 1/마법의 약/[개체] 이름 설정 4/이름 변경 없음"
},
"2-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'새로운 약|물약')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "문제 2/새로운 약/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": ["locate_xy", "50", "5"],
"points": 2.43,
"desc": "문제 2/새로운 약/[시작]의 세부 동작 1/x: '50' y: '5' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "60",
"points": 2.43,
"desc": "문제 2/새로운 약/[시작]의 세부 동작 2/크기를 '60' 으로 정하기"
},
{
"ele": "$[1][0].type",
"answer": "when_object_click",
"points": 2.43,
"desc": "문제 2/새로운 약/오브젝트/오브젝트를 클릭했을 때"
},
{
"ele": ["$[1][1].type", "$[1][1].params[0]"],
"answer": ["repeat_inf", null],
"points": 2.43,
"desc": "문제 2/새로운 약/반복/계속 반복하기",
"type": "list"
},
{
"ele": "$[1][1].statements[0][0].type",
"answer": "locate",
"points": 2.43,
"desc": "문제 2/새로운 약/[반복]의 세부 동작/'마우스 포인터' 위치로 이동하기"
}
]
},
"3-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'불')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "문제 2/불/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": ["locate_xy", "-150", "-30"],
"points": 2.43,
"desc": "문제 2/불/[시작]의 세부 동작 1/x: '-150' y: '-30' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "90",
"points": 2.43,
"desc": "문제 2/불/[시작]의 세부 동작 2/크기를 '90' 으로 정하기"
},
{
"ele": ["$[0][3].type", "$[0][3].params[0]"],
"answer": ["repeat_inf", null],
"points": 2.43,
"desc": "문제 2/불/반복/계속 반복하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][0].type",
"$[0][3].statements[0][0].params[0].params[1].params[0]",
"$[0][3].statements[0][0].params[0].params[3].params[0]",
"$[0][3].statements[0][0].params[1].params[1].params[0]",
"$[0][3].statements[0][0].params[1].params[3].params[0]"
],
"answer": ["locate_xy", "-150", "0", "-10", "40"],
"points": 2.43,
"desc": "문제 2/불/[반복]의 세부 동작 1/x: '-150 부터 0 사이의 무작위 수' y: '-10 부터 40 사이의 무작위 수' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][3].statements[0][1].type",
"answer": "hide",
"points": 2.43,
"desc": "문제 2/불/[반복]의 세부 동작 2/모양 숨기기"
},
{
"ele": [
"$[0][3].statements[0][2].type",
"$[0][3].statements[0][2].params[0].type",
"$[0][3].statements[0][2].params[0].params[1].params[0]",
"$[0][3].statements[0][2].params[0].params[3].params[0]"
],
"answer": ["wait_second", "calc_rand", "1", "2"],
"points": 2.43,
"desc": "문제 2/불/[반복]의 세부 동작 3/'1 부터 2 사이의 무작위 수' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][3].statements[0][3].type",
"answer": "show",
"points": 2.43,
"desc": "문제 2/불/[반복]의 세부 동작 4/모양 보이기"
},
{
"ele": [
"$[0][3].statements[0][4].type",
"$[0][3].statements[0][4].params[0].params[0]"
],
"answer": ["wait_second", "0.5"],
"points": 2.43,
"desc": "문제 2/불/[반복]의 세부 동작 5/'0.5' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][5].type",
"$[0][3].statements[0][5].params[0].type"
],
"answer": ["_if", "reach_something"],
"points": 2.43,
"desc": "문제 2/불/만일/만일 '새로운 약' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": "$[0][3].statements[0][5].statements[0][0].params[0].params[0]",
"answer": "300",
"points": 2.43,
"desc": "문제 2/불/[만일]의 세부 동작 1/크기를 '300' 으로 정하기"
},
{
"ele": [
"$[0][3].statements[0][5].statements[0][1].type",
"$[0][3].statements[0][5].statements[0][1].params[0].params[0]",
"$[0][3].statements[0][5].statements[0][1].params[1]"
],
"answer": ["dialog", "마법 실패", "speak"],
"points": 2.43,
"desc": "문제 2/불/[만일]의 세부 동작 2/'마법 실패' 를 '말하기'",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][5].statements[0][2].type",
"$[0][3].statements[0][5].statements[0][2].params[0]"
],
"answer": ["stop_object", "all"],
"points": 2.43,
"desc": "문제 2/불/[만일]의 세부 동작 3/'모든' 코드 멈추기",
"type": "list"
}
]
},
"4-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'마법사')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "문제 2/마법사/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": ["locate_xy", "135", "-20"],
"points": 2.43,
"desc": "문제 2/마법사/[시작]의 세부 동작 1/x: '135' y: '-20' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "180",
"points": 2.43,
"desc": "문제 2/마법사/[시작]의 세부 동작 2/크기를 '180' 으로 정하기"
},
{
"ele": "$[0][3].params[*].params",
"answer": ["마법 실험을 해봐야지!", "2"],
"points": 2.43,
"desc": "문제 2/마법사/[시작]의 세부 동작 3/'마법 실험을 해봐야지!' 를 '2' 초 동안 '말하기'"
}
]
},
"5-0": {
"type": "script",
"ele": "$.objects[?(@.name=~'마법의 약')].script",
"blocks": [
{
"ele": "$[0][0].type",
"answer": "when_run_button_click",
"points": 2.43,
"desc": "문제 2/마법의 약/시작/시작하기 버튼을 클릭했을 때"
},
{
"ele": [
"$[0][1].type",
"$[0][1].params[0].params[0]",
"$[0][1].params[1].params[0]"
],
"answer": ["locate_xy", "-40", "10"],
"points": 2.43,
"desc": "문제 2/마법의 약/[시작]의 세부 동작 1/x: '-40' y: '10' 위치로 이동하기",
"type": "list"
},
{
"ele": "$[0][2].params[0].params[0]",
"answer": "50",
"points": 2.43,
"desc": "문제 2/마법의 약/[시작]의 세부 동작 2/크기를 '50' 으로 정하기"
},
{
"ele": ["$[0][3].type", "$[0][3].params[0]"],
"answer": ["repeat_inf", null],
"points": 2.43,
"desc": "문제 2/마법의 약/반복/계속 반복하기",
"type": "list"
},
{
"ele": "$[0][3].statements[0][0].type",
"answer": "hide",
"points": 2.43,
"desc": "문제 2/마법의 약/[반복]의 세부 동작 1/모양 숨기기"
},
{
"ele": [
"$[0][3].statements[0][1].type",
"$[0][3].statements[0][1].params[0].params[1].params[0]",
"$[0][3].statements[0][1].params[0].params[3].params[0]"
],
"answer": ["locate_x", "-160", "60"],
"points": 2.43,
"desc": "문제 2/마법의 약/[반복]의 세부 동작 2/x: '-160 부터 60 사이의 무작위 수' 위치로 이동하기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][2].type",
"$[0][3].statements[0][2].params[0].params[0]"
],
"answer": ["wait_second", "2"],
"points": 2.43,
"desc": "문제 2/마법의 약/[반복]의 세부 동작 3/ '2' 초 기다리기",
"type": "list"
},
{
"ele": "$[0][3].statements[0][3].type",
"answer": "show",
"points": 2.43,
"desc": "문제 2/마법의 약/[반복]의 세부 동작 4/모양 보이기"
},
{
"ele": [
"$[0][3].statements[0][4].type",
"$[0][3].statements[0][4].params[0].params[0]"
],
"answer": ["wait_second", "0.5"],
"points": 2.43,
"desc": "문제 2/마법의 약/[반복]의 세부 동작 5/'0.5' 초 기다리기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][5].type",
"$[0][3].statements[0][5].params[0].type"
],
"answer": ["_if", "reach_something"],
"points": 2.43,
"desc": "문제 2/마법의 약/만일/만일 '새로운 약' 에 닿았는가? 라면",
"type": "list"
},
{
"ele": "$[0][3].statements[0][5].statements[0][0].params[0].params[0]",
"answer": "100",
"points": 2.43,
"desc": "문제 2/마법의 약/[만일]의 세부 동작 1/크기를 '100' 으로 정하기"
},
{
"ele": [
"$[0][3].statements[0][5].statements[0][1].type",
"$[0][3].statements[0][5].statements[0][1].params[0]",
"$[0][3].statements[0][5].statements[0][1].params[1].params[0]"
],
"answer": ["add_effect_amount", "color", "70"],
"points": 2.43,
"desc": "문제 2/마법의 약/[만일]의 세부 동작 2/'색깔' 효과를 '70' 만큼 주기",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][5].statements[0][2].type",
"$[0][3].statements[0][5].statements[0][2].params[0].params[0]",
"$[0][3].statements[0][5].statements[0][2].params[1]"
],
"answer": ["dialog", "마법 성공", "speak"],
"points": 2.43,
"desc": "문제 2/마법의 약/[만일]의 세부 동작 3/'마법 성공' 을 '말하기'",
"type": "list"
},
{
"ele": [
"$[0][3].statements[0][5].statements[0][3].type",
"$[0][3].statements[0][5].statements[0][3].params[0]"
],
"answer": ["stop_object", "all"],
"points": 2.43,
"desc": "문제 2/마법의 약/[만일]의 세부 동작 4/'모든' 코드 멈추기",
"type": "list"
}
]
}
}