diff --git a/01_copyFiles.py b/01_copyFiles.py index 7eeae4a..5cfff00 100644 --- a/01_copyFiles.py +++ b/01_copyFiles.py @@ -47,8 +47,8 @@ def copy_ent_files(source_root, target_root): # 사용법 -source_directory = r"D:\project\data\CAS_제2508회 정기\답안파일\(전체답안)1교시2교시나눔\B형" # 원본 디렉토리 경로 -target_directory = r".\ent\2508_CAS_2_B" +source_directory = r"D:\project\Entry\Entry-Scoring\시험자료\2509\A" # 원본 디렉토리 경로 +target_directory = r".\ent\2509_CAT_3_A" # target_directory_a = r"./output/A" # '1교시'의 타겟 경로 # target_directory_b = r"./output/B" # '2교시'의 타겟 경로 # target_directory_c = r"./output/C" # '3교시'의 타겟 경로 diff --git a/02_extract_project_json.py b/02_extract_project_json.py index 0c1223d..201daef 100644 --- a/02_extract_project_json.py +++ b/02_extract_project_json.py @@ -50,8 +50,8 @@ def process_ent_files(ent_dir, output_dir): # 실행 예 if __name__ == "__main__": - # test_names = ["2507_CAT_3_A"] - test_names = ["2508_CAS_2_A","2508_CAS_2_B"] + test_names = ["2509_CAT_3_A"] + # test_names = ["2508_CAS_2_A","2508_CAS_2_B"] for test_name in test_names: ent_dir = f".\\ent\\{test_name}" output_dir = f".\\output\\{test_name}" diff --git a/251001_2509_CAT_3_A_채점결과.xlsx b/251001_2509_CAT_3_A_채점결과.xlsx new file mode 100644 index 0000000..02d9307 Binary files /dev/null and b/251001_2509_CAT_3_A_채점결과.xlsx differ diff --git a/__pycache__/script_utils.cpython-312.pyc b/__pycache__/script_utils.cpython-312.pyc index db8f8e9..95cc78c 100644 Binary files a/__pycache__/script_utils.cpython-312.pyc and b/__pycache__/script_utils.cpython-312.pyc differ diff --git a/correct/2509_CAT_3_A.json b/correct/2509_CAT_3_A.json new file mode 100644 index 0000000..bcde020 --- /dev/null +++ b/correct/2509_CAT_3_A.json @@ -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 + } +} \ No newline at end of file diff --git a/logs/cat.log b/logs/cat.log index 66990b1..ba67d25 100644 --- a/logs/cat.log +++ b/logs/cat.log @@ -26,3 +26,11 @@ Traceback (most recent call last): 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' diff --git a/main.py b/main.py index 6cd3afb..1564411 100644 --- a/main.py +++ b/main.py @@ -234,8 +234,8 @@ def main(): timestamp = datetime.now().strftime("%y%m%d") test_mode = False # 테스트 모드 설정 # test_mode = True # 테스트 모드 설정 - exam_round = "2508" - exam_names = ["CAS_2_A", "CAS_2_B"] # 여러 시험명을 리스트로 설정 + exam_round = "2509" + exam_names = ["CAT_3_A"] # 여러 시험명을 리스트로 설정 excel_list = [] for exam_name in exam_names: @@ -276,7 +276,7 @@ def main(): for file in sorted(files): # 파일도 정렬 if file == 'project.json': full_path = os.path.join(root, file) - print(f"\nProcessing: {full_path}") + print(f"\n🟠 Processing: {full_path}") try: # 디렉토리 패스 내에 학생 이름만 뽑아서 엑셀 컬럼 명으로 추가 match = re.search(r'(\d{6}[-_][^\\/]+)[\\/]', full_path) diff --git a/script_utils.py b/script_utils.py index fb772c2..5c4e2b8 100644 --- a/script_utils.py +++ b/script_utils.py @@ -60,7 +60,7 @@ def read_json(file_path): def main(): # base_dir을 코드 내에서 직접 지정 - base_dir = r".\output\2508_CAS_2_B" # 원하는 최상위 디렉토리 경로로 수정하세요 + base_dir = r"D:\project\Entry\Entry-Scoring\output\2509_CAS_3_A" # 원하는 최상위 디렉토리 경로로 수정 # 하위 디렉토리 순회 for root, dirs, files in os.walk(base_dir): diff --git a/시험자료/2507/2507_CAT_3_A.json b/시험자료/2507/2507_CAT_3_A.json new file mode 100644 index 0000000..5c8df3c --- /dev/null +++ b/시험자료/2507/2507_CAT_3_A.json @@ -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" + } + ] + } +}